公网上的 SSH 端口每天会收到成百上千次登录尝试。这篇记录从「日志被刷屏」到「安静下来」的完整过程。
先看清现状
# 统计失败登录的来源 IP,取前 10
grep 'Failed password' /var/log/auth.log \
| awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10如果输出里出现成片的境外 IP,说明已经在被扫了。这很正常,但放任不管有两个坏处:日志被淹没,真正的问题看不见;以及始终存在被撞库成功的风险。
三层防护
第一层:关掉密码登录
这是收益最大的一步。改成只用密钥:
# 本地生成密钥(如果还没有)
ssh-keygen -t ed25519 -C "it365"
# 上传公钥
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@155.94.133.42确认能用密钥登录后,再改服务端配置:
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3改完先 sshd -t 检查语法,再 systemctl reload sshd。千万不要关掉当前会话,另开一个窗口验证新连接可用后再退出。
第二层:fail2ban 自动封禁
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
[sshd]
enabled = true
port = ssh启动并观察:
systemctl enable --now fail2ban
fail2ban-client status sshd输出的 Banned IP list 会随着爆破自动增长。一小时后就基本清零了。
第三层:换个非常规端口
把 22 改成别的端口,能过滤掉绝大多数自动化扫描。这属于「降低噪声」而非真正的安全措施,真正的边界仍在密钥认证上。
一个常见疑问
被封的 IP 会不会误伤自己? 会。如果不小心输错五次密码就会被自己的服务器挡住。解决办法是把常用出口 IP 加进白名单:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.10或者临时解封:
fail2ban-client set sshd unbanip 203.0.113.10小结
顺序很重要:先密钥、再 fail2ban、最后换端口。反过来做,换端口只会让你自己更麻烦,而真正的风险一点没少。