今天碰到一个问题,一台服务器配置两个网卡,不同的网段,同样客户端和服务器网段为不同网段。拓扑如下:

linux怎么连接双网卡(linux双网卡不能通讯的问题)(1)

eth0:172.10.1.2/24 eth1:172.10.2.2/24 主机默认路由为172.10.2.254

客户端:172.4.3.2/24

客户端可以ping通172.10.2.2网段。但是无法ping通172.10.1.2地址。需求是客户端同时可以ping通两个地址。

解决思路:

第一反应就是启用服务器的路由转发功能。

1、启用服务器的路由转发

1.临时开启,(写入内存,在内存中开启) echo "1" > /proc/sys/net/ipv4/ip_forward 2.永久开启,(写入内核) echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p ----加载,使得配置文件立即生效 检查: sysctl -a |grep "ip_forward"

但是启用后仍然ping不通,服务器端抓包如下。

#tcpdump -vv -i eth0 -v icmp -n

linux怎么连接双网卡(linux双网卡不能通讯的问题)(2)

发现主机收到了客户端的请求request但是没有回包信息。继续排查正常来说启动路由转发后主机是可以转发路由,通过默认路由将数据转发出去(如果客户端是172.10.2.0网段的访问172.10.1.2是可以正常通讯的)。所以想起了Linux的另外一个内核参数rp_filter参数

rp_filter参数用于控制系统是否开启对数据包源地址的校验。 首先看一下Linux内核文档documentation/networking/ip-sysctl.txt中的描述: rp_filter - INTEGER 0 - No source validation. 1 - Strict mode as defined in RFC3704 Strict Reverse Path Each incoming packet is tested against the FIB and if the interface is not the best reverse path the packet check will fail. By default failed packets are discarded. 2 - Loose mode as defined in RFC3704 Loose Reverse Path Each incoming packet's source address is also tested against the FIB and if the source address is not reachable via any interface the packet check will fail.   Current recommended practice in RFC3704 is to enable strict mode to prevent IP spoofing from DDos attacks. If using asymmetric routing or other complicated routing, then loose mode is recommended.   The max value from conf/{all,interface}/rp_filter is used when doing source validation on the {interface}.   Default value is 0. Note that some distributions enable itin startup scripts.

rp_filter参数用于控制系统是否开启对数据包源地址的校验,即rp_filter参数有三个值,0、1、2,具体含义:

0:不开启源地址校验。

1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,则直接丢弃该数据包。(我的centos7.9默认值为1)

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

所以这也便解释的通为啥同网段的可以ping通eth0地址,而跨网段的不能通讯了。

2、关闭rp_filter参数

临时生效

# echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter # echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter # echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter

永久生效

cat /etc/sysctl.conf 写入到sysctl.conf配置文件 net.ipv4.ip_forward = 1 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.eth0.rp_filter = 0 net.ipv4.conf.eth1.rp_filter = 0 net.ipv4.conf.lo.rp_filter = 0 sysctl -p #如果不生效需要重启主机。

检查是否生效

linux怎么连接双网卡(linux双网卡不能通讯的问题)(3)

再次使用客户端ping测试,两个地址均能ping通了。抓包如下

#tcpdump -vv -i eth0 -v icmp -n 服务器通过eth0口接收到了ping请求

linux怎么连接双网卡(linux双网卡不能通讯的问题)(4)

#tcpdump -vv -i eth1 -v icmp -n 服务器通过eth1口进行了回复

linux怎么连接双网卡(linux双网卡不能通讯的问题)(5)

至此此问题算是解决了。

开启rp_filter参数的作用

1. 减少DDoS攻击

校验数据包的反向路径,如果反向路径不合适,则直接丢弃数据包,避免过多的无效连接消耗系统资源。

2. 防止IP Spoofing

校验数据包的反向路径,如果客户端伪造的源IP地址对应的反向路径不在路由表中,或者反向路径不是最佳路径,则直接丢弃数据包,不会向伪造IP的客户端回复响应。

,