當交換機埠的pvid=vid時,兩個PC就ping不通了,當pvid!=vid時反而可以ping通?
組網圖如下,兩個PC接在一個交換機上(交換機)
PC1 ping PC2,第一種情況我在PC2上抓包,抓出來的是帶vlan 100tag的ARP包,第二種情況能夠ping通,抓到的報文就是正常的ICMP報文。並且native vlan改成其他值(2,3,4。。。)也是可以的,只要不是100都可以。
查了很多資料,trunk埠收報文應該是加上PVID,也就是報文進交換機後被打上vlan 100。然後轉發到vlan list相關埠,然後報文出的時候判斷報文的tag和出埠PVID一樣,應該剝掉tag。按這個邏輯來說第一種情況應該也能ping通啊。求解~
---------------------------------------------
交換機為ZTE的5960交換機。網卡是支持8021q的,linux系統,我其實還在兩PC上配了eth0.100,即vlan100的子介面,兩PC是可以互通的。(傳輸的是帶vlan tag的報文)。然後又在兩PC的eth0上也配置了ip,期望也可以正常傳輸不帶vlan tag的報文。我的判斷方式即是兩刀片能夠ping通。但是發現能否ping通和PVID的配置息息相關。當pvid=trunk allowed vlan時,無法ping通。當pvid!=trunk allowed vlan時能夠ping通。所以我很想知道交換機的處理流程到底是怎樣的。不知道會不會根據廠商的處理方式不同而不同,因為和網上查資料上看,trunk埠發出報文的流程是,報文的tag==出埠的PVID就剝掉vlan tag發出。不等於就直接髮帶tag的。但是在我這兩個場景上就說不通,應該都能ping通啊,為什麼第一種情況就不通呢??
這道題的關鍵是誤用了 「 trunk mode」,trunk mode 口只用於 交換機之間的互聯埠、或支持802.1Q的路由器介面、或支持802.1Q的伺服器介面。
場景一
這裡的PC顯然是沒有802.1Q的,PC1發出的幀是正常的,沒有VLAN TAG的,因為你壓根就沒有配置,不是嗎?到了交換機,交換機怎麼想?這屬於哪個VLAN呢?因為幀是裸體的,既然連接PC1的埠 Native VLAN = 100,那凡是沒有VLAN TAG的幀默認屬於VLAN 100,幀打上VLAN ID 100 對嗎? 這是Native VLAN 的由來。
然後出埠時,會去掉VLAN ID 100 嗎? 不會的,因為這是 trunk 口的特徵,試想,如果去掉了,對端如何知道幀是屬於哪個VLAN的?所以不能去掉!
到了PC2,不認識802.1Q,丟了,所以Ping不通。場景二與場景一類似,根據接收到的幀是裸體的,另外 入埠native vlan = 1, 推測出這是VLAN 1的幀,那打上TAG嗎?不,VLAN ID= 1 搞特殊化,幀依然是裸體,於是轉發到出埠,裸體到達PC2,這是一個沒有802.1Q的幀,可以識別並通信。這個問題我來答比較合適……在中興交換機內部轉發時,埠native vlan優先順序是低於埠vlan的。按照你的組網場景,client1發送一個untag報文到交換機埠,埠給報文打上native vlan的標籤,在到達出方向埠時,先匹配vlan,如果報文帶的標籤和埠配的vlan能匹配,就按這個vlan發出去。而交換機埠配的透傳模式是trunk,那麼報文從埠出去時是帶tag的,這個報文不能被client2直接識別,所以不通。當報文的vlan和trunk的vlan都不能匹配時,就會去匹配native vlan,然後從埠出去時剝離vlan標籤發送untag報文從而被client2識別。題主可以在client2上抓包看下接收到的報文,觀察下兩種場景下抓到的報文有沒有vlan標籤。
話說我廠5960確實是個不錯的產品……
native vlan是不打tag的,這是個前提。
第一種情況,你的主機網卡支持802.1q,基本判斷你配置網卡的時候,你配置了網卡上的tag標記。而由於vlan 100是natvie vlan所以在數據幀出交換機的時候其實是沒有tag的802.3的幀,而網卡期待收到802.1q的幀,所以出現問題。
第二種情況才是正確的打開方式。
看了前面的回答我是這個理解的:
上圖中兩邊都是 trunk vlan 100其實就相當於vlan 100在這兩個埠轉出時候都是tagged,就是帶vlan標籤的幀。native vlan 只負責轉入的貞。所以你發送的時候是個裸幀,進到交換機里被加上了vlan 100的標記。由於接收埠設置成trunk vlan 100,在轉發到目的機時候不會扒掉標記轉換成裸幀。計算機沒法識別,所以不通。下圖中出口沒有匹配的規則,按說也應該不通。可能埠默認可以傳輸vlan 1吧或者有什麼隱藏設置。所以數據包被扒光,計算機可以識別
vlan體系有兩種語言
一種,vlan: tag utag 埠:pvid vid還有就是 access trunk 什麼的,這個我也分不清,大概會用,我都會翻譯到上面的描述里。
跟埠的進出,交換機內部傳輸有關係
主要原因是是各廠商對trunk和 pvid或nativevlan的處理邏輯上存在不同。題主這種配法在華為和思科上是能通的。@Duke的回答非常在點子上。雲計算和虛擬化場景下經常用類似的方法。
首先是trunk口接收,trunk口接到untag幀時會加上自己的pvid,接到tag幀時會對比,允許通過的vlan原樣通過,不允許的丟棄。
其次是trunk口發,在允許表裡是原樣通過,不在的話對比trunk口的pvid,一樣那麼去掉tag發出,不一樣丟棄。這就清楚了,pc肯定是untag幀,那麼左邊口會打上自己的pvid。到右邊口了之後兩種不一樣了,第一種情況下,因為巧了你的pvid和允許的是一樣的,那麼原樣通過,幀帶tag,pc不通識別,不通。第二種情況時,vlan2不是允許通過範圍內,那麼轉入對比pvid,然後一看pvid一樣,那麼去掉tag,發出的是不帶tag的幀,pc一看,美滋滋,通了。通常交換機還有個命令[no] vlan dot1q tag native來控制埠發送報文時需不需要保留native vlan這個tag。樓主這裡的trunk vlan 100是條命令?我了解的,通常是thunk allowed vlan 100這種形式,而且native vlan也需要在這個vlan list裡面
樓主可能是問access(native)口和trunk口誤用的問題?
前者是告訴交換機,發往這個口的數據要去除VLAN ID標記(untag),但是從這個口收到的數據要打上VLAN ID標記(tag),這個就是給普通設備用的。
Trunk口是給交換機之間或者支持VLAN的設備用的(服務器,虛擬交換機,VoIP電話機)
發往這裡的數據不會被去除VLAN ID標記,也可以只允許一個或者多個VLAN ID的數據通過這個埠。還有一種叫Hybrid口,就是同時通過Access和Trunk的。
各種網管交換機對這個的實現有差別。參考 @Duke 的答案。native vlan 看看是否有修改。
介面下試試這個命令呢:
H3C:
華為:
思科:
這是因為,忽略了pc上的網卡屬性,它也是可以識別tag和發出報文帶tag的,對於不帶tag的數據有另外的處理。類似於網卡上配置了pvid和vid,但是pvid!=100,而你用的地址在interface vlan 100上。大部分伺服器網卡支持,比如broadcom和intel。
這種情況在虛擬化環境下很常見,物理機上有多個虛擬機,使用vlan區分各自的網路。圖題不符,我怎麼感覺樓主真正想問的是port trunk pvid vlan 100與不加這條命令的區別?或者說pvid的作用?
我沒看懂 trunk vlan 100是什麼意思,題主解釋一下?
推薦閱讀: