直接启用rp_filter是防范ip欺骗最底层、最有效的手段,它在数据包刚进入协议栈时即校验源地址可信性,比iptables更早更省资源;其取值0关闭校验、1为宽松模式(任一接口可达即放行)、2为严格模式(要求“进哪出哪”),推荐全局与接口级双覆盖设为1,并同步禁用accept_source_route、accept_redirects、send_redirects和ip_forward等参数。

直接启用 rp_filter 是防范 IP 欺骗最底层、最有效的手段——它在数据包刚进入网络协议栈时就验证源地址是否可信,比 iptables 更早、更省资源,伪造包根本进不了后续处理流程。
理解 rp_filter 的三种取值及其适用场景
该参数控制内核对入站包源 IP 的反向路由校验强度:
- 0(关闭):完全不检查,任何源地址都放行——生产环境严禁使用
- 1(宽松模式):只要系统任意接口存在通往该源 IP 的路由,就接受该包。适合绝大多数服务器,包括单网卡、多出口但无严格对称路由的场景
- 2(严格模式):要求源 IP 的最优回程路径必须与接收包的接口一致(“进哪出哪”)。安全性更高,但易误丢合法非对称流量,如多 ISP、策略路由或 Oracle RAC 环境
正确配置范围:全局 + 接口级双覆盖
仅设 all 不够,新创建或未显式配置的接口可能继承默认值(常为 0),导致防护缺口:
- 临时启用(立即生效,重启失效):
echo 1 | sudo tee /proc/sys/net/ipv4/conf/all/rp_filterecho 1 | sudo tee /proc/sys/net/ipv4/conf/eth0/rp_filter(把eth0替换为实际外网接口名,如ens192) - 永久生效:在
/etc/sysctl.d/99-secure.conf中写入net.ipv4.conf.all.rp_filter = 1net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.eth0.rp_filter = 1
执行sudo sysctl --system加载 - 回环接口可例外:
net.ipv4.conf.lo.rp_filter = 0,本地通信无需校验
必须同步禁用的配套参数
攻击者常组合利用多种机制绕过单一防护,以下参数需一并关闭:
-
源路由选项:
net.ipv4.conf.all.accept_source_route = 0(丢弃所有含源路由字段的包) -
ICMP 重定向:
net.ipv4.conf.all.accept_redirects = 0和net.ipv4.conf.all.send_redirects = 0(防路由表被恶意篡改) -
IP 转发:
net.ipv4.ip_forward = 0(非路由器角色必须关闭,避免被当跳板) -
IPv6 重定向(若启用 IPv6):
net.ipv6.conf.all.accept_redirects = 0
验证与异常排查要点
配置后务必确认真实生效,而非仅看配置文件:
- 运行
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.eth0.rp_filter,两个输出都应为= 1 - 读取
/proc/sys/net/ipv4/conf/all/rp_filter和对应接口路径,值必须是1 - 若业务出现连接失败,优先检查是否因严格模式(2)误丢包;可改用宽松模式(1),或对特定接口设为
2并配合net.ipv4.conf.all.src_valid_mark = 1做精细控制 - 刷新路由缓存确保策略即时应用:
sudo sysctl -w net.ipv4.route.flush=1











