rp_filter是linux内核反向路径过滤机制,用于防范ip欺骗:值0关闭校验,1为严格模式(要求进/出接口一致),2为宽松模式(源ip任一接口可达即放行);双网关非对称路由下设为2可解决tcp连接中断、syn-ack丢失等问题。

rp_filter 开启时,Linux 内核会对每个入向数据包做反向路径校验——若源地址无法通过同一网卡路由回源(严格模式)或任意网卡可达(宽松模式),就直接丢包。非对称路由场景下(比如双网关、多网卡跨网段通信),这正是 TCP 连接中断、ping 不通、SYN-ACK 丢失的常见根因。
怎么确认是 rp_filter 导致丢包
别猜,先验证:
- 在疑似丢包的服务器上执行:
cat /proc/sys/net/ipv4/conf/all/rp_filter,若输出为1或2,且你正处在多网卡/多网关环境,嫌疑极大 - 用
tcpdump -i any port 80 or port 443抓包:客户端发了 SYN,服务端收到并回了 SYN-ACK,但客户端收不到 → 回包被内核在出栈前丢弃,rp_filter是高概率原因 - 检查具体网卡:比如业务走
eth1,但默认路由在eth0,此时cat /proc/sys/net/ipv4/conf/eth1/rp_filter若为1,就会丢掉从eth1进、却要从eth0出的响应包
rp_filter = 0、=1、=2 到底该怎么选
值不是越大越安全,而是匹配你的网络拓扑:
-
0:完全关闭校验。最简单粗暴,适合测试或内部可信网络,但会放行伪造源 IP 的包,生产环境慎用 -
1:严格模式。要求“进哪口,出哪口”。双网卡不同网段、策略路由未配全时,极易丢包;仅适用于单网关、对称路由明确的场景 -
2:宽松模式。只要源 IP 能从**任一接口**路由出去就算合法。这是多宿主服务器(如云主机、双出口网关)最推荐的值,兼顾安全与可用性
多数双网关/多网卡业务服务器,设成 2 就够用 —— 它不强制路径对称,只防源不可达攻击。
永久生效必须同时改 all 和 default
只改 all 不够,新创建的接口(如 Docker 网桥、K8s CNI 接口)会继承 default 值,导致后续容器流量仍被拦。
- 临时生效(立刻生效,重启失效):
sudo sysctl -w net.ipv4.conf.all.rp_filter=2sudo sysctl -w net.ipv4.conf.default.rp_filter=2 - 永久生效(写入独立配置文件,避免污染
/etc/sysctl.conf):echo "net.ipv4.conf.all.rp_filter = 2" | sudo tee /etc/sysctl.d/99-rpfilter.confecho "net.ipv4.conf.default.rp_filter = 2" | sudo tee -a /etc/sysctl.d/99-rpfilter.confsudo sysctl -p /etc/sysctl.d/99-rpfilter.conf
注意:如果只希望对某块业务网卡放宽(如 eth1),额外加一行 net.ipv4.conf.eth1.rp_filter = 2 即可,管理网卡(如 eth0)可保留 1 提高安全性。
关了 rp_filter 还要配配套参数
单独放开 rp_filter 是半吊子加固 —— 源路由、ICMP 重定向、IP 转发这些入口都可能被利用绕过防护。
- 禁用源路由:
net.ipv4.conf.all.accept_source_route = 0和net.ipv4.conf.default.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
这些参数和 rp_filter 共同构成基础网络面防护层。漏掉任何一个,都可能让攻击者构造跳转路径或伪造路由,让前面的配置形同虚设。











