Linux SSH 密钥登录配置实战:从免密连接到防断线的安全进阶

一、为什么要把 SSH 换成密钥登录

只要是暴露公网的 Linux 服务器,SSH 几乎是必开的入口。很多人图省事一直用密码登录,结果日志里每天都是成百上千次暴力破解尝试。把认证方式从”密码”换成”密钥对”,相当于把门锁换成了只有你手里那把私钥才能开的锁——别人就算猜到密码也没用,因为服务器根本不再接受密码这一说。

本文以主流发行版(Ubuntu / Debian / CentOS / Rocky 等通用)为例,手把手讲清楚 Linux SSH 密钥登录配置 的完整流程,并顺带解决两个高频痛点:SSH 免密码登录设置后还是提示输入、以及 SSH 连接经常断线怎么办。整套做完,你会发现既更安全,又更省事。

二、生成密钥对:公钥放服务器,私钥留本机

在本机(你日常使用的电脑,可以是 Linux / macOS / Windows 的 WSL)执行:

ssh-keygen -t ed25519 -C "my-laptop"
# 老系统不支持 ed25519 时再用:
# ssh-keygen -t rsa -b 4096 -C "my-laptop"

一路回车即可,默认会生成 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)。私钥绝对不能外传,也不要设一个容易被猜到的空密码;公钥则可以放心丢到任何你想登录的服务器上。建议给私钥再加一层密码短语(passphrase),这样即使私钥文件泄露,对方也得再破一层。

2.1 一行命令把公钥推上去

最简单的方式是用 ssh-copy-id

ssh-copy-id user@服务器IP

它会自动把本地公钥追加到服务器对应用户的 ~/.ssh/authorized_keys 里,并帮你把权限设置对。如果你的发行版没有这个命令,也可以手动复制:

cat ~/.ssh/id_ed25519.pub | ssh user@服务器IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh"

三、SSH 免密码登录设置后还提示输入?先查这三处权限

配完密钥却发现每次还要输密码,九成是权限问题。服务器端必须满足:

  • ~/.ssh 目录权限为 700
  • ~/.ssh/authorized_keys 权限为 600
  • 家目录本身不能被其他用户写入(例如不能是 777)。

排查时加 -v 参数看详细信息:

ssh -v user@服务器IP

日志里若出现 Authentication refused: bad ownership or modes,就说明是上面权限不对。另外确认服务端配置 PubkeyAuthentication yes 且没被后面的 Match 块覆盖。还有一种情况是本机 ssh-agent 没加载私钥,执行 ssh-add ~/.ssh/id_ed25519 把私钥交给代理管理即可,免得每次都要指 -i

四、收紧配置:关密码、改端口、限用户

密钥能用之后,建议编辑 /etc/ssh/sshd_config 做几件 hardening:

PasswordAuthentication no      # 禁止密码登录
PermitRootLogin no             # 禁止 root 直接登录
Port 2222                      # 改掉默认 22,减少扫描噪音(记得先在防火墙放行新端口再重启)
AllowUsers deploy              # 只允许特定用户登录

改完务必先保留一个已登录的会话做验证,再执行 systemctl restart sshd,否则一旦配置写错把自己挡在门外就麻烦了。关于用 systemd 管理这类服务的完整排错流程,可以参考 用 systemd 管理开机启动服务:从 enable 到 journalctl 排错全流程,重启后若连不上,第一时间用 journalctl -u sshd 看报错。

五、SSH 连接经常断线怎么办:用心跳保活

很多人在家里或公司 NAT 后面连服务器,几分钟不动就被踢下线。这是中间网络设备把”空闲连接”回收了。解决方法是让连接定期发心跳包,两端都可以配:

客户端(本机 ~/.ssh/config):

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

服务端(/etc/ssh/sshd_config):

ClientAliveInterval 60
ClientAliveCountMax 3

这样每 60 秒互发一次保活包,连接就不会因为”长时间无数据”被掐断。如果你还遇到”连不上服务器”这类更上层的问题,建议先看 Linux 网络故障排查实战:从 ping 到 traceroute 一步步定位”连不上”,先确认是不是网络层本身就不通,再回来调 SSH。

六、不止登录:用 SSH 顺手把文件也传了

SSH 身份打通后,很多配套命令都能免密使用。传文件scprsync

scp ./app.tar.gz deploy@web:/opt/app/
rsync -avz ./site/ deploy@web:/var/www/site/

rsync 只同步差异部分,特别适合定期备份和发布。再配合前面配好的 Host web 别名,这些命令都能写得极短。远程执行单条命令也很方便:ssh web "df -h" 直接在本地拿到服务器磁盘用量,写进监控脚本毫无压力。

七、再叠一层:fail2ban 与防火墙

即便关了密码登录,SSH 端口仍会被扫描。可以再装 fail2ban,它读 /var/log/auth.log,发现连续失败就临时封 IP;同时用防火墙(ufwfirewalld)只放行新 SSH 端口。这样即便改了端口也别裸奔,多重防护更稳。

七·五、多密钥管理与密钥轮换

如果你要登录好多台机器,最好每台服务器用不同的密钥对,而不是一把私钥走天下——一旦某台机器的私钥泄露,影响面可控。在 ~/.ssh/config 里给不同主机指定不同 IdentityFile 即可:

Host web
    IdentityFile ~/.ssh/id_web
Host db
    IdentityFile ~/.ssh/id_db

换机器或同事离职时,记得做密钥轮换:先在新机器上追加新公钥、验证能登录,再把旧公钥从 authorized_keys 里删掉,全程不留空窗期。定期轮换是好习惯,比”一把密钥用三年”安全得多。

另外,改了端口或禁了密码后如果突然连不上,别慌:先在本机用 telnet 服务器IP 新端口nc -zv 服务器IP 新端口 确认端口确实通,再去看服务端 sshd 是否正常运行、防火墙是否放行。绝大多数”改完连不上”都是新端口忘了放行这一步。

八、进阶:别名、代理跳转与日常提效

每次敲一长串 ssh deploy@1.2.3.4 -p 2222 很累。在 ~/.ssh/config 里加个别名:

Host web
    HostName 1.2.3.4
    Port 2222
    User deploy
    IdentityFile ~/.ssh/id_ed25519

之后一句 ssh web 就登录了。多台跳板机还能用 ProxyJump。熟练这套之后,配合 Linux 命令行效率翻倍:10 个被低估却每天用得上的实用命令与技巧 里提到的别名与小工具,你会发现日常运维的重复动作被砍掉一大半。

九、小结

Linux SSH 密钥登录配置 并不复杂,核心就是”本地生成密钥对 → 公钥上传 authorized_keys → 收紧 sshd_config → 用心跳防断线 → 叠 fail2ban 加固”。它既能挡掉绝大多数自动化爆破,又让日常登录、传文件、远程执行都更顺手。把密码登录关掉的那一刻,你的服务器安全等级就上了一个台阶。

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容