一台放在公网上的 VPS,SSH 端口每天被扫几百上千次是常态。日志里一屏一屏的 Failed password for root 看着吓人,但只要密码够复杂、或者干脆只用密钥登录,其实不会真被攻破。问题在于这些尝试会消耗 CPU、写满日志、把 /var/mail 撑爆。
先确认现状
grep "Failed password" /var/log/auth.log | wc -l
fail2ban-client status
第二条命令会列出当前所有 jail。宝塔面板通常会自带 f2b-sshd 和针对网站的 f2b-站点名-cc,如果没装,用 apt install fail2ban 装一个。
关键配置在 jail.local
不要直接改 jail.conf,升级时会被覆盖。新建 /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
port = 你的SSH端口
logpath = /var/log/auth.log
maxretry = 3
bantime = 24h
findtime 是统计窗口,maxretry 是窗口内允许的失败次数,bantime 是封禁时长。三个参数是一组的:窗口太短抓不到慢速爆破,窗口太长容易误伤自己输错密码。
一个真实的坑
如果你把 SSH 端口改成了非 22,port 一定要写对。写错了 fail2ban 依然会封 IP,但封的是 22 端口上的连接,等于白封,而真正的爆破端口毫发无伤。
另一个坑是"封禁后自己也进不去"。测试时不要用自己的常用 IP 反复试密码。可以先加白名单:
[DEFAULT]
ignoreip = 127.0.0.1/8 你的固定IP
顺便处理邮件堆积
fail2ban 默认每次封禁会给 root 发一封信。两年下来 /var/mail/root 能长到接近 2G。要么改 action 不发邮件,要么给它加日志轮转:
/var/mail/root {
size 100M
rotate 1
compress
copytruncate
missingok
notifempty
}
最后一条建议:能用密钥登录就别开密码登录。PasswordAuthentication no 一设,爆破日志会直接归零,比任何封禁策略都彻底。当然改之前先确认密钥能正常登录,否则会把自己锁在门外。




还没有评论,来说两句吧...