我对 VLAN 标记有疑问。我对 VLAN 完全是新手,所以也许我根本误解了一些东西......
基本上:我有一个 Linux 盒子,配置/etc/network/interfaces
如下:
allow-hotplug eth0
iface eth0 inet static
address 192.168.70.31
netmask 255.255.255.0
allow-hotplug eth0.0001
iface eth0.0001 inet static
address 192.168.1.31
netmask 255.255.255.0
我调整了路由表,现在我有(ip r
命令的输出):
192.168.1.0/24 dev eth0.0001 proto kernel scope link src 192.168.1.31
192.168.70.0/24 dev eth0 proto kernel scope link src 192.168.70.31
如果我使用 Wireshark 监视数据包,同时 ping 另一台标记有 VLAN ID 1 的主机(在我的测试中为 192.168.1.30),那么我会看到我的主机发出重复的数据包,一个和正确的 VLAN ID 和另一个(来自同一个 192.168.1.31 接口!)没有VLAN 标记。另一台主机分别响应带有和不带正确 VLAN 标记的两个数据包,如下面的屏幕截图所示:
问题是:为什么我的主机发出重复的数据包?如果 ping 192.168.1.x 网络中的另一台主机,它不应该只发出一带有正确 VLAN 标记的数据包(1
在我的例子中)?
答案1
只有一物理接口:eth0
.链接到实际接口的任何虚拟接口(此处:eth0.0001
)都会在其虚拟视图中显示封装的流量,直到流量通过实际接口发出。
网络堆栈将使此类流量流经每个接口,直到到达离开计算机的最终接口。每个步骤都可以单独捕获,从而导致同一有效负载的多次捕获,但具有不同的封装属性。
因此,使用 Wireshark 可以看到发生的情况(在非常简化的视图中):
VLAN 接口显示 VLAN 帧中的有效负载,因此不显示任何 VLAN
该虚拟接口是参与 IP LAN 192.168.1.0/24 路由的虚拟接口。 IP 数据包被发出,并且本身被封装在(普通)以太网帧内。 (在此之前,ARP 流量也会发生,但不在捕获中)。该帧由 Wireshark 捕获,然后发送给处理 VLAN 接口的网络部分。
界面
eth0
显示封装的负载,因此显示 VLAN ID 1。先前的以太网帧
eth0.0001
一旦到达,就会被封装上一个额外的 VLAN 标记(向帧添加 4 个字节),eth0
并再次被 Wireshark 捕获(但不一样),然后再由 NIC 驱动程序提供给实际 NIC 的硬件。
Wireshark(也tcpdump
适用于这个非常简单的情况)不会停留在第一层,而是显示更多内容:使用地址和 IP 协议 (ICMP) 进行 IPv4 解码。
答案2
好的,明白了,感谢 AB 的评论,它让我走上了正确的道路......
我正在捕捉全部Wireshark 中的接口,因此在捕获中显示了来自原始设备 (eth0) 和虚拟设备 (eth0.0001) 的数据包...
因此,基本上,当您将数据包发送到 192.168.1.x 时,它会在虚拟接口 eth0.0001 上路由(没有 VLAN 标记);虚拟接口添加 VLAN 标记并将其“传输”到“原始”接口(在我的例子中为 eth0),该接口实际上通过线路发送它...要求 Wireshark 显示所有接口,数据包被列出两次(一个来自虚拟接口)接口和原始接口之一)。
更新:@AB 几分钟后发布了他自己的答案,这比我更好地解释了这个主题......请参考他的答案(已投票并接受)