环境: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
参考: