Firewalld本身不直接限制单个IP并发连接数,但可通过rich rule限速(如每秒5个新连接)或--direct调用iptables connlimit模块实现真并发限制(如每IP最多20个ESTABLISHED连接)。

Firewalld 本身不直接提供“限制单个 IP 并发连接数”的原生指令(比如像 iptables 的 connlimit 模块那样实时统计 ESTABLISHED 连接),但它可以通过两种实用方式间接实现类似效果:一是用 rich rule 结合连接速率限制(limit),二是配合底层 iptables 规则或脚本化手段做更精确的并发控制。
用 rich rule 限制新建连接频率
这是 Firewalld 原生支持、最常用的方式,适用于防暴力扫描或短时连接洪泛(如每秒大量 SYN):
- 对 HTTP 端口(80)限制每个 IP 每秒最多 5 个新连接:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" limit value="5/s" accept' - 超过速率即拒绝(可加
reject或drop):firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" port port="80" protocol="tcp" limit value="10/s" reject' - 注意:
limit统计的是“匹配该规则的新数据包速率”,不是并发连接数;它适合防突发流量,但无法阻止一个 IP 保持 100 个长连接。
用 direct rules 调用 iptables connlimit(推荐用于真并发限制)
Firewalld 允许通过 --direct 插入原始 iptables 规则,从而复用内核级的 connlimit 模块,这才是真正限制“同一 IP 当前 ESTABLISHED 连接数”的方法:
- 限制每个 IP 对 80 端口最多 20 个并发连接(含半开 SYN_RECV):
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT --reject-with tcp-reset - 只限制新连接(避免误伤已有连接),加上
--syn:firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j REJECT - 执行后必须重载:
firewall-cmd --reload - 验证是否生效:
iptables -t filter -L INPUT -n | grep connlimit
补充说明:为什么不能只靠 firewalld 原生命令?
Firewalld 的 rich rule 设计侧重于访问控制和简单限速,不维护连接状态跟踪表。而真正的“并发连接数”依赖内核 nf_conntrack 子系统,只有 iptables 的 connlimit 模块能直接读取该状态。所以生产环境若需防资源耗尽(如某 IP 占满服务端文件描述符),必须走 direct rules 方式。
检查与排错要点
- 确保
nf_conntrack已加载:lsmod | grep nf_conntrack,未加载可运行modprobe nf_conntrack - 确认
nf_conntrack_max足够大(默认常为 65536):sysctl net.netfilter.nf_conntrack_max,太小会导致连接被丢弃而非受限 - IPv4 和 IPv6 分开限制,
connlimit默认只处理 IPv4;如需 IPv6,需额外添加-p ipv6及对应规则 - 规则顺序很重要:direct rule 的优先级由插入序号(如上面的
0)决定,数字越小越先匹配


















