安全与防护

公网上的 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、最后换端口。反过来做,换端口只会让你自己更麻烦,而真正的风险一点没少。

参与讨论