直接拦截高危icmp类型是防御反射攻击的关键:需丢弃type 13/14/17/18,放行type 3/11/12(仅established/related),并对type 8做hashlimit限速。

直接拦截特定 ICMP 类型是防御反射攻击的关键一步。ICMP 反射攻击(如 Smurf、Fraggle 或某些基于 timestamp、address-mask 的变种)依赖于服务器响应特定类型的请求,从而被放大并打向受害者。iptables 不能阻止所有 ICMP,但可以精准丢弃那些易被滥用的类型,同时保留必要的网络诊断功能。
识别并丢弃高风险 ICMP 类型
以下类型在真实攻击中常被利用,应优先拦截:
- ICMP timestamp 请求(type 13)和回复(type 14):攻击者可伪造源 IP 发送 timestamp 请求,诱使目标向受害者回传时间戳数据,形成反射放大
- ICMP address-mask 请求(type 17)和回复(type 18):已过时且极少用于现代网络,但仍是经典反射载体
- ICMP echo-request(type 8)本身不反射,但若开放且未限速,可能被用于“Ping flood”或配合其他协议构成混合攻击
执行命令示例:
iptables -A INPUT -p icmp --icmp-type 13 -j DROP iptables -A INPUT -p icmp --icmp-type 14 -j DROP iptables -A INPUT -p icmp --icmp-type 17 -j DROP iptables -A INPUT -p icmp --icmp-type 18 -j DROP
允许必要 ICMP 类型保障基础连通性
完全屏蔽 ICMP 会破坏路径 MTU 发现、路由错误通知等机制,反而引发连接异常。必须显式放行以下类型:
- Destination Unreachable(type 3):告知发送方目标不可达,对 TCP 连接终止、分片处理至关重要
- 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 iptables -A INPUT -p icmp --icmp-type 11 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p icmp --icmp-type 12 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
对 echo-request 做速率限制而非全禁
echo-request(ping)虽不反射,但高频请求会消耗 CPU 和带宽。建议用 limit 模块控制,避免影响运维排查:
- 每秒最多 1 个新请求,突发允许 3 个(初始探测友好)
- 超出部分直接丢弃,不记录日志以防日志爆炸
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/sec --limit-burst 3 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 8 -j DROP
按源 IP 哈希限速增强抗多源攻击能力
当攻击来自大量不同 IP(如僵尸网络)时,全局限速效果有限。改用 hashlimit 按 srcip 独立限速更有效:
- 每个源 IP 每秒最多 2 个 echo-request
- 令牌桶大小为 5,防止短暂误判
- 哈希表条目 30 秒后自动清理,减少内存占用
iptables -A INPUT -p icmp --icmp-type 8 -m hashlimit \ --hashlimit-above 2/sec \ --hashlimit-burst 5 \ --hashlimit-mode srcip \ --hashlimit-name icmp_ping_per_ip \ -j DROP iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
规则顺序很重要:先放行必要类型,再限速 echo-request,最后拦截高危类型。实际部署前务必测试,避免误阻断关键网络行为。










