核心是分层防御:禁重定向防劫持(内核参数设accept_redirects/send_redirects=0)、控ping降暴露(sysctl+iptables raw表拦截)、限速放行必要icmp类型(hashlimit+icmp-type 3/11),并补rp_filter、accept_source_route等加固项。

新手配置Linux网络栈防御ICMP攻击,核心不是“全关”,而是分清目标:防探测、防劫持、防洪泛,每类用不同层级的参数或规则。关键在于理解参数作用位置——有些在内核协议栈深处(如accept_redirects),有些在防火墙链路早期(如iptables -t raw),有些只影响响应逻辑(如icmp_echo_ignore_all)。配错顺序或混用层级,反而可能失效或伤及运维。
先关重定向,防路由劫持
非网关服务器(如Web、数据库)绝不能收发ICMP重定向报文,否则可能被恶意网关篡改路由表,导致流量被劫持。这必须从内核参数禁用,防火墙拦不住:
- 编辑
/etc/sysctl.conf,添加四行(缺一不可):net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.default.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.default.send_redirects = 0 - 执行
sudo sysctl -p立即生效,并自动在重启后保持 - 验证命令:
sysctl net.ipv4.conf.all.accept_redirects,返回0即成功
再控Ping,降低暴露面但不硬扛洪水
禁Ping主要防扫描识别,不是抗攻击。单设icmp_echo_ignore_all = 1只能让系统不回包,但海量ICMP请求仍会吃CPU和带宽。所以要搭配防火墙提前拦截:
- 永久禁响应(适合多数后台服务):
在/etc/sysctl.conf加net.ipv4.icmp_echo_ignore_all = 1,再sysctl -p - 更稳妥的拦截(推荐):
用iptables在raw表丢弃,比filter链更早生效:sudo iptables -t raw -A PREROUTING -p icmp --icmp-type 8 -j DROP - 若需留管理通道(如允许内网ping):
加接口限制:sudo iptables -A INPUT -i eth0 -p icmp --icmp-type 8 -j DROP(仅封外网口)
加限速与过滤,应对真实ICMP洪泛
单纯禁止Echo Request对DDoS级ICMP flood无效。应限制速率并放行必要类型(如目的不可达、超时),保障基础连通性:
- 每秒最多允许5个Ping请求(防扫又保可用):
sudo iptables -A INPUT -p icmp --icmp-type 8 -m hashlimit --hashlimit-above 5/sec --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name icmp_limit -j DROP - 必须放行的ICMP类型(否则影响MTU发现、traceroute等):
sudo iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT(destination-unreachable)sudo iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT(time-exceeded) - 保存规则(Ubuntu/Debian):
sudo iptables-save > /etc/iptables/rules.v4
补上内核防护细节,堵住冷门漏洞
几个常被忽略但有效的加固项,写入/etc/sysctl.conf一并启用:
-
net.ipv4.conf.all.rp_filter = 1:开启反向路径过滤,防IP欺骗 -
net.ipv4.conf.all.accept_source_route = 0:禁用源路由,防绕过防火墙 -
net.ipv4.icmp_ignore_bogus_error_responses = 1:忽略伪造的ICMP错误响应,防部分DoS变种 - 全部加完后统一执行
sudo sysctl -p











