必须同时设为0,因default控制新建接口(如容器网卡)默认值,all控制现有接口立即生效,缺一将导致新旧网卡均可能接收重定向报文;还需同步关闭secure_redirects、accept_source_route并启用rp_filter构成纵深防御。

必须设为 0,不能只改 default 或漏掉 all —— 否则新网卡或容器网络仍可能接收重定向报文,导致路由被篡改。
为什么只改 net.ipv4.conf.all.accept_redirects 还不够
内核对网络接口的参数继承有两层:default(新创建接口的默认值)和 all(当前所有接口立即生效)。只设 default 不影响已存在的 eth0、docker0 等接口;只设 all 则下次新增网卡(比如 k8s 创建 pod 网络)会沿用旧的默认值(通常是 1)。两者必须同时设为 0 才能覆盖全量场景。
-
net.ipv4.conf.all.accept_redirects = 0:让所有已有接口立刻停止接收 ICMP 重定向 -
net.ipv4.conf.default.accept_redirects = 0:确保后续新建接口(包括容器、虚拟网卡)默认关闭该功能 - IPv6 同理,
net.ipv6.conf.all.accept_redirects和net.ipv6.conf.default.accept_redirects也必须显式设为 0
配置文件位置与写法细节
推荐写入 /etc/sysctl.d/99-secure.conf(优先级高、语义清晰、不污染主配置),而非直接改 /etc/sysctl.conf。内容如下:
net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0
注意:= 两侧必须有空格,行尾不能有多余空格或注释(sysctl 解析器对格式敏感);不要写成 accept_redirects=0(缺少前缀会忽略)。
生效与验证时容易忽略的点
执行 sudo sysctl -p /etc/sysctl.d/99-secure.conf 后,仅表示参数已加载进内核,不代表业务路由没被破坏。务必验证两件事:
- 检查是否真为 0:
sysctl -a | grep 'accept_redirects' | grep =\ 0—— 若输出为空,说明某一项仍是 1 - 确认业务连通性:
ip route get 8.8.8.8应返回正常路径(如 via 192.168.1.1 dev eth0),而不是 unreachable 或 unexpected interface - 别忘了 flush 路由缓存:
sysctl -w net.ipv4.route.flush=1,否则旧重定向带来的错误路由条目可能残留
配套参数不补全等于白设
攻击者常组合利用多个 IP 层机制绕过单一防护。accept_redirects = 0 单独存在时,仍可能被 accept_source_route = 1 或 rp_filter = 0 抵消效果。必须同步设置:
-
net.ipv4.conf.all.secure_redirects = 0:这个“安全重定向”校验逻辑早已过时且可绕过,显式关掉更可靠 -
net.ipv4.conf.all.accept_source_route = 0:禁用源路由选项,堵住另一条 IP 地址伪造路径 -
net.ipv4.conf.all.rp_filter = 1:反向路径过滤,自动丢弃源 IP 不匹配入接口的包,是防欺骗的基础
这些参数共同作用才构成纵深防御,缺一不可。单独调一个 accept_redirects 是最常见、也最危险的“伪加固”。











