我的 Centos7 盒子里有许多 NIC,eno1、eno2 和 enp2s0f0、enp2s0f1、enp2s0f2、enp2s0f3。唯一通过以太网电缆连接的是 eno2,但是,我可以使用 在其他机器(Win10)上看到除 eno1 之外的所有 NIC arp -a
,它们显示的 MAC 与 eno2 相同。我可以毫无问题地 ssh 到所有 192.168.<3-6>.82。
brctl show
告诉我没有桥,而 cat/proc/sys/net/ipv4/ip_forward
给我 0。发生了什么?
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ac:1f:6b:d6:a9:f4 brd ff:ff:ff:ff:ff:ff
inet 10.10.1.163/24 brd 10.10.1.255 scope global eno1
valid_lft forever preferred_lft forever
inet6 fe80::ae1f:6bff:fed6:a9f4/64 scope link
valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ac:1f:6b:d6:a9:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.71/16 brd 192.168.255.255 scope global noprefixroute dynamic eno2
valid_lft 86263sec preferred_lft 86263sec
inet6 fe80::2482:20ed:7ae1:9b00/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: enp2s0f0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 3c:fd:fe:ea:53:10 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.82/24 brd 192.168.3.255 scope global enp2s0f0
valid_lft forever preferred_lft forever
5: enp2s0f1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 3c:fd:fe:ea:53:11 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.82/24 brd 192.168.4.255 scope global enp2s0f1
valid_lft forever preferred_lft forever
6: enp2s0f2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 3c:fd:fe:ea:53:12 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.82/24 brd 192.168.5.255 scope global enp2s0f2
valid_lft forever preferred_lft forever
7: enp2s0f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 3c:fd:fe:ea:53:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.6.82/24 brd 192.168.6.255 scope global enp2s0f3
valid_lft forever preferred_lft forever
答案1
第一个问题与客户端系统有关,因为它不应该制作首先那些 ARP 查询。
由于您在中看到错误的子网地址
arp -a
,这表明您的客户端系统添加了将所有这些 /24 定义为“在线”的路由。(也许您为其自己的以太网接口分配了不必要的地址?或者也许您意外地将其配置为 /16?)
第二个问题是服务器系统回应如果这些 ARP 查询到达“错误”的接口,则
这实际上是 Linux IPv4 中的默认行为(我相信它是“弱主机”模型的一部分)——它将 IPv4 地址视为属于整个主机,而不是特定接口。您可以通过设置此设置来禁用它系统控制在多网卡的机器上:
net.ipv4.conf.all.arp_ignore = 1
第三个问题是服务器系统在发送 TCP/IP 响应时选择了“错误”的接口。
再次强调,这是默认行为(属于同一弱主机模型)——多 NIC 机器将始终使用相同的默认路由进行响应,而不管其响应的源 IP 是什么,因为 IPv4 路由表只允许您匹配“到”,而不允许匹配“来自”。
为了解决 IPv4 的这个问题,你需要通过 进行策略路由
ip rule
。(但是,Linux 上的 IPv6 路由表能匹配源和目标,这允许更简单的解决方案。)一些其他操作系统还使连接“坚持”到其原始接口,这可以通过 iptables 标记和相同的ip rule