【场景】
有一台物理机,IP地址是172.31.192.201,由于业务原因,在这台物理机上的第二块网卡配置172.31.196.1,配置文件信息如下:
[root@cloud1 network-scripts]# cat ifcfg-ens9f0 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no NAME=ens9f0 DEVICE=ens9f0 ONBOOT=yes IPADDR=172.31.196.1 NETMASK=255.255.255.0 PREFIX=24 |
[root@cloud1 network-scripts]# cat ifcfg-br-ex DEVICE=br-ex TYPE=OVSBridge DEVICETYPE=ovs ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none IPADDR=172.31.192.201 NETMASK=255.255.255.0 GATEWAY=172.31.192.254 |
重启网络后,机器路由表如下:
[root@cloud1 network-scripts]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 172.31.192.254 0.0.0.0 U 1006 0 0 br-ex link-local 0.0.0.0 255.255.0.0 U 1006 0 0 ens9f0 link-local 0.0.0.0 255.255.0.0 U 1008 0 0 ens4f0 link-local 0.0.0.0 255.255.0.0 U 1014 0 0 br-ex link-local 0.0.0.0 255.255.0.0 U 1015 0 0 br-int 172.31.192.0 0.0.0.0 255.255.255.0 U 0 0 0 ens4f0 172.31.196.0 0.0.0.0 255.255.255.0 U 0 0 0 br-ex |
该路由表表示:当目标地址是172.31.192.0,从ens4f0发包,当目标地址是172.31.196.0,从br-ex发包,如果目标地址不在路由表中,就从默认网关172.31.192.254传输包。
从该机器ping两个网关172.31.196.254和172.31.192.254都是通的,说明机器到交换机链路正常。
【问题】
当从办公网(172.25.0.0网段)ping 172.31.192.201可以通,但172.31.196.1不通
【原因分析】
ping 172.31.192.201时,包从网关172.31.192.254转给该机器时,机器查路由表,发现需要从默认路由回包,即172.31.192.254,此时网络连通。示意图:
Ping172.31.196.1时,包从网关172.31.196.254转给该机器时,机器查路由表,发现需要从默认路由回包,即172.31.192.254,此时网络不连通。示意图:
【解决方案】
关键是要机器按照包的来源进行答复,如果包从196.1网卡来,回复的包就从该网卡出去;如果从192.201网卡进来的,就从该网卡出去。
【临时策略,重启网卡失效】
# echo "192 net_192" >> /etc/iproute2/rt_tables #ip route flush table net_192 #ip route add default via 172.31.192.254 dev br-ex src 172.31.192.201 table net_192 #ip rule add from 172.31.192.201 table net_192 # #echo "196 net_196" >> /etc/iproute2/rt_tables #ip route flush table net_196 #ip route add default via 172.31.196.254 dev ens9f0 src 172.31.196.1 table net_196 #ip rule add from 172.31.196.1 table net_196 |
【永久策略】
# echo "192 net_192" >> /etc/iproute2/rt_tables #ip route flush table net_192 #echo ” 0.0.0.0/0 via 172.31.192.254 dev br-ex src 172.31.192.201 table net_192” >> /etc/sysconfig/network-scripts/route-br-ex # #echo "196 net_196" >> /etc/iproute2/rt_tables #ip route flush table net_196 #echo “0.0.0.0/0 via 172.31.196.254 dev ens9f0 src 172.31.196.1 table net_196” >> /etc/sysconfig/network-scripts/route-ens4f0 #service network restart |
[root@cloud1 bak_1216]# cat route-br-ex 0.0.0.0/0 via 172.31.192.254 dev br-ex src 172.31.192.201 table net_192 [root@cloud1 bak_1216]# cat route-ens9f0 0.0.0.0/0 via 172.31.196.254 dev ens9f0 src 172.31.196.1 table net_196 |
【注意事项】
在设定好转发路由策略之后,务必记得检查默认路由是否存在,即上文中的default是否存在(只要网卡配置文件中配置了网关,启动网络时就会自动生成默认路由),否则虽然外面的机器ping该物理机没问题(原因上面已经说了),但是由该物理机主动发出的到外网的请求无法转发,因为目标地址既不在172.31.192.0也不在172.31.196.0网段的报文,都会被丢弃。