核心是控频、封源、持久化:用iptables/nftables对new状态ssh连接限速(如3/分钟),结合日志分析自动封禁恶意ip,再持久化规则并关闭密码登录、禁用root直连等ssh自身加固。

直接用防火墙限制 SSH 暴力尝试,核心是“控频 + 封源 + 持久化”,不是简单加一条 DROP 规则就能奏效。重点在于让防火墙能识别异常行为,并自动响应。
用 iptables/nftables 设置连接频率限制
这是最基础也最关键的一步,不依赖日志解析,靠内核 netfilter 实时拦截:
- 对新连接(--syn)做每分钟限速:比如允许每个 IP 每 60 秒最多发起 3 次新 SSH 连接(端口 22 或自定义端口),超限即 DROP
- 命令示例(iptables):
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/minute --limit-burst 3 -j ACCEPTiptables -A INPUT -p tcp --dport 22 -m state --state NEW -j DROP - nftables 写法更简洁:
nft add rule ip filter input tcp dport 22 ct state new limit rate 3/minute burst 3 packets acceptnft add rule ip filter input tcp dport 22 ct state new drop - 注意:limit 模块只对 NEW 状态生效,不影响已建立的合法会话;burst 值设太小易误伤,设太大则失去防护意义
结合日志动态封禁恶意 IP
仅靠限速不能应对慢速、分布式或已绕过限速的攻击,需配合日志分析实现精准封禁:
- 从
/var/log/auth.log或/var/log/secure提取连续失败登录的 IP(如 10 分钟内失败 ≥5 次) - 用脚本自动执行
iptables -I INPUT -s IP -j DROP或nft add rule ip filter input ip saddr IP drop - 封禁后记录到本地文件(如
/etc/iptables/banned_ips),避免重复添加 - 建议搭配定时任务(如每 5 分钟运行一次),但不要过于频繁,防止 I/O 和规则膨胀
确保规则持久化且不被覆盖
重启后规则消失等于没设,尤其在使用 firewalld 或 systemd-networkd 的系统上容易冲突:
- iptables 用户:执行
iptables-save > /etc/sysconfig/iptables(CentOS/RHEL)或iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu) - nftables 用户:将规则写入
/etc/nftables.conf并启用服务:systemctl enable --now nftables - 若系统启用了 firewalld,先停用:
systemctl disable --now firewalld,否则两者规则会互相干扰 - 检查 SELinux 是否影响:如修改了非标端口,需用
semanage port -a -t ssh_port_t -p tcp 2222授权
配合 SSH 服务本身做减法
防火墙是外层屏障,SSH 配置才是根本防线,二者必须协同:
- 关闭密码登录:
PasswordAuthentication no,强制密钥认证——暴力破解立刻失效 - 禁用 root 直接登录:
PermitRootLogin no,并确认AllowUsers只列出必要账户 - 缩短登录宽限期:
LoginGraceTime 30s,减少攻击窗口 - 限制最大认证尝试次数:
MaxAuthTries 2,配合防火墙限速形成双重卡点











