设置
Host B <--> Router <--> Host A
- 主机 A:IP = 192.168.1.10,网络 = 192.168.1.0/24,VLAN = 1,默认网关 = 192.168.1.1(路由器)
- 主机 B:IP = 192.168.2.10,网络 = 192.168.2.0/24,VLAN = 20,默认网关 = 192.168.2.1(路由器)
- 路由器:IP = 192.168.1.1、192.168.2.1、VLAN = 1、20
所有设备都连接到配置了这些 VLAN 的交换机。
Ping 测试
现在,如果我尝试从主机 B ping 主机 A,将发生以下情况:主机 B 发出 ARP 请求以找出路由器的 MAC 地址,并将 Ping 请求发送到路由器。路由器还会发出 ARP 请求以找出目标主机 A 的 MAC 地址,并将 Ping 请求转发给主机 A。这样就没问题了,而且可以正常工作。
另一个子网的 ARP 请求??
现在奇怪的是:主机 A 当然会尝试应答 Ping,但(!)它不会发出 ARP 请求来找出路由器的 MAC 地址,从而向其发送 Ping-Reply 并将其转发给主机 B。相反,它直接发送 ARP 请求来询问主机 B 的 MAC 地址。当然,这是行不通的,本地子网上不会有答案,因为广播域被限制在 VLAN 1 内。
主机 A(192.168.1.10)上的 ARP 缓存如下所示:
# arp -an
? (192.168.1.1) at 16:bc:aa:f2:bc:44 [ether] on eth0
? (192.168.2.10) at <incomplete> on eth0
当我尝试删除奇怪的 ARP 解析尝试时,我收到此消息,并且失败的 ARP 尝试仍然在缓存中:
# arp -d 192.168.2.10
SIOCDARP(dontpub): Network is unreachable
来自路由器的 ICMP 重定向
因此,主机 A 和 B 之间无法进行 (双向) 通信。主机 B 不会收到 Ping-Replies,而是从路由器收到 ICMP-Redirect-Request:主机 B 应将数据包直接发送到主机 A。
我的问题
- 是什么让主机 B 尝试通过 ARP 解析另一个子网的主机发送答案?为什么 Ping-Reply 没有发送到路由器?
- 知道 ICMP-Redirect 起什么作用吗?
附录
主机 A
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ab:cd:a9:9a:cc:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ab:cd:a9:9a:cc:dd brd ff:ff:ff:ff:ff:ff
# ip r s
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10
主机B
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eth0
192.168.2.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
# ip a s
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 40:7d:7a:a3:f5:dd brd ff:ff:ff:ff:ff:ff
inet 192.168.2.10/24 brd 192.168.2.255 scope global eth0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 47:5e:33:a6:31:5e brd ff:ff:ff:ff:ff:ff
路由器
路由表:Destination-IP Subnet mask Default gateway Hop count Interface
<public-net> 255.255.255.224 * 0 eth2
<public-net> 255.255.255.224 * 0 eth1
192.168.1.0 255.255.255.0 * 0 eth0
192.168.2.0 255.255.255.0 * 0 eth0
default 0.0.0.0 <public-router> 15 eth1
default 0.0.0.0 <public-router> 40 eth2
default 0.0.0.0 <public-router> 40 eth1
public-net ...... 公共子网(internet-uplink)的地址
public-router ... 上行路由器的地址
路由器是仅带有 Web 界面的 Cisco RV320,这就是我能得到的全部。PS:这是一个负载平衡双上行链路设置,但这对 ARP 问题应该没有影响。
答案1
路由器上的路由表看起来不正确。看起来好像您正在运行路由器上未标记的两个 VLAN。
我不知道交换机如何将数据包从路由器传送到 A 和 B,因为路由器似乎将所有数据包都发送到交换机,而没有指明它们属于哪个 VLAN。我使用的交换机无法做到这一点。但也许您使用的交换机品牌可以以某种方式正确猜测将数据包发送到哪个 VLAN。
然而从路由器的角度来看,A 和 B 位于同一以太网段,这意味着路由器应该指示 A 和 B 直接通信,而无需路由器的参与。这就是通信中断的地方。
路由表条目如下所示:
192.168.1.0 255.255.255.0 * 0 eth0
192.168.2.0 255.255.255.0 * 0 eth0
事实上应该是这样的:
192.168.1.0 255.255.255.0 * 0 eth0.1
192.168.2.0 255.255.255.0 * 0 eth0.20
可以使用以下命令创建虚拟接口eth0.1
:eth0.20
vconfig add eth0 1
vconfig add eth0 20
答案2
为我找到了一个解决方案:我将主机 A 和子网 192.168.1.0/24 放入 ID 为 10 的新 VLAN。现在一切都很好。对于我的整体配置来说,这没问题,但仍然很奇怪,它无法与 VLAN ID 1 配合使用。也许路由器是问题所在,它以特殊方式处理 VLAN 1。但这会如何影响 Linux ARP 行为?仍然是一个问题。
答案3
您在 VLAN-1 中看到的行为通常是因为该 vlan id 是未标记的交换机上的管理 vlan。