我在网络上有 Windows 计算机,它们意外地从标记的 VLAN 获取 IPv6 地址。
我有路由器/计算机连接到具有未标记 vlan (id 1) 和标记 (id 2) 的交换机。为简单起见,假设此 VLAN2 用于 VoIP 手机,它将看到使用标记的 vlan 作为 DHCP 请求的一部分的选项。
2001:db8:1051:4001::/64
出于某种原因,此网络上的 Windows 计算机正在从子网和2001:db8:1051:4002::/64
子网中 获取 SLAAC 地址。我希望 Windows 计算机只能从未标记的 VLAN/子网中获取地址。
具有来自 的地址的 Windows 计算机2001:db8:1051:4002::/64
将无法实际使用该地址做任何事情。它无法 ping 网关2001:db8:1051:4002::1
,并且来自网关的 ping 不起作用。据我所知,它实际上不能以任何方式使用这个地址。
使用过滤器从 Windows 系统上捕获的wiresharkicmp6 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 的情况下阻止这种情况?
回答评论中的问题
如果您为其分配静态 IPv6 地址,Windows 机器是否能够在网络上进行通信
如果给定来自 VLAN 1 子网的静态地址,连接到端口(未标记的 vlan1,标记的 vlan2)的计算机将可以正常工作,但不能在 VLAN2 子网上工作,这是我所期望的。
您是否尝试过在路由器上禁用 SLAAC 并仅使用 DHCPv6?
如果我禁用 SLAACAdvAutonomous off;
并启用有状态的 DHCPv6 服务器,计算机将只能从未标记的 VLAN 获得地址。
如果在 eth_lan.2 上禁用 RA,会发生什么?
客户端将不会从该 VLAN 2 子网获取地址。不过,我希望 IPv6 在该子网上工作,因此非常需要 RA。
我会确保 NIC 的驱动程序完全安装了他们的微型驱动程序,以正确启用操作系统中的 VLAN 支持。
本机 Windows NDIS 不支持正确的 VLAN,它只是在最坏的情况下剥离 VLANid。
引用自Wireshark;
更新 1
=======
在那里找到了一个 MS 博客参考;Windows Core Networking 谈论 802.1P,但他们提供了更多关于 802.1Q 的信息(VLAN 标记)
来自其他 MS博客(这可以解释为什么您的 Windows 计算机无法 ping IPv6 的网关(并且很容易使用wireshark 进行验证,因为传出数据包(PC->Gateway)即使应该被标记也不会被标记) )
考虑到这个更新,我的术语“strip the vlan id”一开始有点重,因为它默认不剥离它,它获取 vlan id 作为输入,但忽略它,它只是不发送之后将 vlan id 取出,并将所有管理留给 NIC 的驱动程序。