iptables防“死亡之ping”核心是限速而非禁用icmp,需用-m limit或-m hashlimit按全局或源ip限制echo-request速率,配合accept/drop规则顺序执行,并放行type 3/11等必要icmp类型保障网络功能。

用iptables限流防“死亡之Ping”,核心不是堵死所有ICMP,而是让合法探测能过、恶意洪水被压住。关键在合理设速、分层匹配、顺序正确——配置得当,每秒几十万包也只触发几条规则,系统照常响应SSH和HTTP。
基础限速:用-m limit控全局速率
这是新手最该先配的一道防线。默认Linux不限ICMP频次,攻击者一发就是上万echo-request,直接打满CPU中断或耗尽连接跟踪表。
- 允许每秒最多5个ping请求,初始突发容许10个(兼顾运维连发5次ping的体验):
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/sec --limit-burst 10 -j ACCEPT - 所有未被上条放行的echo-request全部丢弃:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP - 两条规则顺序不能颠倒,否则DROP会提前生效,限速形同虚设
按源IP限速:防多IP协同攻击
-m limit是全局计数,100个IP各发1个/秒,总量就100个/秒,规则完全失效。要真正抗分布式ICMP Flood,必须按IP独立限速。
- 推荐用-m hashlimit,每个IP单独走令牌桶:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit 1/sec --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-name icmp_per_ip -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-above 1/sec --hashlimit-burst 3 --hashlimit-mode srcip --hashlimit-name icmp_per_ip -j DROP - --hashlimit-name必须唯一,内核靠它区分不同限速策略
- 测试时从不同IP分别ping,确认各自受限,互不影响
前置拦截 + 内核加固:减少协议栈开销
iptables filter链处理已进协议栈的包,但ICMP flood真正伤的是网络中断和软中断调度。越早拦,系统越轻松。
- 在raw表PREROUTING链拦截,比filter链早一个层级,不进conntrack也不占netfilter资源:
sudo iptables -t raw -A PREROUTING -p icmp --icmp-type echo-request -m hashlimit --hashlimit 1/sec --hashlimit-mode srcip -j DROP - 启用rp_filter=1,自动丢弃伪造源IP的ICMP包(如全0地址、非路由可达地址):
echo 'net.ipv4.conf.all.rp_filter = 1' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - 保持icmp_echo_ignore_all=0,禁Ping只会让系统不回包,但包仍进协议栈——反而更耗资源
放行必要ICMP类型,保基础功能
只拦echo-request,其他类型该放还得放。禁掉destination-unreachable(Type 3)或time-exceeded(Type 11),traceroute、MTU发现、路径优化全瘫痪。
- 明确放行关键类型(无需限速,它们本身不被用于flood):
sudo iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT - 可选:对重定向(Type 5)、路由器通告(Type 9)等高危类型直接DROP:
sudo iptables -A INPUT -p icmp --icmp-type 5 -j DROP - 避免用! --icmp-type echo-request笼统匹配,容易误伤










