之前在對交換機的介紹中,我們知道交換機的作用就是隔離廣播域,在不需要跨網段傳輸時,在同一子網中轉發數據包從而進行通信。實現的核心原理就是在交換機中擁有一張 MAC 表,記錄了對應終端設備和接口之間的關系。
今天會在此基礎上,介紹 VLAN 的概念,先來看這樣一個設計很不好的網絡,假設這是一家公司的拓撲圖:
可以發現,公司的每個部門之間和核心交換機相連,這就會造成很大的問題:
- 非常大的廣播域 - 廣播非常消耗資源,特別是廣播域很大的情況,比如 HR 部門發送一條廣播,市場部,技術部等等部門都會收到。
- 不易於管理,比如 HR 看到的信息,其他部門不應該能看到。
- 安全的威脅,由於所有部門都在一個廣播域,當其中一個部門出現安全隱患時,會蔓延到所有部門。
- 不容易排查問題
而 VLAN 的出現就是為了解決上述的問題。
VLAN
VLAN 翻譯成中文,是"虛擬局域網"。 LAN 可以是由少數幾家用計算機構成的網絡,也可以是數以百計的計算機構成的企業網絡。VLAN 所指的 LAN 特指使用路由器分割的網絡,也就是廣播域。
也就是說,由原來的二層交換機只能構建單一的廣播域,通過啟用 VLAN 后,能夠將網絡分割成多個廣播域。
在實現上,在交換機內部的 MAC 表,除了有 MAC 地址和對應的接口號外,還多了一列 VLAN 號,用於將廣播域隔離開,數據只在 VLAN 號相同的端口進行傳遞。
VLAN 號的介紹
VLAN TAG 包的 VLAN ID 號,有效范圍是 1-4094,0 和 4095 都為協議保留值,VLAN ID 0 表示不屬於任何VLAN,但攜帶 802.1Q 的優先級標簽,所以一般被稱為 Priority-only frame,其一般作為系統使用,用戶不可使用和刪除。
1 為系統默認 VLAN,即 Native VLAN。默認情況下,所有的接口都屬於 VLAN1. 當交換機收到未帶有 VLAN TAG 包的數據幀時,會將數據包轉發至 Native VLAN 端口。也就是說如果發送的數據包是 native Vlan 的話,在交換機之間傳遞時,並不需要打標簽。native vlan 的出現,是因為在早期鏈路帶寬較小,如果為每一個數據包都打上 tag,每個數據包都需要添加 4 Byte 的字段,有點浪費性能。所以將在 LAN 中通信較多 TAG 的數據包,設置成 native Vlan, 從而不用再繼續打 Tag.
2-1001 是普通的 VLAN,1006-1024 保留僅系統使用,用戶不能查看和使用,1002-1005是支持 fddi 和令牌環的 VLAN,1025-4095 是擴展的 VLAN。
中繼鏈路:是只承載標記數據(即具有 VLANID 標簽的數據包)的干線鏈路
VLAN 接口的類型
Access:
Access 類型的端口只能屬於一個 VLAN,用於連接終端設備。
Trunk:
Trunk 類型的端口可以允許多個 VLAN通過,可以接收和發送多個 VLAN 的報文,用於交換機之間的連接端口。
交換機使用 VLAN 的原理
Access 口的處理過程:
在收到終端設備發送的報文后,會先判斷是否帶有 VLAN 信息。
- 如果沒有,則加上該端口的 VLAN 號。
- 找到目的 MAC 的端口號,並且 VLAN 號也相同,則進行轉發,並去掉加上的 VLAN 信息。
- 找到目的 MAC (比如泛洪全 f),但是對應的接口 VLAN 號不滿足,則不進行轉發。
- 如果有,則丟棄(因為 Access 一般和終端設備直連,而 VLAN 信息都是交換機加上的,所以不會有 VLAN 信息。)
現在通過 Access 實現了隔離同一台交換機的之間的廣播域隔離,但如果想要在多台交換機隔離又該怎么辦呢?
為了實現在多台交換機的隔離,就需要將 VLAN 信息記錄下了,然后在傳遞的交換機進行判斷。在之前的數據鏈路層文章中介紹,用的協議主要是 Ethernet2 和 IEEE 的 802.3. 但對於這兩個協議來說,都不能進行標識 VLAN 的信息,所以為了實現在多台交換機上隔離的效果,就在這兩個協議中添加了一個 4Byte 的字段,用於表示 VLAN 信息。
其實 Type 字段:表示使用的協議,如 Ox8100 表示 802.1q .
Priority: 優先級字段,對數據幀分類,分級等,QoS 用到。
CFI:表示是否令牌環網數據。
VLAN ID:VLAN 號 (0 - 4095)
有了新添加的 VLAN 信息,將不同交換機連接起來的這條鏈路,就稱為 Trunk 鏈路。在 Trunk 中,可以預先設置上允許通信的 VLAN 號,在交換機間傳遞。
這條鏈路也被成稱為中繼鏈路(干路):在同一鏈路上,可以實現傳輸所有 VLAN 的數據。
Native VLAN:當交換機收到沒有 vlan 的信息數據包中,會將數據包發到默認的 native vlan 中。在連接的交換機中,要保證 native vlan 要一致。
Trunk 口的引入,處理過程:
在 Trunk 口收到數據時:
- 判斷是否有 VLAN 信息。
- 如果沒有則打上端口的 Native VLAN 號,並進行交換轉發。
- 如果有 VLAN 信息,並且該 Trunk 端口允許該 VLAN 的數據進入,則將報文帶有原有 VLAN 標記進行轉發,否則丟棄。
在 Trunk 口發出數據時:
- 比較端口的 Native VLAN 號和將要發送報文的 VLAN 號
- 如果兩者相等則剝離 VLAN 信息再發送。(也就是說發送的是本征 VLAN 時,trunk 端口會去除 VLAN 信息)
- 否則報文將攜帶原有的 VLAN 標記進行轉發。
為同一接口配置不同 VLAN 類型
有時會出現這樣的情況,為了方便會將多個終端設備接在一起,比如交換機和接口和一個 IP 電話相連,在電話的后面有着一台 PC。
這種意味着在一個 VLAN 中,有着不同種類的流量,一種是普通的數據流量,另一種是語音的流量。
為了區分這種流量,就需要對交換機額外配置下,第一次配置數據流量,第二次配置語音流量。但需要注意的是,雖然是不同類型的 VLAN,但卻配置在同一接口下。
![WeChat Screenshot_202007
也就是說,可以為同一接口配置不同種類的流量(不同的 VLAN 號),但是一個接口只能配置一個同一類別的 VLAN。
配置的注意事項
-
VLAN 號的最大值取決於使用的交換機。
-
VLAN 1 是默認 VLAN,也是管理 VLAN. 我們知道交換機是二層設備是沒有 IP 的,但實際上會有一個 IP,就是 VLAN 1 所虛擬出來的接口,可以為該接口配置一個 IP,作用就是作為網管使用,比如配合 Telnet 登錄,以及一些交換機之間的管理流量比如 VTP, DTP 等。注意 VLAN 1 有兩個作用,一個是管理作用,一個是作為默認的 Native VLAN. 兩個是完全不同的功能。
-
最好將 Native VLAN 改變其他的 VLAN 號。
-
Trunk 接口兩端的接口 Native VLAN 要一致。
-
最好為 Trunk 配置上允許的 VLAN,而不是默認允許所有。
通信過程
假設所有交換機都剛開機,PC 發出一個數據包經過交換機 SW1,交換機會打上 10 的 VLAN TAG 標記,然后交換機會把這個數據幀轉發給 VLAN = 10 的所有端口(除了進口),如下:
由於 SW1 的 Trunk 口包含 VLAN 10 ,並進行轉發,數據幀到達 SW3 后,e0/2 和 e 0/3 均為 trunk 口,發現可接受 TAG 為 10 的數據幀,直接進行轉發,如下:
SW2 的 trunk 口 e 0/3 同樣也能接受 VLAN = 10 的數據。並且在 e 0/0 的 access 口進行 untag。而 e 0/1 的 access 只能接受 VLAN = 20 的數據,所以不進行轉發。如下:
這樣 PC3 就正常接收到 PC1 的數據了。
DTP
DTP 是思科私有協議,用於動態的協商 Trunk 鏈路。在通常情況下,交換機之間的鏈路都是 Trunk 鏈路,所以就想通過一種協議,實現自動配置 Trunk 鏈路,從而簡化手工的配置,DTP 就是起到這個作用。
對於思科交換機設備來說,會默認啟動 DTP 協議。在接口打開后,會自帶一種狀態:
Auto 狀態:被動狀態,如果對方為 Trunk,並告知自己,自己也會變為 Trunk,如果對方也是被動,則自己也是被動。則該鏈路為 Access.
Desirable 狀態:主動狀態,會主動協商為 Trunk. 如果對方為被動,則為 Trunk,如果對方也為主動,也為 Trunk.
Trunk 狀態:固定為 Trunk 狀態。無論對方為主動,或被動或 Trunk 都為 Trunk。如果對方為 Access,則報錯。
Access 狀態:固定為 Access 狀態。無論對方為主動,或被動或 Access 都為 Access 。如果對方為 Trunk ,則報錯。
on 狀態:手動配置的狀態
sw2#show interfaces e0/0 trunk
Port Mode Encapsulation Status Native vlan
Et0/0 on 802.1q trunking 1
Port Vlans allowed on trunk
Et0/0 1-4094
Port Vlans allowed and active in management domain
Et0/0 1,10,20
Port Vlans in spanning tree forwarding state and not pruned
Et0/0 1,10,20
但在現網環境中,一般不開啟該協議。因為存在一定的安全隱患。比如如果對方設備為主動狀態,可以利用該協議的特性,讓原來應該為 Access 的鏈路,變為 Trunk 的鏈路。這時通過一些手段在自己的主機上修改數據包的內容,加上 TAG,從而發送不同 VLAN 的數據,使其不應該在網絡中傳遞的數據包在網絡中傳遞。
VTP
VTP 也是思科私有協議。用於方便創建,刪除,修改 VLAN. 看這樣一個場景,如果一家公司具有的交換機數量很多,這時想要對這些設備創建相同的 VLAN,如果才有手動的方式,是一件很復雜且容易出錯的事情。這時就可以通過 VTP 來實現。
VTP 采用 C/S 的架構,假如在 Server 進行了相關 VLAN 操作,則 Server 會將所有操作同步到所以 Client 上。同步的前提是所有設備在同一個域中。
VTP 公有三種模式:
- Server
- 增刪改 VLAN
- 同步 Server 配置給 Client
- Client
- 不用增刪改 VLAN
- 可以從 Server 同步 VLAN,也可以發給其他 Client
- Transparent
- 只能在本地增刪改 VLAN
- 不會從 Server 同步配置
# server 配置
int range e0/0-1
switch trunk encap dot1q
swirch mode trunk
# server 配置
vtp domain Cisco
vtp mode server
vlan 10
vlan 20
# client 配置
switch trunk encap dot1q
swirch mode trunk
vtp domin Cisco
vtp mode client
show vlan
需要注意的是,VTP 在同步存在一個風險問題,每次在 Server 修改 VLAN 時,會自動修改一個叫 version 的字段,每次操作該 version 都會加一。高版本的 version 會將低版本的 version 配置同步掉。
考慮這樣一個場景,公司機房由於升級,換上了更好性能的交換機。把原有的 Server 或 client 交換機撤下去。拿到其他場合使用,這時假如拿下的交換機的 version 比要用場合的設備 version 高,那么所有的低 version 的設備都會被同步掉。因為 server 和 client 都有同步的能力。
這就存在一定的隱患,所以一般在更換設備時,都需要將 vtp 的模式改成 Transparent,將 version 恢復成 0.
配置
# STEP1: set ip and name for every pc
PC> set pcname pc4
pc4> ip 10.1.1.1 255.255.255.0
# STEP2: Ping one of pc to test the connectivity
pc4:ping 10.1.1.4
# This means every pc in topography can be connected.
# So we have object that PCs under the same Vlan can communicate, but PCs under different VLAN can not.
# STEP3: Config Trunk in the sw1,sw2 and sw3.
sw1(config)# int range e0/1-2
sw1(config-if-range)# switchport trunk encapsulation dot1q
sw1(config-if-range)# switchport mode trunk
# you can see there are E0/0 and E0/3 Ports in default Vlan but no E0/1,E0/2 Prots.
# Because Trunk mode is configured for the 2,3 Ports.
sw1#show vlan
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/0, Et0/3
10 VLAN0010 active
20 VLAN0020 active
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
sw2(config)#int e0/0
sw2(config-if)# switchport trunk encapsulation dot1q
sw2(config-if)# switchport mode trunk
sw3(config)#int e0/0
sw3(config-if)# switchport trunk encapsulation dot1q
sw3(config-if)# switchport mode trunk
# STEP4:Add vlan 10,20 to each switch. and configure access mode for e0/1-2 ports in the sw2 and sw3.
sw1(config)# vlan 10
sw1(config)# vlan 20
sw2(config)# vlan 10
sw2(config)# vlan 20
sw2(config)# int e0/1
sw2(config-if)# switchport mode access
sw2(config-if)# switchport access vlan 10
sw2(config)# int e0/2
sw2(config-if)# switchport mode access
sw2(config-if)# switchport access vlan 20
sw2#show vlan
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Et0/3
10 VLAN0010 active Et0/1
20 VLAN0020 active Et0/2
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
# query the relationships between vlan and mac-address
sw2#show mac address-table
sw3(config)# vlan 10
sw3(config)# vlan 20
sw3(config)# int e0/1
sw3(config-if)# switchport mode access
sw3(config-if)# switchport access vlan 10
sw3(config)# int e0/2
sw3(config-if)# switchport mode access
sw3(config-if)# switchport access vlan 20
# STEP5:Test if VLAN is vaild.
pc4 pings pc6 is ok in the same vlan 10.
pc4 pings pc5 or pc7 is failed in the different vlan.
pc5 pings pc7 is ok in the same vlan 10.
pc5 pings pc4 or pc6 is failed in the different vlan.
拓展
問題:有這么一個要求,在 SW1 和 SW3 之間傳遞的數據不帶 VLAN10 的標簽
由於還需要保證雙方的通信,所以 SW1 與 SW3 之間的 TRUNK 是不能改變的,但是在 TRUNK 模式下,發送的 TRUNK 端口可以將本征 VLAN 的標簽去除,我們可以利用這個特點
改變本征 VLAN 時,在同一條鏈路時要同時改
//修改 SW1 e 0/2 端口
sw1(config-if)# switchport trunk native 10
//修改 SW3 e 0/2 端口
sw3(config-if)# switchport trunk native 10
通信過程
PC1 發送數據包進入,SW1 e0/0 的 access 端口,打上 vlan = 10 的標簽,SW1 匹配后,轉發到相應接口 e0/2,由於該接口的本征 VLAN 為10,又是發送的 TRUNK 端口,進而將 VlanID = 10 的標簽去除。如圖:
可以看到 SW1 與 SW3 鏈路中並沒有添加的 VLANID 標簽
在 SW3 e0/2 端口,收到沒有 VLAN Tag 的數據,因此進行 TAG 操作,此時數據包上帶有 VLAN = 10 的標簽,進行匹配后,e 0/3 對該數據進行轉發。如圖:
在 SW2 與 SW3 的鏈路上帶有 VLAN = 10 的標簽了,SW2 的 e0/3 接收到數據后進行轉發,交換機匹配后,e0/0 為 Access 口,對Tag 進行去除,緊着 PC3 收到數據.
總結
Access 口連接的是終端,Trunk 口連接的是交換機。
Access 口,解決的是在同一台交換機下,隔離廣播域的作用。
Trunk 口,解決的是在多台連接的交換機下,隔離廣播域的作用。
數據包在進入 Access 口時,會加上 VLAN TAG, 在 Access 輸出時,會將 TAG 拿掉。在 Trunk 口輸出時,VLAN TAG 不變。
數據包在進入 Trunk 口時,如果沒有 VLAN TAG 則會加上 Native VLAN,有的話直接轉發。 在 Access 輸出時,會將 TAG 拿掉,在 Trunk 輸出時,如果是 Native VLAN 則把 TAG 拿掉,不是的話直接轉發。