iptables防御ICMP探测的核心是分层控制:优先用raw表PREROUTING链拦截外网echo-request,INPUT链按源IP限速(3/sec+burst 6),放行type 3/11/12等必要类型,封禁type 13/14/17/18等高危类型,并启用rp_filter等内核参数加固。

iptables 防御 ICMP 探测,核心不是“关 Ping”,而是分层控制:在包进入协议栈前拦截、按源限速、放行必要类型、封禁高危行为。盲目全禁 ICMP 会破坏 traceroute、MTU 发现和 TCP 异常终止通知,反而引发静默故障。
优先用 raw 表提前过滤
ICMP 洪水攻击靠海量包压垮 CPU 软中断。filter 表的 INPUT 链处理太晚,开销大。应在更早的 raw 表 PREROUTING 链直接丢弃外网口的 echo-request:
- sudo iptables -t raw -A PREROUTING -i eth0 -p icmp --icmp-type 8 -j DROP
- 若用 nftables(推荐新系统):nft add rule ip filter prerouting iifname "eth0" ip protocol icmp icmp type echo-request drop
- 这条规则不经过连接跟踪、日志或路由查找,显著降低内核负载
只允许指定 IP 发起 ping
运维跳板机或监控系统需 ping 排障,其他来源一律拒绝。关键是规则顺序必须严格:
- 先插入白名单:iptables -I INPUT -p icmp --icmp-type echo-request -s 192.168.1.50 -j ACCEPT
- 紧接着插入兜底拒绝:iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
- 必须用 -I 插入链首,不能用 -A 追加,否则可能被后续宽松规则覆盖
- echo-request 比数字 8 更可读,也兼容不同内核版本
放行三类必要 ICMP 类型
完全屏蔽 ICMP 会导致路径不可达无法通知、traceroute 失效、TCP 连接卡死。以下类型必须显式放行,且建议加状态匹配,只响应已有连接:
- Destination Unreachable(type 3):告知发送方目标不可达,影响分片重试与连接终止
- Time Exceeded(type 11):支持 traceroute 和 TTL 超时反馈,是网络诊断基础
- Parameter Problem(type 12):报告 IP 头部异常,辅助快速排错
- 命令示例:iptables -A INPUT -p icmp --icmp-type 3 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
封禁易被滥用的高危 ICMP 类型
这些类型现代网络基本无正当用途,却是 Smurf、timestamp flood 等反射攻击的载体:
- Timestamp 请求(type 13)和回复(type 14):伪造源 IP 触发响应放大
- Address-mask 请求(type 17)和回复(type 18):已过时协议,纯属攻击工具
- 执行命令:iptables -A INPUT -p icmp --icmp-type 13 -j DROP(依次替换为 14/17/18)
- 不建议放行重定向(type 5)、信息请求(type 15/16)等非必需类型
对 echo-request 做源 IP 限速
即使白名单未覆盖,也要防单个恶意 IP 持续发包。用 hashlimit 模块按源限速,避免一个攻击者占满全部配额:
- 每秒最多 3 个请求,突发允许 6 个:iptables -A INPUT -p icmp --icmp-type 8 -m hashlimit --hashlimit-above 3/sec --hashlimit-burst 6 --hashlimit-mode srcip --hashlimit-name icmp_limit -j ACCEPT
- 紧接兜底规则:iptables -A INPUT -p icmp --icmp-type 8 -j DROP
- --hashlimit-mode srcip 是关键,确保限制作用于每个源 IP,而非全局
配合 length 模块识别畸形探测包
部分扫描工具(如定制 nmap 脚本)发送固定长度或超长 ICMP 包绕过常规检测:
- 拒绝固定 32 字节的 ICMP 包(某些隐蔽探测特征):iptables -A INPUT -p icmp -m length --length 32 -j DROP
- 记录并分析超长 ICMPv4 请求(>1500 字节):iptables -I INPUT -p icmp -m length --length 1501: -j LOG --log-prefix "ICMP-LONG: "
- 可组合条件,例如加 -i eth0 限定外网接口,或配合 --icmp-type echo-request 避免误伤
启用内核参数加固底层行为
iptables 管“怎么处理包”,内核参数管“系统怎么响应”。二者配合才能堵住伪造和劫持路径:
- 开启反向路径过滤:echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
- 禁用 ICMP 重定向响应:echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
- 禁用广播 ping 响应:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
- 这些设置写入 /etc/sysctl.conf 并运行 sysctl -p 持久化

















