真正有效的策略是分层拦截:改端口+限ip从网络层过滤90%以上自动化扫描,禁密码+锁root消除最易爆破入口,maxauthtries和logingracetime压缩单连接试探窗口,fail2ban基于日志动态封禁持续攻击ip。

防范大规模账号暴力扫描,不能只靠“试几次就拉黑”这种表面限制。真正有效的策略是分层拦截:在连接建立前筛掉大部分流量,在认证环节卡住弱口令尝试,再用动态封禁阻断持续攻击。关键不是堆参数,而是让攻击者连有效请求都发不出几个。
改端口+限IP,从网络层过滤无效扫描
90%以上的自动化暴力扫描只扫22端口,且不带源IP过滤。先切断它们的入口:
- 编辑 /etc/ssh/sshd_config,把
Port改成非标准端口(如2222或57842),保存后运行sudo systemctl restart sshd - 配合防火墙做白名单:若管理IP固定,用
ufw或iptables只放行可信段,例如:ufw allow from 203.123.45.0/24 to any port 2222 - 避免开放全网访问,哪怕加了fail2ban,高频扫描本身就会消耗连接资源和日志IO
禁密码+锁root,消除最易爆破的入口
暴力扫描本质是穷举账号密码组合。只要关闭这两个通道,绝大多数工具直接失效:
- 在 sshd_config 中设:
PasswordAuthentication no、PermitRootLogin no、PubkeyAuthentication yes - 确保普通管理用户已配置好
~/.ssh/authorized_keys,测试密钥登录成功后再重启服务 - 不要留着
admin、test、oracle这类常见用户名——日志显示这些是扫描器第一波目标
连接级限次 + 登录窗口压缩
这是SSH服务自身最轻量的防护,防的是单连接内反复试探:
- 设置
MaxAuthTries 2:单次连接最多2次认证失败,输错两次立刻断连 - 设置
LoginGraceTime 45:从TCP握手完成起,只有45秒用于完成登录,超时即关连接 - 注意:该限制不跨连接,必须和fail2ban配合使用才形成闭环
fail2ban 实时封IP,应对持续性扫描
它才是真正对抗大规模扫描的核心组件,靠解析日志识别异常行为:
- 安装后复制配置:
sudo cp /etc/fail2ban/jail.{conf,local} - 编辑 /etc/fail2ban/jail.local,确保
[sshd]段含:maxretry = 3、findtime = 600(10分钟)、bantime = 3600(封1小时) - 启动并设开机自启:
sudo systemctl enable --now fail2ban - 验证是否生效:
sudo fail2ban-client status sshd,查看当前封禁列表
不复杂但容易忽略:所有配置改完后,务必用另一台机器测试登录,确认密钥能通、错误密码被拒、新IP被封,再关掉旧连接。否则可能把自己锁在外面。











