目录

前言
需要 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

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

然後把连接两只 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

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 这个指令之外,还有其他多种选择:

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 。必需注意的是,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