Linux故障之内核反向路由检测

参考链接
环境:

centos8,双网卡

ens18: 192.168.6.51
ens19: 192.168.2.111
过程中发现,client:192.168.6.41去访问192.168.6.51正常,但是另外一个2网段的不通,路由如下:


[root@localhost ~]# route -n 
Kernel IP routing table
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

经过一番搜索,得知这种问题是由于当客户端发包给服务器时,连接服务器的交换机里,记录了每个IP对应的mac地址表,其中就有每个mac应该从交换机哪个接口进入。
而服务器收到包之后,如果是自己的包,就会往上层协议栈转发处理,而如果不是自己的,就会根据路由表进行转发。
当服务器接收到来自192.168.6.41访问192.168.2.111的包后,会从ens19网口进入,而回包会从ens18发出,这就导致了异步路由问题。
linux内核针对这个问题,有一个安全机制,反向路由检测机制。
Linux的反向路由检测机制,该机制的目的有多个:
– 避免出现意料之外的结果(从一个网卡进,从另一个网卡出),形成循环
– 安全考虑,避免出现IP单播数据包的欺骗
– 避免在较复杂的网络拓扑环境下,因为路由器错误的路径规划,造成反向路径过于复杂,降低网络性能。

可以通过配置一下参数关闭这个机制。


echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter # 关闭所有网卡的反向路由检测
echo 0 > /proc/sys/net/ipv4/conf/deafult/rp_filter # 关闭默认网卡(未指定情况下)的反向路由检测
echo 0 > /proc/sys/net/ipv4/conf/em1/rp_filter # 关闭em1所属网卡的反向路由检测
echo 0 > /proc/sys/net/ipv4/conf/em2/rp_filter # 关闭em2所属网卡的反向路由检测
service network restart # 重启网络服务

但是个人更推荐将这个参数改为2,而不是0

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

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

关闭机制是一种方法,另外一种方法就是通过ip rule,编写策略路由,完成目的:源进源出。
linux的策略路由

最终,我使用策略路由完成“源进源出”的目的:

[root@localhost ~]# ip route show table 253
default via 192.168.2.1 dev ens19 src 192.168.2.221 #注意,其中的src关键字很重要,这是一条精细路由
[root@localhost ~]# ip rule show 
0:	from all lookup local
32765:	from 192.168.2.221 lookup default #注意写好rule优先级
32766:	from all lookup main
32767:	from all lookup default

你可能感兴趣的:(linux,linux,网络)