核心是用firewalld富规则或iptables hashlimit按源ip限新建连接速率:firewalld执行sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="x.x.x.x" service name="ssh" limit value="3/m" accept'并重载;iptables则用-m hashlimit --hashlimit-mode srcip --hashlimit-above 5/min配合drop。

要限制 SSH 端口(默认 22)上单个 IP 的连接频率,核心目标是:防止暴力破解、控制新建连接速率(如每秒/每分钟最多 N 次)。这不是简单“封禁”或“只放行”,而是带状态的速率控制。关键点在于:必须区分“并发连接数”和“新建连接速率” —— 前者用 connlimit,后者才真正防爆破,需用 limit 或 hashlimit(iptables)或 rich rule + limit(firewalld)。
? firewalld:推荐首选(清晰、持久、语义明确)
适用于 RHEL/CentOS 8+、Fedora、Rocky/AlmaLinux 等现代发行版。
-
限制某 IP 每分钟最多 3 次新 SSH 连接,并记录日志:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.45" service name="ssh" limit value="3/m" log prefix="ssh-rate-" accept' sudo firewall-cmd --reload
-
value="3/m"表示每分钟最多 3 个 新连接(SYN 包),超限直接丢弃(不返回 RST) -
log prefix="ssh-rate-"会写入 journal 日志,可用journalctl -u firewalld | grep "ssh-rate"查看触发情况 - 必须加
--permanent+--reload,否则重启后失效
-
-
限制所有来源 IP 每秒最多 2 个新 SSH 连接(全局防护):
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" limit value="2/s" accept' sudo firewall-cmd --reload
⚠️ 注意:
limit是令牌桶算法,不绑定源 IP;若要按 IP 分别限速(更精准),必须配合source address使用,否则只是整体限速。
? iptables:兼容老系统,但语法易错
适用于 CentOS 7、Debian 10 及更旧环境。注意:-m limit 本身不识别源 IP,需搭配 -m hashlimit 才能实现“每 IP 限速”。
-
按源 IP 限速(推荐):每 IP 每分钟最多 5 个新 SSH 连接
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit \ --hashlimit-above 5/min \ --hashlimit-burst 5 \ --hashlimit-mode srcip \ --hashlimit-name ssh_per_ip \ -j DROP
-
--hashlimit-mode srcip:按源 IP 统计 -
--hashlimit-above 5/min:超过即触发 -
--hashlimit-burst 5:允许短时突发(避免误杀合法重试) -
--hashlimit-name:命名规则,避免冲突 - 规则插入 INPUT 链顶部(
-I),确保在 ESTABLISHED 规则之前生效
-
-
❌ 错误示范(常见陷阱):
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/sec -j ACCEPT
这条只限制 规则匹配速率,不是按 IP 的连接速率,攻击者多 IP 轮询就完全失效。
? 补充防线:SSH 层白名单(最优先拦截)
防火墙是第二道门,SSH 配置才是第一道。修改 /etc/ssh/sshd_config:
AllowUsers admin@203.0.113.45 root@192.168.10.0/24
- 仅允许指定用户从指定 IP 登录,其余一律拒绝(认证前拦截)
- 修改后执行
sudo systemctl restart sshd - ⚠️ 务必保留一个备用访问方式(如控制台/VNC),避免锁死
✅ 三者关系:
sshd_config白名单 > firewalld rich rule > iptables hashlimit。建议组合使用,层层设防。
? 验证与排查要点
查看已加载的富规则:
sudo firewall-cmd --list-rich-rules(运行时)sudo firewall-cmd --permanent --list-rich-rules(持久化配置)iptables 规则计数:
sudo iptables -L INPUT -v -n | grep :22日志追踪(firewalld):
sudo journalctl -u firewalld -f | grep ssh-rate测试工具(本地模拟):
for i in {1..10}; do ssh -o ConnectTimeout=1 -o BatchMode=yes user@server exit 2>/dev/null & done
不复杂但容易忽略











