Linux 双网卡双IP配置
当一台服务器接了两根网线,配置了两个IP,此时网络数据包的流向是如何走的?
我在cnaaa.com上购买了云服务器。
先说一下背景,原服务器IP为192.168.10.83,网关为192.168.10.254,已经通了部分业务。因临时调整需要在该服务器上部署一套数据库代替之前的业务,要求被替换的业务IP转移至当前服务器上。该数据库业务与原服务器IP不在一个网段,新业务IP为172.16.100.152,网关为172.16.100.254。
此时服务器的两块网卡上分别配置了不同网段的IP:
- 192.168.10.83 (A网卡接口)
- 172.16.100.152 (B网卡接口)
原网络的默认网关是在A上,当在第二块网卡配置好IP后,此时对外第二块网卡的网络实际上是不通的。B网络在服务器上没有配置路由,所有数据包的默认路由都是从A出去的,数据包默认不会从B出去。
此时B网络虽然网线是通的,但只有同网段是可达的。同网段的IP,不需要路由即可达,但跨网段的数据包只有在路由指导下才知道从哪个物理接口出去。
此时如果需要让B网络的IP与所有局域网IP都通,需要将默认路由从A上改到B上。
首先查看路由表
# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 192.168.10.254 0.0.0.0 UG 0 0 0 bond0172.16.100.0 0.0.0.0 255.255.255.0 U 0 0 0 em3192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 bond0
同网段的路由走相应网卡接口出去,此时192.168.10.0/24 走网卡 bond0 ,172.16.100.0/24 走网卡 em3。默认路由走 bond0,所谓的默认路由即目的地址为0.0.0.0的路由,当目的地址为0.0.0.0,就代表目的地址为任意地址,比如互联网地址。互联网的IP我们是没法提前预知的,所以互联网的目的地址要使用0.0.0.0。当大部分网络都走一个网卡接口出去时,我们会优先把默认路由设置在这个网卡接口上。我们需要通过route命令调整一下路由表:
删掉默认路由
route del default
添加新的默认路由
route add default gw 172.16.100.254 dev em3
重新打印新的路由表
# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 172.16.100.254 0.0.0.0 UG 0 0 0 em3172.16.100.0 0.0.0.0 255.255.255.0 U 0 0 0 em3192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 bond0
此时默认路由转到了B接口上,所有的IP到B接口都是通的,除了A接口所在的网段,即192.168.10.0/24段到A接口192.168.10.83是通的,但不通B接口的地址172.16.100.152。因为在路由表中192.168.10.0/24网段走的就是接口A,它不会走到接口B。如果此时192.168.10.0/24段的IP需要和接口B通信,此时需要写明细路由,手工将固定IP指到相应接口。
比如192.168.10.26需要和172.16.100.152通信,可以这样写路由
route add -host 192.168.10.26 gw 172.16.100.254 dev em3
此时路由表如下:
# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.0 172.16.100254 0.0.0.0 UG 0 0 0 em3172.16.100.0 0.0.0.0 255.255.255.0 U 0 0 0 em3192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 bond0192.168.10.26 172.16.100.254 255.255.255.255 UGH 0 0 0 em3
在路由表中为目的地址192.168.10.26指定网关为172.16.100.254,并且从网卡的em3接口出去,此时192.168.10.26就不再通192.168.10.83了。我们可以通过指定网卡物理接口的形式执行ping来测试网络的连通性。
# ping -I bond0 192.168.10.26PING 192.168.10.26 (192.168.10.26) from 192.168.10.83 bond0: 56(84) bytes of data.