iptables对特定网段限流需结合limit或hashlimit模块实现动态节流,核心是按源网段统计、设置速率参数(如--limit 30/min或--hashlimit-above 10/min)、配burst值容忍突发,并以accept+drop规则闭环,避免粗暴封禁。

直接用 iptables 对特定网段限流,核心是“按源网段统计 + 速率控制 + 规则闭环”,不能只靠 -s 网段 加 -j DROP 粗暴封禁,而要结合 limit 或 hashlimit 模块做动态节流。关键在匹配粒度、速率参数和规则顺序。
明确目标网段与协议端口
先确认你要限流的网段(如 192.168.5.0/24)和对应服务:
- 只限某端口(如 Web):加
-p tcp --dport 80 - 限所有 TCP 流量:用
-p tcp,不指定--dport - 限全部协议(含 ICMP):去掉
-p或写-p all,但需谨慎,避免误伤管理通道 - 务必作用于
INPUT链(入站),除非你是在网关设备上做转发限流
用 limit 模块做平滑包速率限制
适合防轻量刷量、日志洪泛等场景,效果是“匀速放行”,不是硬拦截:
- 命令示例(每分钟最多允许该网段发 30 个包到 80 端口):
iptables -A INPUT -s 192.168.5.0/24 -p tcp --dport 80 -m limit --limit 30/min --limit-burst 5 -j ACCEPT - 紧接一条无条件丢弃规则:
iptables -A INPUT -s 192.168.5.0/24 -p tcp --dport 80 -j DROP -
--limit-burst 5表示初始可连续通过 5 个包;--limit 30/min是长期平均上限,即约每 2 秒放 1 个 - 若想限所有 TCP 连接新建请求,加上
-m state --state NEW,避免把已建立连接的 ACK 包也计数
用 hashlimit 模块做更精细的连接频控
比 limit 更适合防扫描或暴力尝试,支持按 IP 或按连接维度独立计数:
- 按整个网段统一限速(所有 IP 共享配额):
iptables -A INPUT -s 192.168.5.0/24 -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-above 10/min --hashlimit-burst 20 --hashlimit-mode srcip --hashlimit-name ssh_net --hashlimit-htable-expire 300000 -j DROP - 若希望每个 IP 独立限速(更公平),保持
--hashlimit-mode srcip即可;若想按目标端口区分(如同一 IP 访问 80 和 443 不互相影响),改用--hashlimit-mode srcip,dstport -
--hashlimit-above是触发限流的阈值,--hashlimit-burst是允许的突发上限,--hashlimit-htable-expire控制哈希表项存活时间(毫秒)
配套操作与验证要点
规则生效后必须验证是否真起作用,不能只看规则存在:
- 用
iptables -vnL INPUT --line-numbers查看命中计数(pkts列),确认流量正被规则匹配 - 临时测试可用
watch -n1 'iptables -vnL INPUT | grep 192.168.5'实时观察计数变化 - 备份规则:执行
iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或service iptables save(CentOS) - 若限流后业务异常,优先检查是否漏加白名单(如运维网段),或
--limit-burst设置过小导致首屏卡顿










