Windows 電腦從標記的 VLAN 獲取 SLAAC IPv6
我在網路上有 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 系統上擷取的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 的情況下阻止這種情況?
回答評論中的問題
如果您為其分配靜態 IPv6 地址,Windows 機器是否能夠在網路上進行通信
如果給定來自 VLAN 1 子網的靜態地址,連接到埠(未標記的 vlan1,標記的 vlan2)的電腦將完全正常工作,但無法在 VLAN2 子網上工作,這是我所期望的。
您是否嘗試過在路由器上禁用 SLAAC 並僅使用 DHCPv6?
如果我禁用 SLAAC
AdvAutonomous off;
並啟用有狀態的 DHCPv6 伺服器,電腦將只能從未標記的 VLAN 獲得地址。如果在 eth_lan.2 上禁用 RA,會發生什麼?
客戶端將不會從該 VLAN 2 子網獲取地址。不過,我希望 IPv6 在該子網上工作,因此非常需要 RA。
我會確保 NIC 的驅動程序完全安裝了他們的微型驅動程序,以正確啟用作業系統中的 VLAN 支持。
本機 Windows NDIS 不支持正確的 VLAN,它只是在最壞的情況下剝離 VLANid。
引用自Wireshark;
Windows 沒有內置的 VLAN 支持機制。除非存在添加此類支持的專用驅動程序,否則您無法從中擷取單獨的物理和 VLAN 介面。
因此,您是否在 Wireshark 中看到 VLAN 標籤將取決於您擁有的網路適配器以及它及其驅動程序對 VLAN 標籤的作用。
大多數“簡單”網路適配器(例如廣泛使用的 Realtek RTL 8139)及其驅動程序將簡單地將 VLAN 標記傳遞給上層來處理這些。在這種情況下,Wireshark 將看到 VLAN 標籤並可以處理和顯示它們。
一些更複雜的適配器將處理適配器和/或驅動程序中的 VLAN 標記。這包括一些英特爾適配器,據我所知,博通千兆晶片組(基於 NetXtreme / 57XX 的晶片)。此外,具有專用驅動程序的卡也可能會遵循此路徑,以防止來自“真實”驅動程序的干擾。
更新 1
=======在那裡找到了一個 MS 部落格參考;Windows Core Networking 談論 802.1P,但他們提供了更多關於 802.1Q 的資訊(VLAN 標記)
Windows 網路堆棧完全支持 802.1Q 標籤,即 UserPriority(正如 Mathias 在這篇文章中所討論的)以及 VlanId。 但是,沒有堆棧組件(tcpip 等)對 VlanId 欄位起作用。Intel、Broadcom 等供應商在其微型埠驅動程序中結合 NIC 硬體實現 VLAN。因此,如果 ISV 願意,Windows 允許 ISV 實施 VLAN,但本身並不實施它們。
- 沒有
來自其他 MS部落格(這可以解釋為什麼您的 Windows 電腦無法 ping IPv6 的網關(並且易於使用wireshark 進行驗證,因為傳出數據包(PC->Gateway)即使應該被標記也不會被標記) )
您的 NIC 負責將 802.1q 標記添加到傳出數據包。
考慮到這個更新,我的術語“strip the vlan id”一開始有點重,因為它預設不剝離它,它獲取 vlan id 作為輸入,但忽略它,它只是不發送之後將 vlan id 取出,並將所有管理留給 NIC 的驅動程序。