反向路径过滤是什么
rp_filter 是内核的入向源地址校验:收到数据包后,用源地址反查路由,确认回程是否走同一块网卡。取值 0 关闭、1 严格模式(回程必须走同一接口才放行)、2 松散模式(源地址经任意接口可达即放行)。它主要用来阻断源地址欺骗,同时也会在非对称路由、策略路由与多出口环境下误伤正常流量。这个参数既有全局的 all 项,也有按接口的独立项,两者共同决定实际行为。
基本信息
| 参数 | net.ipv4.conf.all.rp_filter 与 net.ipv4.conf.<接口>.rp_filter |
|---|---|
| 取值 | 0 关闭 / 1 严格模式 / 2 松散模式 |
| 生效规则 | 对某接口校验时取 all 与接口值中较大的一个 |
| 默认值 | 多数通用发行版为 0;部分企业发行版默认开启严格模式 |
| 影响场景 | 非对称路由、策略路由、多出口与容器网络 |
| 可观测性 | 丢弃计数不易直接读到,通常靠对比试验与抓包确认 |
典型使用场景
- 安全加固:阻断伪造源地址的流量,减少反射类攻击的利用面
- 多出口主机排障:回包走另一条链路时被严格模式丢弃,业务表现为单向不通
- 容器与虚拟网络:叠加虚拟接口后校验路径变化,容易出现丢包
- 策略路由环境:按源或按业务分流时,回程路径与预期不一致会被拦
- 变更前后对照:用临时关闭或改为松散模式验证是否为该参数引起
查看与调整
查看与调整
sysctl net.ipv4.conf.all.rp_filter # 全局值
sysctl net.ipv4.conf.eth0.rp_filter # 指定接口的值
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo -n "$i "; cat $i; done # 逐接口核对
sysctl -w net.ipv4.conf.all.rp_filter=2 # 改为松散模式(需与接口值一起改)
sysctl -w net.ipv4.conf.eth0.rp_filter=2 # 接口值也要同步,否则取较大者
ip route get 10.0.0.9 from 10.0.0.5 # 反查路由,验证回程路径模式与适用面
| 取值 | 校验方式 | 适用与风险 |
|---|---|---|
| 0 | 不校验源地址 | 非对称路由环境可用,但放弃了反欺骗能力 |
| 1 | 回程必须走入包接口 | 防护最强,多出口与非对称路径下容易误伤 |
| 2 | 源地址经任意接口可达即放行 | 兼顾路由灵活性,防护强度弱于严格模式 |
| all 与接口同时存在 | 取两者较大值 | 只改一处等于没改,是最高频的配置陷阱 |
放宽过滤会降低反地址欺骗的能力,属于安全性与兼容性的取舍。遇到非对称路由导致的丢包时,先确认确实是该参数引起,再考虑改为松散模式,并同步评估其他层面的防护措施。
虚拟接口与网桥也会参与校验判断:容器网桥、隧道接口与浮动地址都会改变回程路径。排查时应当把相关接口的值全部列出来,而不是只检查主网卡。