Windows

Windows 電腦從標記的 VLAN 獲取 SLAAC IPv6

  • August 27, 2018

我在網路上有 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

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 的驅動程序。

引用自:https://serverfault.com/questions/907602