如果计算机在同一接口上有两个 IP,则不会填充 ARP 表

如果计算机在同一接口上有两个 IP,则不会填充 ARP 表

我将三个设备连接到一个简单的交换机。所有三台设备都有两个 IP 地址:一个是静态 IP 地址 (172),另一个来自 DHCP 服务器 (192)。

计算机 A:172.16.0.1、192.168.0.1
计算机 B:172.16.0.2、192.168.0.2
计算机 C:172.16.0.3、192.168.0.3

我的问题是,B 和 C 都可以 ping 到 A 的两个 IP 地址,但 B 无法 ping 到 C 的 172 IP 地址(反之亦然)。如果 MAC 地址列在 B 上的 /proc/net/arp 中,我可以 ping 到 C 并返回(这当然是有道理的)。

我将172 IP地址配置为:

$ ip addr add 172.16.0.1/16 brd 172.16.255.255 label eth0:static scope link dev eth0
$ ip route add default dev eth0 metric 1002 scope link

如何确保当 A 上的 DHCP 服务器启用时,无需在 A 或 C 上启用类似路由器的服务(或其他服务),就可以从 B 访问所有内容?

我试过了:

# Computer A
$ tcpdump
21:09:40.398635 ARP, Request who-has 192.168.0.1 tell 192.168.0.2, length 46
21:09:40.398668 ARP, Reply 192.168.0.1 is-at 84:7b:eb:21:80:08 (oui Unknown), length 28
21:09:40.558658 IP 192.168.0.2 > 172.16.0.3: ICMP echo request, id 2, seq 97, length 64
21:09:41.598995 IP 192.168.0.2 > 172.16.0.3: ICMP echo request, id 2, seq 98, length 64
# Computer B
$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ ip a
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:c0:7a:07:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.2/16 brd 172.16.255.255 scope link eth0:static
       valid_lft forever preferred_lft forever
    inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::2c0:7aff:fe07:0/64 scope link 
       valid_lft forever preferred_lft forever
3: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1
    link/sit 0.0.0.0 brd 0.0.0.0
$ ip route get 172.16.0.3
172.16.0.3 via 192.168.0.1 dev eth0  table eth0  src 192.168.0.2 
    cache 
$ ip r
default dev eth0  scope link  metric 1002 
172.16.0.0/16 dev eth0  proto kernel  scope link  src 172.16.0.2 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.2 
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         0.0.0.0         0.0.0.0         U     1002   0        0 eth0
172.16.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
# Computer C
$ tcpdump
16:54:59.881699 STP 802.1w, Rapid STP, Flags [Learn, Forward, Agreement], bridge-id 8000.00:05:1a:a4:58:c0.8002, length 43
16:55:01.878932 STP 802.1w, Rapid STP, Flags [Learn, Forward, Agreement], bridge-id 8000.00:05:1a:a4:58:c0.8002, length 43
16:55:03.879424 STP 802.1w, Rapid STP, Flags [Learn, Forward, Agreement], bridge-id 8000.00:05:1a:a4:58:c0.8002, length 43
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 80:6c:8b:c0:20:f0 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.3/16 brd 172.16.255.255 scope link eth0:static
       valid_lft forever preferred_lft forever
    inet 192.168.0.3/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::826c:8bff:fec0:20f0/64 scope link 
       valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop state DOWN 
    link/sit 0.0.0.0 brd 0.0.0.0
$ ip route get 172.16.0.2
172.16.0.2 dev eth0  src 172.16.0.3 
    cache 
$ ip r
default via 192.168.0.1 dev eth0
default dev eth0  scope link  metric 1002 
172.16.0.0/16 dev eth0  proto kernel  scope link  src 172.16.0.3
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.3 
$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
0.0.0.0         0.0.0.0         0.0.0.0         U     1002   0        0 eth0
172.16.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

另外(感谢 Hauke),ICMP 回复似乎被发送到 A,而不是返回到 C。

在 Hauke 在他的评论中给出修复后,B 上的路线如下所示:

$ ip route get 172.16.0.3
172.16.0.3 via 192.168.0.1 dev eth0  table eth0  src 192.168.0.2 
    cache 

答案1

由于误解,我没有要求您提供输出,ip r但这似乎至少澄清了部分问题:

$ ip route get 172.16.0.3
172.16.0.3 via 192.168.0.1 dev eth0  table eth0  src 192.168.0.2 
    cache

计算机 B 上没有链路本地网络 172.16.0.0/16 的路由。因此,它应该将 172.16.0.3 的数据包发送到 192.168.0.1(因此 ARP 发送至 192.168.0.1(如果未缓存),但不发送至 172.16.0.3) )。手动添加 ARP 条目不会改变这一点。但也许设置也设置了路线。

计算机 C 应该能够向 B 发送数据包,但 B 会尝试通过 A 发送响应,但响应可能会被丢弃。

另外你的命令

ip route add default dev eth0 metric 1002 scope link

对我来说没有任何意义,因为它不包含下一跳的地址。

并且不需要设置/proc/sys/net/ipv4/ip_forward(至少不需要你在问题中所说的)。

相关内容