目錄

前言
需要 VLAN 的原因
VLAN 設定
Trunk Link
Allowed VLAN
VLAN 1
Native VLAN
VLAN Internal Usage

前言

相信大家都很清楚什麼是 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

VLAN 設定

在 Cisco Switch 設定 VLAN 超簡單的!我們會用以下網絡作例子。用 R1 至 R4 分別代表 4 台 Host,它們的 e0/0 分別設定成 192.168.1.1/24 至 192.168.1.4/24。

vlan

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。

vlan

首先我們要在 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。

vlan

設定方法也不複雜,首先確認一下兩隻 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。

vlan

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
---- --------------------
把 port 設定成 Layer 3 Port。看!VLAN 1006 被使用了。為什麼是 1006?因為系統預設會由 1006 開始遞增使用 VLAN ID 作 Internal 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