我有一台带有两个网卡的服务器,每个网卡都配置了一个静态 IP(如果有什么区别的话,都是公共 IP)。它们属于同一子网。例如(假 IP,但遵循相同的逻辑):
网卡1:
# cat ifcfg-enp4s0
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="enp4s0"
DEVICE="enp4s0"
ONBOOT="yes"
DNS1="192.168.1.1"
IPADDR=192.168.0.1
PREFIX=24
GATEWAY=192.168.0.254
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no
网卡2:
# cat ifcfg-enp2s0f0
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.0.2
PREFIX=24
GATEWAY=192.168.0.254
DNS1=192.168.1.1
DEFROUTE=no
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp2s0f0
DEVICE=enp2s0f0
ONBOOT=yes
我希望传出连接默认通过 NIC1,除非它发生故障 - 那么它应该通过 NIC2。
发往 192.168.0.1 的数据包应发往 NIC1,回复应从 NIC1 发出。同样,发往 192.168.0.2 的数据包应发往 NIC2,回复应从 NIC2 发出。
通过上述配置,我得到以下路线:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.254 0.0.0.0 UG 100 0 0 enp4s0
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp2s0f0
192.168.0.0 0.0.0.0 255.255.255.0 U 101 0 0 enp4s0
现在,服务器已连接,但从外部只能 ping 192.168.0.1。192.168.0.2 无法访问。
网络人员告诉我,192.168.0.2 可以从同一子网内访问,因此一定是我的配置有错误,导致在外面无法访问。
我做错了什么?你能给出解决办法吗?
答案1
我认为最好将两个 NIC 绑定在一起,并为该绑定分配一个 IP。
这RedHat 文档对此有一个很好的指导。
根据您所述的要求,您很可能希望模式 = 1(但请检查其他模式是否可能无法做得更好 - 例如,除非一个 NIC 出现故障,否则吞吐量将加倍)。
如果绑定不是一个可接受的解决方案,您可能需要为每个接口创建具有度量的静态路由,以便一个接口优先于另一个接口(我认为您可能能够通过在每个 ifcfg-PORT 文件中“仅”设置一个 GATEWAY 来解决问题)。
NIC2 可在本地访问,因为它是通过其物理 (MAC) 地址而不是 IP 寻址的。当您尝试远程联系它时,我倾向于认为您需要启用 IP 转发。
总结:绑定可以简化您的生活,并使服务器更具弹性,但如果您真的不想要这样,您可能需要某种路由指标/成本和 ip_forwarding 的组合。但是当 NIC1 启动时,您将无法避免 NIC2 的流量通过 NIC1,因为它具有首选的默认路由(即较低的指标/成本)。