我有两个盒子通过 10G 交换机连接:
- 1 个“发送方”盒,带有 1x 端口静态地址 10.0.1.1
- 1 个“接收器”盒,带有 2 个端口静态地址 10.0.1.2 和 10.0.1.3
我的目标是从“发送方”框将 UDP 数据包分别发送到“接收方”框上的两个端口中的任一个。
我很难理解为什么发送方盒上的 ARP 会看到接收方盒上的两个接口具有相同的 MAC 地址但不同的 IP 地址。
sender$ arp
Address HWtype HWaddress Flags Mask Iface
10.0.1.2 ether 00:0f:53:9a:44:b1 C enp0s25
10.0.1.3 ether 00:0f:53:9a:44:b1 C enp0s25
您可以在接收器上看到,MAC地址分别以b0和b1结尾。
receiver$ ifconfig
...
enp74s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.1.2 netmask 255.255.255.0 broadcast 10.0.1.255
inet6 fe80::20f:53ff:fe9a:44b0 prefixlen 64 scopeid 0x20<link>
ether 00:0f:53:9a:44:b0 txqueuelen 1000 (Ethernet)
RX packets 43970 bytes 3337154 (3.3 MB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 217 bytes 36639 (36.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 145
enp74s0f1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.1.3 netmask 255.255.255.0 broadcast 10.0.1.255
inet6 fe80::20f:53ff:fe9a:44b1 prefixlen 64 scopeid 0x20<link>
ether 00:0f:53:9a:44:b1 txqueuelen 1000 (Ethernet)
RX packets 43632 bytes 3205973 (3.2 MB)
RX errors 0 dropped 6 overruns 0 frame 0
TX packets 1375 bytes 249294 (249.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 151
在接收方,有两个几乎相同的 ARP 条目,只是接口不同。这实际上看起来是“正确的”,因为我可以通过两个本地端口到达发送方的同一网络接口。
receiver$ arp
Address HWtype HWaddress Flags Mask Iface
10.0.1.1 ether f0:de:f1:80:b4:7a C enp74s0f1
10.0.1.1 ether f0:de:f1:80:b4:7a C enp74s0f0
也许我选择实例化同一子网上的所有接口是个问题?我该如何实现明确定位接收器端口的目标?
我的接收端的 netplan 就像
network:
version: 2
renderer: networkd
ethernets:
enp69s0:
dhcp4: true
match:
macaddress: 18:c0:4d:8b:49:a3
enp74s0f0:
addresses:
- 10.0.1.2/24
dhcp4: no
match:
macaddress: 00:0f:53:9a:44:b0
enp74s0f1:
addresses:
- 10.0.1.3/24
dhcp4: no
match:
macaddress: 00:0f:53:9a:44:b1
谢谢你!
答案1
解决这个问题的一个非常简单的方法是使用 ARP 过滤器。它的作用是过滤掉与本地接口不匹配的 ARP 数据包。在这种情况下,只有相应的接口会响应 ARP 请求,而不会代表同一张卡上的孪生接口响应 ARP 请求,而这正是导致问题的原因。
/etc/sysctl.d/<something>.conf
如果您愿意,请将这些行添加到或/etc/sysctl.conf
本身:
net.ipv4.conf.<iface>.arp_ignore = 1
net.ipv4.conf.<iface>.arp_announce = 2
其中<iface>
是接口名称或all
用于应用于框中的所有接口。
完整文档位于此处:
http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/LVS-HOWTO.arp_problem.html#2_6_arp_announce