我的网络上有几台 Windows 计算机意外地从标记的 VLAN 中获取了 IPv6 地址。
我将路由器/计算机连接到交换机,交换机上有一个未标记的 VLAN(ID 1)和一个标记的 VLAN(ID 2)。为简单起见,假设此 VLAN2 用于 VoIP 手机,该手机将看到一个选项,即使用标记的 VLAN 作为 DHCP 请求的一部分。
2001:db8:1051:4001::/64
由于某种原因,该网络上的 Windows 计算机从和子网中获取了 SLAAC 地址2001:db8:1051:4002::/64
。 我希望 Windows 计算机只从未标记的 VLAN/子网中获取地址。
具有来自的地址的 Windows 计算机2001:db8:1051:4002::/64
实际上无法将此地址用于任何用途。它无法 ping 网关2001:db8:1051:4002::1
,并且从网关 ping 不起作用。据我所知,它实际上无法以任何方式使用此地址。
使用过滤器在 Windows 系统上进行的 wireshark 捕获icmp6 and ip6[40] == 134
将显示两个子网的路由通告。
从启动到 Linux livecd 的同一台计算机进行的 tcpdump 捕获将显示2001:db8:1051:4002::/64
以太网帧中具有正确 vlan id 的广告。Linux 不会从两个子网获取地址。
Windows 计算机是 Windows 10 1709 的全新安装,我已经在装有 Realtek 和 Broadcom 适配器的系统上看到了这种行为。
配置
+--------------+ +-----------+ +------------------+
| Linux Router +----+ HP Switch +----+ Windows Computer |
+--------------+ +-----------+ +------------------+
Linux 路由器接口配置
3: eth_lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 0c:c4:7a:14:c7:fd brd ff:ff:ff:ff:ff:ff
inet 10.2.25.1/24 brd 10.2.25.255 scope global eth_lan
valid_lft forever preferred_lft forever
inet6 2001:db8:1051:4001::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::ec4:7aff:fe14:c7fd/64 scope link
valid_lft forever preferred_lft forever
5: eth_lan.2@eth_lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 0c:c4:7a:14:c7:fd brd ff:ff:ff:ff:ff:ff
inet 10.2.26.1/24 brd 10.2.26.255 scope global eth_lan.2
valid_lft forever preferred_lft forever
inet6 2001:db8:1051:4002::1/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::ec4:7aff:fe14:c7fd/64 scope link
valid_lft forever preferred_lft forever
Linux RADVD 配置
interface eth_lan
{
AdvSendAdvert on;
AdvManagedFlag on;
AdvOtherConfigFlag on;
MaxRtrAdvInterval 90;
MinRtrAdvInterval 30;
prefix ::/64
{
};
};
interface eth_lan.2
{
AdvSendAdvert on;
MaxRtrAdvInterval 90;
MinRtrAdvInterval 30;
prefix ::/64
{
};
AdvDefaultPreference low;
};
交换机配置
HP-2530-24G-PoEP# show running-config
Running configuration:
; J9773A Configuration Editor; Created on release #YA.15.14.0007
; Ver #05:18.63.ff.37.27:91
hostname "HP-2530-24G-PoEP"
snmp-server community "public" unrestricted
vlan 1
name "DEFAULT_VLAN"
untagged 1-28
ip address dhcp-bootp
exit
vlan 2
name "VLAN2"
tagged 1-28
no ip address
exit
问题:
为什么 Windows 系统会从标记的 VLAN 获得不起作用的 IPv6 地址?有没有办法阻止这种情况,而无需在 VLAN 2 上禁用 IPv6 或不在 Windows 系统所连接的端口上标记该 VLAN?
对评论中问题的回答
如果为 Windows 计算机分配静态 IPv6 地址,它们是否能够在网络上通信
如果为连接到端口(未标记的 vlan1、标记的 vlan2)的计算机提供来自 VLAN 1 子网的静态地址,它将正常工作,但无法在 VLAN2 子网上工作,而这正是我所期望发生的。
您是否尝试过禁用路由器上的 SLAAC 并仅使用 DHCPv6?
如果我禁用 SLAACAdvAutonomous off;
并启用有状态 DHCPv6 服务器,则计算机将只能从未标记的 VLAN 获取地址。
如果禁用 eth_lan.2 上的 RA,会发生什么情况?
那么客户端将不会从 VLAN 2 子网获取地址。但是,我希望 IPv6 在该子网上工作,因此 RA 非常必要。
答案1
我将确保 NIC 的驱动程序与其微型驱动程序完全安装,以便在操作系统中正确启用 VLAN 支持。
本机 Windows NDIS 不能正确支持 VLAN,并且在最坏的情况下它只会剥离 VLANid。
引自Wireshark;
Windows 没有内置的 VLAN 支持机制。没有单独的物理接口和 VLAN 接口可供您捕获,除非存在添加此类支持的专用驱动程序。
因此,您是否在 Wireshark 中看到 VLAN 标签取决于您拥有的网络适配器以及它和它的驱动程序如何处理 VLAN 标签。
大多数“简单”网络适配器(例如广泛使用的 Realtek RTL 8139)及其驱动程序只会将 VLAN 标签传递到上层来处理这些标签。在这种情况下,Wireshark 将看到 VLAN 标签,并可以处理和显示它们。
一些更复杂的适配器将在适配器和/或驱动程序中处理 VLAN 标记。这包括一些 Intel 适配器,据我所知,还包括 Broadcom 千兆位芯片组(基于 NetXtreme / 57XX 的芯片)。此外,具有专用驱动程序的卡也可能遵循此路径,以防止受到“真实”驱动程序的干扰。
更新 1
=======
找到 MS 博客参考那里; Windows 核心网络讨论了 802.1P,但他们提供了有关 802.1Q(VLAN 标记)的更多信息
Windows 网络堆栈完全支持 802.1Q 标签,即 UserPriority(正如 Mathias 在本帖中所讨论的)以及 VlanId。 但是,没有任何堆栈组件(tcpip 等)对 VlanId 字段起作用. 供应商(例如 Intel、Broadcom 等)在其微型端口驱动程序中结合 NIC 硬件实现 VLAN。因此,Windows 允许 ISV 根据需要实现 VLAN,但并不原生实现它们。
–加布
来自其他 MS博客(这可以解释为什么您的 Windows 计算机无法 ping 通 IPv6 网关(并且很容易用 wireshark 进行验证,因为即使应该标记,传出的数据包(PC->网关)也不会被标记))
您的 NIC 负责将 802.1q 标签添加到传出的数据包。
考虑到该更新,我的术语“剥离 vlan id”一开始有点沉重,因为它不会默认剥离它,它会获取 vlan id 作为输入,但忽略它,并且它只是不会在之后发送 vlan id,并将所有管理留给 NIC 的驱动程序。