目錄
前言
相信大家都很清楚什麼是 LAN,至於 VLAN (即 Virtual LAN),一個虛擬的 LAN 又是什麼意思呢?VLAN 可以把一個實體 LAN 分割成多個虛擬 LAN 使用,分割出來的 VLAN 是各自獨立的,VLAN 與 VLAN 之間互相無法溝通。VLAN 有兩個制式,就是 ISL (Inter-Switch Link) 和 IEEE 802.1q (下稱 802.1q)。ISL 是 Cisco 專有的,只有 Cisco 設備才能設定,802.1q 是公開的,任何廠商均可支援。由於 ISL 已經被剔出考試範圍了,本篇只集中討論 802.1q。
需要 VLAN 的原因
需要 VLAN 的原因主要有兩個,網絡效能與安全問題。
由於網絡裡會經常出現 Broadcast 封包,Broadcast 不僅會透過 Switch 傳送到 LAN 裡面每一個 Host,而且每一個收到 Broadcast 的 Host 都要花 Computing Power 去處理 Broadcast,這對整個網絡的效能都大打折扣。VLAN 可以把實體 LAN 分割,一個 VLAN 的 Broadcast Traffic 不會傳送到另一個 VLAN,每一個 VLAN 就變成是一個獨立的 Broadcast Domain,提升網絡效能。
另一方面,Broadcast 在網絡上散播亦有可能造成保安問題,只要下載一些 Packet Capture 軟件例如:Wireshark,即可打開 Broadcast 封包,窺探到其他 Host 的重要資訊,例如 IP Address 和 MAC Address,利用 VLAN 可以限制 Broadcast Traffic 只在信任的網絡中散播。
在下圖中可以看到,使用 Wireshark 對網絡進行監聽,從 Broadcast 封包中輕易看到發出封包 Host 的 MAC Address 和 IP Address 等重要資訊。
VLAN 設定
在 Cisco Switch 設定 VLAN 超簡單的!我們會用以下網絡作例子。用 R1 至 R4 分別代表 4 台 Host,它們的 e0/0 分別設定成 192.168.1.1/24 至 192.168.1.4/24。
hostname R1 ! interface Ethernet0/0 ip address 192.168.1.1 255.255.255.0
hostname R2 ! interface Ethernet0/0 ip address 192.168.1.2 255.255.255.0
hostname R3 ! interface Ethernet0/0 ip address 192.168.1.3 255.255.255.0
hostname R4 ! interface Ethernet0/0 ip address 192.168.1.4 255.255.255.0
當然,R1 可以 Ping 通 R2,R3 和 R4。
R1#ping 192.168.1.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 16/24/44 ms R1#ping 192.168.1.3 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.3, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 16/20/24 ms R1#ping 192.168.1.4 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.4, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 20/24/44 ms
現在試把 R1 和 R2 放進 VLAN 10,把 R3 和 R4 放進 VLAN 20。換句話說,我們要把 SW1 的 e0/0 和 e0/1 設定成 VLAN 10,然後把 e0/2 和 e0/3 設定成 VLAN 20。
首先我們要在 SW1 新增 VLAN 10 和 VLAN 20,10 和 20 我們喚作 VLAN ID,name 指令是設定 VLAN 的名稱,可有可無。
SW1#conf t Enter configuration commands, one per line. End with CNTL/Z. SW1(config)#vlan 10 SW1(config-vlan)#name Yellow SW1(config-vlan)#vlan 20 SW1(config-vlan)#name Green SW1(config-vlan)#exit
完成後用 show vlan 確認一下。VLAN 1,1002,1003,1004 和 1005 都是 default 的,暫且不用理會,看到有 10 和 20 就好了。
SW1#show vlan VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 1 default active Et0/0, Et0/1, Et0/2, Et0/3 Et1/0, Et1/1, Et1/2, Et1/3 Et2/0, Et2/1, Et2/2, Et2/3 Et3/0, Et3/1, Et3/2, Et3/3 10 Yellow active 20 Green active 1002 fddi-default act/unsup 1003 token-ring-default act/unsup 1004 fddinet-default act/unsup 1005 trnet-default act/unsup VLAN Type SAID MTU Parent RingNo BridgeNo Stp BrdgMode Trans1 Trans2 ---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------ 1 enet 100001 1500 - - - - - 0 0 10 enet 100010 1500 - - - - - 0 0 20 enet 100020 1500 - - - - - 0 0 1002 fddi 101002 1500 - - - - - 0 0 1003 tr 101003 1500 - - - - - 0 0 1004 fdnet 101004 1500 - - - ieee - 0 0 1005 trnet 101005 1500 - - - ibm - 0 0 Primary Secondary Type Ports ------- --------- ----------------- ------------------------------------------
下一步就把 e0/0 和 e0/1 放進 VLAN 10。
SW1(config)#int ethernet 0/0 SW1(config-if)#switchport access vlan 10 SW1(config-if)#int ethernet 0/1 SW1(config-if)#switchport access vlan 10
VLAN 20 的做法也是一樣。
SW1(config)#int ethernet 0/2 SW1(config-if)#switchport access vlan 20 SW1(config-if)#int ethernet 0/3 SW1(config-if)#switchport access vlan 20
再用 show vlan 確認。
SW1#sh vlan VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 1 default active Et1/0, Et1/1, Et1/2, Et1/3 Et2/0, Et2/1, Et2/2, Et2/3 Et3/0, Et3/1, Et3/2, Et3/3 10 Yellow active Et0/0, Et0/1 20 Green active Et0/2, Et0/3 1002 fddi-default act/unsup 1003 token-ring-default act/unsup 1004 fddinet-default act/unsup 1005 trnet-default act/unsup VLAN Type SAID MTU Parent RingNo BridgeNo Stp BrdgMode Trans1 Trans2 ---- ----- ---------- ----- ------ ------ -------- ---- -------- ------ ------ 1 enet 100001 1500 - - - - - 0 0 10 enet 100010 1500 - - - - - 0 0 20 enet 100020 1500 - - - - - 0 0 1002 fddi 101002 1500 - - - - - 0 0 1003 tr 101003 1500 - - - - - 0 0 1004 fdnet 101004 1500 - - - ieee - 0 0 1005 trnet 101005 1500 - - - ibm - 0 0 Primary Secondary Type Ports ------- --------- ----------------- ------------------------------------------
這時候再試試從 R1 ping 就只能 ping 通 R2 了,相反,R3 只能 ping 通 R4。原因很簡單,因為不同 VLAN 之間,Packet 不能互通。
R1#ping 192.168.1.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 20/266/776 ms R1#ping 192.168.1.3 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.3, timeout is 2 seconds: ..... Success rate is 0 percent (0/5) R1#ping 192.168.1.4 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.4, timeout is 2 seconds: ..... Success rate is 0 percent (0/5)
R3#ping 192.168.1.1 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.1, timeout is 2 seconds: ..... Success rate is 0 percent (0/5) R3#ping 192.168.1.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds: ..... Success rate is 0 percent (0/5) R3#ping 192.168.1.4 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.4, timeout is 2 seconds: !!!!! Success rate is 80 percent (4/5), round-trip min/avg/max = 16/19/20 ms
在現實應用中,我們習慣把不同的 Subnet IP 分配給不同的 VLAN,例如: VLAN 10 用 192.168.10.0/24,VLAN 20 用 192.168.20.0/24,很少會把同一個 Subnet 設在多於一個 VLAN 之中,。以上例子只是為了引證 VLAN 之間不互通才會這樣設定,請留意。
Trunk Link
上面看過單隻 Switch 對 VLAN 的處理,但如果 VLAN 跨越多隻 Switch,會出現什麼問題呢?試想想如果 SW1 把一些 Packet 丟給 SW2,SW2 怎麽分辨這些 Packet 是來自那一個 VLAN?如果它不知道這些 Packet 來自那個 VLAN,它自然不知道應該把這個 Packet 送到那個 VLAN 去。解決方法很簡單,只要在 Packet 寫上 VLAN 號碼 (VLAN ID) 才把 Packet 送走,其他 Switch 就可以憑這個 VLAN ID 知道 packet 的 VLAN,這就是所謂 802.1q VLAN Tag。VLAN Tag 是 Switch 在收到 Packet 時為它加上的一個標籤,目的是讓 Packet 在網絡中遊走時,所經過的 Switch 都可以查看這個 Packet 是屬於那一個 VLAN,從而把 Packet 送到真正需要接收這個 VLAN 的 Port。
而另外一個問題是,要傳送這些 VLAN Tag,我們需要把 Switch 與 Switch 之間的 Link 設定成 Trunk,因為只有 Trunk Link 才可以容納不同的 VLAN。設定 Trunk Link 的方法有很多,詳情請看 Dynamic Trunking Protocol (DTP) 教學,在此只介紹 Static 設定,即強制使其成為成為 Trunk Link。
設定方法也不複雜,首先確認一下兩隻 Switch 都已經建立需要處理的 VLAN ,留意 VLAN ID 必需相同,VLAN 名稱卻可不同,不過習慣會設定成一樣,不一樣似乎不太 make sense 吧……而且難管理。
SW1#show vlan VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 1 default active Et0/3, Et1/0, Et1/1, Et1/2 Et1/3, Et2/0, Et2/1, Et2/2 Et2/3, Et3/0, Et3/1, Et3/2 Et3/3 10 Yellow active Et0/0 20 Green active Et0/1 1002 fddi-default act/unsup 1003 token-ring-default act/unsup 1004 fddinet-default act/unsup 1005 trnet-default act/unsup <--Output Omitted-->
SW2#show vlan VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 1 default active Et0/3, Et1/0, Et1/1, Et1/2 Et1/3, Et2/0, Et2/1, Et2/2 Et2/3, Et3/0, Et3/1, Et3/2 Et3/3 10 Yellow active Et0/0 20 Green active Et0/1 1002 fddi-default act/unsup 1003 token-ring-default act/unsup 1004 fddinet-default act/unsup 1005 trnet-default act/unsup <--Output Omitted-->
然後把連接兩隻 Switch 的 Interface 設成 802.1q Trunk。
SW1(config)#int ethernet 0/2 SW1(config-if)#switchport trunk encapsulation dot1q SW1(config-if)#switchport mode trunk
SW2(config)#int ethernet 0/2 SW2(config-if)#switchport trunk encapsulation dot1q SW2(config-if)#switchport mode trunk
用 show interfaces trunk 可以確認那一條 Link 是 Trunk Link。至於下半部份關於 allowed VLAN 的設定一會再說。
SW1#show interfaces trunk Port Mode Encapsulation Status Native vlan Et0/2 on 802.1q trunking 1 Port Vlans allowed on trunk Et0/2 1-4094 Port Vlans allowed and active in management domain Et0/2 1,10,20 Port Vlans in spanning tree forwarding state and not pruned Et0/2 1,10,20
SW2#show interfaces trunk Port Mode Encapsulation Status Native vlan Et0/2 on 802.1q trunking 1 Port Vlans allowed on trunk Et0/2 1-4094 Port Vlans allowed and active in management domain Et0/2 1,10,20 Port Vlans in spanning tree forwarding state and not pruned Et0/2 1,10,20
於是 R1 可以 Ping 通相同 VLAN 的 R2,卻無法與其他 VLAN 溝通。
R1#ping 192.168.1.2 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.2, timeout is 2 seconds: !!!!! Success rate is 100 percent (5/5), round-trip min/avg/max = 100/150/212 ms R1#ping 192.168.1.3 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.3, timeout is 2 seconds: ..... Success rate is 0 percent (0/5) R1#ping 192.168.1.4 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.1.4, timeout is 2 seconds: ..... Success rate is 0 percent (0/5)
如果在 Trunk Link 進行 Packet Capture 的話會清楚看到 VLAN ID。
Allowed VLAN
我們可以設定 Trunk Link 只讓特定的 VLAN 通過,預設是 1-4094 全部可以通過的,如果想更改設定的話可在 Trunk Interface 使用 switchport trunk allowed vlan <vlan id>。
SW1(config-if)#switchport trunk allowed vlan 10,20,30 SW1(config-if)#end SW1#show interfaces trunk Port Mode Encapsulation Status Native vlan Et0/2 on 802.1q trunking 1 Port Vlans allowed on trunk Et0/2 10,20,30 Port Vlans allowed and active in management domain Et0/2 10,20 Port Vlans in spanning tree forwarding state and not pruned Et0/2 10,20
更改設定後用 show interfaces trunk 查看結果,下方有 3 行資料,意思如下:
- Vlans allowed on trunk 就是這條 Trunk allow 什麼 VLAN 通過,如上圖所示,我們允許了 VLAN 10,20 和 30 在這條 Trunk Link 通過。
- 至於 Vlans allowed and active in management domain 的意思是在這隻 Switch 上就只有 VLAN 10 和 20,雖然允許了 VLAN 10,20 和 30,實際上 VLAN 30 是過不了的。
- 而最後一行 Vlans in spanning tree forwarding state and not pruned,就是真正可通過的 VLAN,即 VLAN 10 和 20,Pruned 是 VTP 裡面的設定,留待 VLAN Trunking Protocol (VTP) 的教學再說。
除了用switchport trunk allowed vlan <vlan id> 這個指令之外,還有其他多種選擇:
SW1(config-if)#switchport trunk allowed vlan ? WORD VLAN IDs of the allowed VLANs when this port is in trunking mode add add VLANs to the current list all all VLANs except all VLANs except the following none no VLANs remove remove VLANs from the current list
add
保留原本的 Allowed VLAN 設定,再額外增加某些 VLAN
例子
原有設定: 1-100
指令: switchport trunk allowed vlan add 110-120
新設定: 1-100,110-120
all
允許全部 VLAN 1-4094 通過
例子
原有設定: 1-100
指令: switchport trunk allowed vlan all
新設定: 1-4094
except
允許全部 VLAN 1-4094 除了一些 VLAN 之外 (超難解的…看例子)
例子
原有設定: 1-100
指令: switchport trunk allowed vlan except 110-120
新設定: 1-109,121-4094
none
不允許任何 VLAN 通過
例子
原有設定: 1-100
指令: switchport trunk allowed vlan none
新設定: none
remove
保留原本的 Allowed VLAN 設定,再移除某些 VLAN
例子
原有設定: 1-100
指令: switchport trunk allowed vlan remove 20-30
新設定: 1-19,31-100
VLAN 1
VLAN 1 是一個預設的 VLAN,所有 Cisco Switch 皆有 VLAN 1,而所有 port 亦預設放於 VLAN 1 之中。VLAN 1 之神聖在於它除了和其他 VLAN 一樣可以傳送 data 之外,還負責傳送所謂 Control Plane Traffic,例如: VTP, CDP, PAgP 等。因此,基於保安考慮,VLAN 1 應避免給一般 HOST 使用,因為 HOST 利用 Packet Capture 軟件可以輕易 Capture 到 Control Plane 的重要資訊。
Native VLAN
另外,值得一提的是,VLAN 1 預設也是 Trunk Link 上的一個 Native VLAN,Natvie VLAN 的意思是 Switch 把這個 VLAN 的 Packet 送上 Trunk Link 時,是不會放入 VLAN Tag 的,這就有點玩野了,剛剛不是說我們要把在 Packet 放一個 VLAN ID 好讓其他 Switch 可以分辨嗎? 怎麽現在又有個 Native VLAN 不用 VLAN ID? 細心想想,道理很簡單,如果所有 2-4096 的 VLAN 都有 VLAN ID,只要 Trunk Link 兩邊的 Switch 都協議沒有 VLAN ID 的 Packet 就是 VLAN 1,那麽 VLAN 1 就算沒有 VLAN ID 也可以被區別出來。道理就像大家在不同顏色的數字球上寫上數字,紅色寫 2,黃色寫 3,藍色寫 4,那麽沒有顏色的透明就寫 1 吧。
所以當 VLAN 1 的 Packet 通過 Trunk Link,用 Packet Capture 軟件 Capture 也不會看到 VLAN ID 1,只會看見一個沒有 VLAN ID 的封包 (即沒有 Tag)。Native VLAN 的 ID 是可以設定的,如果老闆說: 今天我想 VLAN 100 是 Native VLAN,我們可在 Trunk Link 的兩邊 Interface 用 switchport trunk native vlan <vlan id>。必需注意的是,Trunk Link 兩邊 Interface 的 Native VLAN 必需相同,否則會造成 Native VLAN mismatch 的問題。
SW1(config-if)#switchport trunk native vlan 100 SW1(config-if)#exit SW1#show int trunk Port Mode Encapsulation Status Native vlan Et0/1 on 802.1q trunking 100
Native VLAN 1 好好的,為什麼要改呢? 其實我們要避免 Native VLAN 跟分配給 Port 的 VLAN 相同,如果相同的話有機會被 Double tagging attack (有機會再詳細探討)。要避免 Double Tag Attack,除了更改 Native VLAN 外,較簡單的方法就是不要把 VLAN 1 分配給 Port 使用啦。
VLAN Internal Usage
還有一個關於 VLAN 而很易被忽略的課題,就是系統會偷偷地使用了一些 VLAN 作內部用途,平時我們不容易察覺。系統什麼時候會私自用了 VLAN 呢?在 Multilayer Switch 使用 Layer 3 Port 的時候。
先用 show vlan internal usage 確認此刻並沒有 VLAN 被重作 Internal Usage。
SW1#show vlan internal usage VLAN Usage ---- --------------------
SW1(config)#int ethernet 0/1 SW1(config-if)#no switchport SW1(config-if)#end *Dec 3 11:15:24.478: %LINK-3-UPDOWN: Interface Ethernet0/1, changed state to up SW1#show vlan internal usage VLAN Usage ---- -------------------- 1006 Ethernet0/1
VLAN 1006 被系統霸佔了,此時如果想創建 VLAN 1006 的話便會收到錯誤訊息。
SW1#conf t Enter configuration commands, one per line. End with CNTL/Z. SW1(config)#vlan 1006 VLAN id: 1006 is an internal vlan id - cannot use it to create a VTP VLAN.
我們頂多可以把佔用規則由遞升改為遞減,指令是 vlan internal allocation policy descending 改了之後,下一次佔用就會由 4094 開始向下進行。
SW1(config)#vlan internal allocation policy descending SW1(config)#int range ethernet 1/1 - 2 SW1(config-if-range)#no switchport SW1(config-if-range)#end *Dec 3 11:27:17.794: %LINK-3-UPDOWN: Interface Ethernet1/1, changed state to up *Dec 3 11:27:17.798: %LINK-3-UPDOWN: Interface Ethernet1/2, changed state to up SW1#show vlan internal usage VLAN Usage ---- -------------------- 1006 Ethernet0/1 4093 Ethernet1/2 4094 Ethernet1/1
相關主題
Jan Ho 2016-12-02
Posted In: Layer 2 網絡技術
發佈留言