Linux中iptables通过limit模块对ICMP echo请求(type 8)实施速率限制,每秒最多3个、突发5个,超出即DROP,以防范ping泛洪攻击,同时保障正常诊断功能。

Linux 使用 iptables 开启 ICMP 协议的流控防护,核心不是“开启 ICMP”,而是**限制 ICMP 流量速率,防止 ping 泛洪攻击**。ICMP 本身默认常被放行(比如允许 ping),但缺乏速率控制时易被滥用。iptables 提供 limit 模块实现流控,配合 INPUT 链对入向 ICMP 请求做限速。
明确目标:只允许合理频次的 ping 请求
典型策略是:每秒最多接受 3 个 ICMP echo 请求(type 8),突发允许最多 5 个;超出即丢弃。这样既不妨碍日常诊断,又能抵御简单 flood 攻击。
- 规则需作用于 INPUT 链(因为 ping 是发给本机的)
- 必须指定 -p icmp --icmp-type 8 精确匹配 echo 请求
- 使用 -m limit 加载限速模块,--limit 和 --limit-burst 控制速率
- 动作推荐用 DROP(静默丢弃),避免给攻击者反馈
添加流控规则的命令示例
执行以下命令即可生效(无需重启服务):
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 3/sec --limit-burst 5 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 8 -j DROP
说明:
- 第一行:在 INPUT 链最前插入一条规则,对符合速率条件的 echo 请求放行
- 第二行:在链尾追加拒绝规则,拦截所有未被上面放行的 echo 请求
- 注意顺序——
-I插入靠前位置,确保限速逻辑优先匹配
验证与调试方法
运行后可通过以下方式确认效果:
- 查看规则:
iptables -L INPUT -n -v | grep icmp,检查计数器是否增长 - 本地测试:
ping -c 10 127.0.0.1应全部通;ping -f 127.0.0.1(洪水模式)会明显丢包 - 日志辅助(可选):在 DROP 前加一条 LOG 规则,便于观察触发情况:
iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 1/min -j LOG --log-prefix "ICMP_DROP: "
进阶:按源 IP 区别限速
若需对特定网段宽松、其余严格,可分层设置:
- 先放行可信网段(如内网):
iptables -I INPUT -p icmp --icmp-type 8 -s 192.168.1.0/24 -j ACCEPT - 再对其他来源启用限速(同上两行),确保规则位置在放行之后、全局 DROP 之前
- 注意:iptables 规则按顺序匹配,**先匹配的优先生效**


















