禁用icmp重定向需同时配置accept_redirects=0和send_redirects=0(ipv4/ipv6的all与default),并补全secure_redirects=0、accept_source_route=0、rp_filter=1,否则攻击者可伪造重定向劫持流量。

为什么不能只拦 echo-request 就算完
禁 ping 和防恶意 ICMP 错误信息是两回事。前者针对 echo-request(类型 8),后者涉及重定向(type 5)、源抑制(type 4)、参数问题(type 12)等——这些错误类报文可能被用于路由劫持、拓扑探测甚至绕过防火墙策略。内核默认会处理并响应部分 ICMP 错误,尤其是当 ip_forward=1 或网络配置松散时,accept_redirects 这类参数一旦开启,攻击者就能伪造网关发重定向包,诱使你的服务器把流量转向恶意节点。
net.ipv4.conf.*.accept_redirects = 0 必须设全
只设 all 不够,default 也得关,否则新起的网卡(比如容器热插拔、DHCP 获取的接口)会继承默认值而漏掉防护:
-
net.ipv4.conf.all.accept_redirects = 0:覆盖所有已有接口 -
net.ipv4.conf.default.accept_redirects = 0:确保后续新建接口也生效 - IPv6 同理:加上
net.ipv6.conf.all.accept_redirects = 0和net.ipv6.conf.default.accept_redirects = 0 - 别忘了
send_redirects = 0—— 即使你不转发,万一某天开了ip_forward,它就自动变成跳板
写进 /etc/sysctl.d/99-secure.conf,再跑 sudo sysctl -p /etc/sysctl.d/99-secure.conf。验证用:sysctl -a | grep accept_redirects,输出每行末尾都得是 = 0。
配套参数不补全,等于白设
攻击者常组合利用 ICMP 机制。光关 accept_redirects 不行,下面三个必须同步配齐:
-
net.ipv4.conf.all.secure_redirects = 0:这个“安全重定向”校验早已过时,且可被绕过,显式关掉更干净 -
net.ipv4.conf.all.accept_source_route = 0:禁用源路由选项,防止攻击者指定报文路径、绕过 ACL 或 NAT -
net.ipv4.conf.all.rp_filter = 1:启用反向路径过滤,自动丢弃源 IP 不属于入接口网段的包(防 IP 欺骗的基础)
注意:rp_filter = 1 是唯一应为 = 1 的项;其余全是 = 0。验证命令:sysctl -a | grep -E 'redirects|source_route|rp_filter' | grep =,眼扫一遍结尾数字就行。
别信 iptables/nftables 能拦住所有恶意 ICMP 错误
防火墙规则(如 iptables -A INPUT -p icmp --icmp-type redirect -j DROP)只在 netfilter 层生效,但像重定向这类报文,内核在网络栈早期就会解析并触发路由表更新——它根本没走到 iptables。所以:
- 优先用
sysctl关内核参数,这是源头控制 - 防火墙可作为补充(比如封特定 type),但不能替代内核级防护
- 若用
firewalld,firewall-cmd --add-icmp-block=redirect只影响本机发出的响应,不防接收,别误以为它能替代accept_redirects = 0
最后提醒:改完务必用 ip route get 8.8.8.8 确认出向路由没被意外清空,尤其在云主机或容器环境里,某些网络插件会动态覆盖 rp_filter 或重定向设置。











