转载自[Virtual LAN (VLAN) 虚拟区域网络](https://www.jannet.hk/zh-Hans/post/virtual-lan-vlan/ "Virtual LAN (VLAN) 虚拟区域网络
本文转载已征得原作者同意
前言
相信大家都很清楚什么是 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
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。
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