Linux内核的 反向路由检查机制rp_filter

  • Post author:
  • Post category:linux


环境:centos7,双网卡

ens18: 192.168.6.51

ens19: 192.168.2.111

client:192.168.6.41访问192.168.6.51正常,

client:192.168.6.41访问192.168.2.111不正常,

路由如下:


[root@localhost ~]# route -n 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.6.1     0.0.0.0         UG    102    0        0 ens18
192.168.2.0     0.0.0.0         255.255.255.0   U     101    0        0 ens19
192.168.6.0     0.0.0.0         255.255.255.0   U     102    0        0 ens18

服务器收到数据包之后,如果是自己的包,就会往上层协议栈转发处理,而如果不是自己的,就会根据路由表进行转发。

当服务器接收到来自192.168.6.41访问192.168.6.51的包后,查询路由表最优路径匹配到192.168.6.0,0表示匹配任意,Iface表示网卡,所以会从ens18网口进入,

回包,反向源地址和目的地址互换,目标地址变为192.168.6.41,查询路由表只能匹配到0.0.0.0,Iface表示网卡,所以会从ens18网口出去,

进口和出口都是ens18网卡,所以能正常转发。

当服务器接收到来自192.168.6.41访问192.168.2.111的包后,查询路由表最优路径匹配到192.168.2.0,0表示匹配任意,Iface表示网卡,所以会从ens19网口进入,

回包,反向源地址和目的地址互换,目标地址变为192.168.6.41,查询路由表只能匹配到0.0.0.0,Iface表示网卡,所以会从ens18网口出去,

回包会从ens18发出,这就导致了异步路由问题。


linux内核针对这个问题,有一个安全机制,反向路由检测机制。

Linux的反向路由检测机制,该机制的目的有多个:

– 避免出现意料之外的结果(从一个网卡进,从另一个网卡出),形成循环

– 安全考虑,避免出现IP单播数据包的欺骗

– 避免在较复杂的网络拓扑环境下,因为路由器错误的路径规划,造成反向路径过于复杂,降低网络性能。

rp_filter (Reverse Path Filtering)参数定义了网卡对接收到的数据包进行反向路由验证的规则。他有三个值,0、1、2,具体含意如下:

0:关闭反向路由校验

1:开启严格的反向路由校验。对每个进来的数据包,校验其反向路由是否是最佳路由。如果反向路由不是最佳路由,则直接丢弃该数据包。

2:开启松散的反向路由校验。对每个进来的数据包,校验其源地址是否可达,即反向路由是否能通(通过任意网口),如果反向路径不通,则直接丢弃该数据包。

修改方式如下:

sysctl -w net.ipv4.conf.all.rp_filter=1

参考:


Linux故障之内核反向路由检测_linux反向路由检查_余声不秃头的博客-CSDN博客