2.2 VLAN
在以太网LAN中,一台设备发送的广播数据包可以被一组设备收到,这些设备所构成的集合就是一个广播域(Broadcast Domain)。在没有虚拟LAN(VLAN)概念的交换机上,交换机只是将所有广播向除收到该数据帧的接口外的所有接口转发。因此,一个交换机上的所有接口都属于相同的广播域。如果交换机连接了其他的交换机或者集线器,那些交换机和集线器上的接口也都在相同的广播域中。
VLAN是为了管理而定义的,是指属于相同广播域的交换机接口子集。接口可被分组到一台和多台互连交换机上的不同VLAN中。通过创建多个VLAN,交换机能够创建多个大小有限的广播域。如此,一个VLAN中的设备所发送的广播,只能被转发到相同VLAN中的其他设备上;而不会被转发给其他VLAN中的设备。
对于VLAN和IP的设计来说,最佳方案是将VLAN和IP子网一一对应起来。简单来说,一个VLAN中的设备通常也在一个相对应的IP子网中。此外,还可以将多个子网放在一个VLAN中,使用路由器上的辅助IP地址实现VLAN和子网间的路由。最后,CCIE笔试更关注熟练使用技术的能力,所以本书假设一个VLAN使用一个子网,除非有特别说明。
二层交换机在属于相同VLAN的设备之间转发数据帧,但不会为属于不同VLAN中的两台主机转发数据帧。为了转发两个VLAN之间的数据,需要多层交换机(MLS)或路由器的介入。第6章将详述MLS。
2.2.1 VLAN配置
在运行Cisco IOS的交换机上,VLAN主要由其数值ID进行标识,这是在创建、修改或删除VLAN时唯一的必需参数。工程师可以为VLAN分配名称,以更好地进行标识;只是在CLI中能够用VLAN名代替VLAN ID的地方并不多。VLAN也有运行状态:可为活跃,这是默认状态,也可为休眠。休眠的VLAN是暂停的——也就是这个VLAN存在但并不工作。在休眠VLAN中的Access接口不能实现通信,会丢弃所有数据帧,这与属于不存在的VLAN的接口类似。将休眠VLAN变为活跃状态也就恢复了该VLAN中所有接口的正常通信。
在Cisco交换机网络中,配置VLAN只需要几个简单的步骤。
步骤1 创建VLAN,可选地配置其名称和状态。
步骤2 为该VLAN关联正确的接口。
然而难点在于后台任务根据Cisco VLAN Trunk协议(VLAN Trunking Protocol,VTP)的配置有所不同,以及使用正常ID范围的VLAN还是扩展ID范围的VLAN。
1.使用VLAN数据库模式创建VLAN
考虑例2-1所示案例,其中显示了在VLAN数据库配置模式下创建VLAN的基本方式。此配置模式在现在的交换机上是过时的,甚至已无法支持,但工程师仍可以在较老的Catalyst平台,以及安装了交换模块的ISR和ISR G2路由器上使用。工程师可以使用VLAN数据库配置模式创建VLAN,对每个VLAN进行基本的管理性设置,以及验证VTP配置信息。只有正常范围(VLAN 1~1005)的VLAN可在此模式中配置,VLAN配置由名为vlan.dat的文件存储在Flash中。通常,工程师应该尽可能避免使用VLAN数据库配置模式,也希望读者将来不会需要使用此模式;然而,仍然有一些交换机,甚至是近期部署在网络中的路由器,不支持这种在全局配置模式中配置VLAN的新方式。
例2-1展示了VLAN数据库的配置模式,给出了图2-1中Switch3上的配置。示例中创建了VLAN 21和VLAN 22。
例2-1 在VLAN数据库模式中创建VLAN——Switch3
! Below, note that Fa0/12 and Fa0/24 are missing from the list, because they have
! dynamically become trunks, supporting multiple VLANs.
Switch3# show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/3, Fa0/4
Fa0/5, Fa0/6, Fa0/7, Fa0/8
Fa0/9, Fa0/10, Fa0/11, Fa0/13
Fa0/14, Fa0/15, Fa0/16, Fa0/17
Fa0/18, Fa0/19, Fa0/20, Fa0/21
Fa0/22, Fa0/23
! Below, "unsup" means that this 2950 switch does not support FDDI and TR
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
! Below, vlan database moves user to VLAN database configuration mode.
! The vlan 21 command defines the VLAN, as seen in the next command output
! ( show current ), VLAN 21 is not in the "current" VLAN list.
Switch3# vlan database
Switch3(vlan)# vlan 21
VLAN 21 added:
Name: VLAN0021
! The show current command lists the VLANs available to the IOS when the switch
! is in VTP Server mode. The command lists the VLANs in numeric order, with
! VLAN 21 missing.
Switch3(vlan)# show current
VLAN ISL Id: 1
Name: default
Media Type: Ethernet
VLAN 802.10 Id: 100001
State: Operational
MTU: 1500
Backup CRF Mode: Disabled
Remote SPAN VLAN: No
! Lines omitted for brevity
! Next, note that show proposed lists VLAN 21. The vlan 21 command
! creates the definition, but it must be "applied" before it is "current".
Switch3(vlan)# show proposed
VLAN ISL Id: 1
Name: default
Media Type: Ethernet
VLAN 802.10 Id: 100001
State: Operational
MTU: 1500
Backup CRF Mode: Disabled
Remote SPAN VLAN: No
VLAN ISL Id: 21
Name: VLAN0021
Media Type: Ethernet
VLAN 802.10 Id: 100021
State: Operational
MTU: 1500
Backup CRF Mode: Disabled
Remote SPAN VLAN: No
! Lines omitted for brevity
! Next, you could apply to complete the addition of VLAN 21,
! abort to not make the changes and exit VLAN database mode, or
! reset to not make the changes but stay in VLAN database mode.
Switch3(vlan)# ?
VLAN database editing buffer manipulation commands:
abort Exit mode without applying the changes
apply Apply current changes and bump revision number
exit Apply changes, bump revision number, and exit mode
no Negate a command or set its defaults
reset Abandon current changes and reread current database
show Show database information
vla- Add, delete, or modify values associated with a single VLAN
vtp Perform VTP administrative functions.
! The apply command was used, making the addition of VLAN 21 complete.
Switch3(vlan)# apply
APPLY completed.
! A show current now would list VLAN 21.
Switch3(vlan)# vlan 22 name ccie-vlan-22
VLAN 22 added:
Name: ccie-vlan-22
! Above and below, some variations on commands are shown, along with the
! creation of VLAN 22, with name ccie-vlan-22 .
! Below, the vlan 22 option is used on show current and show proposed
! detailing the fact that the apply has not been done yet.
Switch3(vlan)# show current 22
VLAN 22 does not exist in current database
Switch3(vlan)# show proposed 22
VLAN ISL Id: 22
! Lines omitted for brevity
! Finally, the user exits VLAN database mode using CTRL-Z, which does
! not inherently apply the change. CTRL-Z actually executes an abort.
Switch3(vlan)# ^Z
2.使用配置模式将接口加入VLAN
要想使用VLAN,首先必须创建VLAN,之后再将交换机接口分配到VLAN中。例2-2展示了在Switch3上将接口与VLAN关联的方法。
注释:
在例2-1的最后,工程师还没有成功创建VLAN 22。但在例2-2中,假设VLAN 22已成功创建。
例2-2 分配接口到VLAN——Switch3
! First, the switchport mode access command configures respective interfaces for
! static access mode, and the switchport access vlan command assigns them into
! respective VLANs.
Switch3# conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch3(config)# int fa 0/3
Switch3(config-if)# switchport mode access
Switch3(config-if)# switchport access vlan 22
Switch3(config-if)# int fa 0/7
Switch3(config-if)# switchport mode access
Switch3(config-if)# switchport access vlan 21
Switch3(config-if)# ^Z
! Below, show vlan brief lists these same two interfaces as now being in
! VLANs 21 and 22, respectively.
Switch3# show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/4, Fa0/5
Fa0/6, Fa0/8, Fa0/9, Fa0/10
Fa0/11, Fa0/13, Fa0/14, Fa0/15
Fa0/20, Fa0/21, Fa0/22, Fa0/23
21 VLAN0021 active Fa0/7
22 ccie-vlan-22 active Fa0/3
! Lines omitted for brevity
! While the VLAN configuration is not shown in the running-config at this point,
! the switchport access command that assigns the VLAN for the interface is in the
! configuration, as seen with the show run int fa 0/3 command.
Switch3# show run int fa 0/3
interface FastEthernet0/3
switchport access vlan 22
switchport mode access
3.使用配置模式创建VLAN
至此,工程师已经在Switch3上创建了两个新VLAN(21和22),两个接口也属于正确的VLAN中。然而,所有基于Cisco IOS的较新交换机还能够使用其他方式创建VLAN,如例2-3所示,也就是使用配置模式。如果设备支持这种配置方式的话,这是工程师的首选,这也是配置扩展范围VLAN和私有VLAN的唯一方式。所有VLAN的设置都是在全局配置的vlan vlan-id配置部分进行配置。变更后的配置只有在工程师退出vlan模式后才会生效;这是在IOS CLI环境中,输入独立的命令后,变更并不会立即生效的少数情况之一。
例2-3 在配置模式中创建VLAN——Switch3
! First, VLAN 31 did not exist when the switchport access vlan 31 command was
! issued. As a result, the switch both created the VLAN and put interface fa0/8
! into that VLAN. Then, the vlan 32 global command was used to create a
! VLAN from configuration mode, and the name subcommand was used to assign a
! non-default name.
Switch3# conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch3(config)# int fa 0/8
Switch3(config-if)# switchport mode access
Switch3(config-if)# switchport access vlan 31
% Access VLAN does not exist. Creating vlan 31
Switch3(config-if)# exit
Switch3(config)# vlan 32
Switch3(config-vlan)# name ccie-vlan-32
Switch3(config-vlan)# ^Z
Switch3# show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/4, Fa0/5
Fa0/6, Fa0/9, Fa0/10, Fa0/11
Fa0/13, Fa0/14, Fa0/15, Fa0/16
Fa0/17, Fa0/18, Fa0/19, Fa0/20
Fa0/21, Fa0/22, Fa0/23
21 VLAN0021 active Fa0/7
22 ccie-vlan-22 active Fa0/3
31 VLAN0031 active Fa0/8
32 ccie-vlan-32 active
! Portions omitted for brevity
例2-3显示了如何使用switchport access vlan子命令创建VLAN,并分配接口给该VLAN。注意在例2-3中,show vlan brief的输出内容显示出接口Fa0/8在VLAN 31中。因为尚未给VLAN 32分配接口,例2-3的最后一行没有显示任何接口信息。
4.修改VLAN的操作状态
VLAN的状态——活跃或休眠——可以在vlan database和配置模式中进行控制。一个VLAN可通过两种方式休眠:在整个VTP域中使用全局方式,以及在一台交换机上使用本地方式,该方式并不会影响其所在VTP域中,其他交换机的状态。工程师可以在vlan database和配置模式中使用命令state suspend,可以在全局环境中让某个VLAN休眠。要在本地将某个VLAN休眠,也称为“本地关闭VLAN”,工程师可以使用shutdown命令,只能在VLAN配置模式中使用该命令。请勿混淆VLAN中的shutdown命令和interface Vlan模式下的shutdown命令,两者的含义不同,也没有任何关系(后者表示关闭一个SVI而不妨碍相应VLAN自身的操作)。工程师可以独立地配置全局和本地的VLAN状态,但若要让一个VLAN在一台交换机上正常工作,它在这台交换机上必须全局和本地都处于活跃状态。例2-4中进一步展示了VLAN操作状态的控制及相关命令的使用。
在大型网络中,VLAN的创建过程虽简单但费事。如果存在许多VLAN,并且存在于多个交换机上,相比于在每台交换机上手动配置VLAN,工程师还可以使用VTP分发VLAN配置信息给其余的交换机。VTP将在本章稍后进行讨论。
例2-4 修改VLAN的操作状态
! First, put the VLAN 21 to global suspended state in vlan database mode. The state
! will be propagated by VTP to all switches in the VTP domain if VTP is used.
Switch3# vlan database
Switch3(vlan)# vlan 21 state ?
active VLAN Active State
suspend VLAN Suspended State
Switch3(vlan)# vlan 21 state suspend
VLAN 31 modified:
State SUSPENDED
Switch3(vlan)# exit
APPLY completed.
Exiting....
! VLAN 21 will now be listed as suspended
Switch3# show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/4, Fa0/5
Fa0/6, Fa0/9, Fa0/10, Fa0/11
Fa0/13, Fa0/14, Fa0/15, Fa0/16
Fa0/17, Fa0/18, Fa0/19, Fa0/20
Fa0/21, Fa0/22, Fa0/23
21 VLAN0021 suspended Fa0/7
! Portions omitted for brevity
! Now use the configuration mode to reactivate the VLAN
Switch3# conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch3(config)# vlan 21
Switch3(config-vlan)# state active
Switch3(config-vlan)# exit
Switch3(config)# do show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/4, Fa0/5
Fa0/6, Fa0/9, Fa0/10, Fa0/11
Fa0/13, Fa0/14, Fa0/15, Fa0/16
Fa0/17, Fa0/18, Fa0/19, Fa0/20
Fa0/21, Fa0/22, Fa0/23
21 VLAN0021 active Fa0/7
! Portions omitted for brevity
! To locally suspend a VLAN, enter its configuration context and issue
! the shutdown command, then exit. Alternatively, you may also use the
! shutdown vlan global level configuration command that has exactly
! the same effect. In the VLAN listing, the VLAN 21 will be reported as
! active in the VTP domain on other switches, yet locally shutdown.
! It is also possible to both use the state suspend to suspend the VLAN
! via VTP globally, and shutdown to also have it locally shut down.
Switch3(config)# vlan 21
Switch3(config-vlan)# shutdown
Switch3(config-vlan)# exit
Switch3(config)# do show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/4, Fa0/5
Fa0/6, Fa0/9, Fa0/10, Fa0/11
Fa0/13, Fa0/14, Fa0/15, Fa0/16
Fa0/17, Fa0/18, Fa0/19, Fa0/20
Fa0/21, Fa0/22, Fa0/23
21 VLAN0021 act/lshut Fa0/7
! Portions omitted for brevity
! To reactivate the locally shut VLAN, enter the no shutdown command in vlan 21
! context, or more straightforward, enter the no shutdown vlan 21 command
Switch3(config)# no shutdown vlan 21
Switch3(config)# do show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Fa0/1, Fa0/2, Fa0/4, Fa0/5
Fa0/6, Fa0/9, Fa0/10, Fa0/11
Fa0/13, Fa0/14, Fa0/15, Fa0/16
Fa0/17, Fa0/18, Fa0/19, Fa0/20
Fa0/21, Fa0/22, Fa0/23
21 VLAN0021 active Fa0/7
! Portions omitted for brevity
2.2.2 私有VLAN
工程师在设计VLAN的时候可能有许多目标。在现如今的许多环境中,最终处于同一个VLAN的设备只是由设备线缆的物理接入位置决定的。安全性是使用VLA的另一个动机:不同VLAN中的设备无法窃听对方的广播和其他可能的通信。此外,将主机分割到不同的VLAN和子网中,并要求在子网之间使用路由器或多层交换机,因为这些类型的设备通常能够提供更强大的安全功能。
无论工程师出于何种原因,将设备分组到不同的VLAN,好的设计方式通常要求工程师为每个VLAN使用一个IP子网。然而在有些情况下,将设备分割到许多小VLAN中以增加安全性的需求,与节省可用IP子网的目标相互冲突。RFC 5517中描述的Cisco私有VLAN特性解决了该问题。通过使用私有VLAN,交换机能够分离接口,就好像它们位于不同的VLAN中,但同时这些接口共同属于同一个子网。
私有VLAN最常见的部署是在服务提供商(SP),SP使用私有VLAN技术来提供多租户服务。SP可以只部署一台路由器和一台交换机,然后将多个客户的设备连接到交换机上。SP可以对整个大楼只使用一个子网,通过使用私有VLAN,将不同客户的交换机接口相互隔离,使其不能直接进行通信,并使用一台路由器和交换机支持所有客户。
从概念上讲,私有VLAN是一种机制,将特定VLAN划分成任意数量的不会相互重叠的子VLAN,或二级VLAN(Secondary VLAN)。划分过程对于外部网络是不可见的,外部网络只能看到原始的VLAN,称为主VLAN(Primary VLAN)。私有VLAN划分的一个重要结果是,从外部看主VLAN继续使用与原始VLAN相同的VLAN ID和IP子网。在内部,所有二级VLAN共用一个IP子网,而每个二级VLAN都使用不同且唯一的VLAN ID与主VLAN相互关联。因此,可以将私有VLAN描述为一个或多个二级VLAN的集群,展示给外部的是一个主VLAN。这与BGP联盟不同,BGP联盟中多个内部子AS作为单个AS展示给外部对等体。考虑图2-2所示的拓扑。
首先考虑一台交换机上的私有VLAN行为。之后将讨论如何通过Trunk将私有VLAN扩展到多个交换机。
二级VLAN可以分为两种类型:团体(Community)VLAN和隔离(Isolated)VLAN。属于相同团体VLAN的接口之间可以直接互相通信,但不能与其他VLAN中的接口直接通信。这种行为与普通VLAN相似。一个主VLAN可以与多个团体VLAN关联,每个团体VLAN代表一组设备,它们之间可以直接通信,但不能与其他组的设备直接通信。
另一方面,属于隔离VLAN的接口之间既不能互相通信,也不能与其他VLAN中的接口通信。一个主VLAN最多可以关联一个隔离VLAN,一个主VLAN关联多个隔离VLAN并没有什么意义。
一个主VLAN可以与零个或多个团体VLAN,以及最多一个隔离VLAN相关联。无论是团体VLAN还是隔离VLAN,一个二级VLAN必须只与一个主VLAN相关联。
举例来说,假设有一栋公寓楼需要完全联网,由工程师负责配置网络设备。最简单的方式是将所有公寓都连接到一台交换机,并为所有接口分配一个VLAN,比如VLAN 100.统一使用IP子网192.168.100.0/24。VLAN中的所有工作站共享该IP地址空间,并且它们之间可以直接通信;它们使用同一子网中的网关IP地址,比如192.168.100.254,来访问其他网络。然而,这样的网络有明显的安全性问题——独立公寓中的用户不可控也不能被信任。一个公寓住户的误操作,或者他使用了被感染的计算机,就可以对整个VLAN造成破坏。因此要求独立的公寓互相隔离,但仍继续使用之前的VLAN 100、相同的IP子网以及相同的默认网关。这可以通过创建一个新的二级隔离VLAN来实现,比如VLAN 199,将其与原始的VLAN 100相关联(使VLAN 100成为主VLAN),并将所有连接公寓的Access接口分配到隔离VLAN 199中。这样,独立的公寓之间将会相互隔离,但它们仍继续使用相同的IP地址空间和默认网关。外部世界将看不到任何区别。
然而生活并没有那么简单。有些用户可能在一段时间后找到工程师,要求同其他一些用户之间建立直接的可见性,因为他们希望共享文件、流媒体视频或玩网络游戏。可能会有许多相似的用户组希望他们之间能够建立相互的可见性,同时保持与其他用户的隔离。例如,考虑有3组独立的用户要求在楼内建立他们之间相互的连通性。显然,这些用户分别组成了3个团体,一个团体中的用户相互之间拥有完全的可见性,同时保持与其他团体以及与不属于任何团体的用户相互隔离。
能够满足这个需求的做法是创建3个二级团体VLAN,每个团体对应一个VLAN,并将每个团体中的成员分配到相同的团体VLAN中。在这个案例中,工程师可以为第一个组分配团体VLAN 101,为第二个团体分配团体VLAN 102,为其他组分配团体VLAN 103。二级团体VLAN 101~103与主VLAN 100相关联,共享IP地址空间和默认网关。所有其他的公寓仍属于隔离VLAN 199,保持完全隔离。
根据交换机接口所属二级VLAN的类型,可以将接口称为团体接口或隔离接口。在之前的例子中,配置在VLAN 101~103中的交换机接口是团体接口,配置在VLAN 199中的交换机接口是隔离接口。注意以上提及的接口都不在主VLAN 100中。团体接口和隔离接口都像正常的Access接口一样操作——从技术上说,它们属于单个VLAN且它们不标记数据帧。
根据上述的通信规则,某个团体VLAN中的主机只能与相同团体VLAN中的其他主机直接通信;某个隔离VLAN中的主机不能与任何主机直接通信。也就是说,到现在为止它不可能与私有VLAN外部的网络通信,也不能访问共享资源,比如网络打印机、存储或服务器。显然,这种VLAN的可用性是非常值得商榷的。因此,必须想办法定义一个特殊接口,使它能够与某个主VLAN下的任何二级VLAN的任何成员进行通信。连接到这种接口的设备——路由器、服务器、NAS、打印机等——可以被某个主VLAN下的所有二级VLAN中的所有主机访问,无论二级VLAN类型如何。
在私有VLAN的术语中,这种接口称为杂合接口。杂合接口不与任何具体的二级VLAN关联,而是与对应主VLAN关联。连接到杂合接口的设备可以与这个主VLAN关联的所有二级VLAN中的设备通信,反之亦然。与某个主VLAN关联的二级VLAN中的设备也可以与这个主VLAN中的所有杂合接口通信。如果主VLAN中有多个杂合接口,它们之间也可以互相通信。杂合接口的操作方式也和Access接口相似,它也不打标签。
在之前的示例中,如果默认网关192.168.100.254是外部路由器,工程师就会将它连接到配置有私有VLAN交换机的杂合接口上。此设置将允许VLAN 101~103和VLAN 199中的主机通过这台路由器与其他网络进行通信。
如果使用私有VLAN,一台交换机上的通信规则可以总结如下:
某个团体VLAN中的接口(即团体接口)可以与所有相同团体中的其他接口,以及相应主VLAN中的所有杂合接口进行通信;
某个隔离VLAN中的接口(即隔离接口)可以与相应主VLAN中的所有杂合接口进行通信;
某个主VLAN中的接口(即杂合接口)可以与同一主VLAN中的所有其他杂合接口,以及所有与此主VLAN关联的二级VLAN中的所有接口进行通信。
在一组交换机上扩展私有VLAN的操作是非常简单的。最根本的目标就是在增加私有VLAN范围的同时,保留其定义的行为及限制。某个团体VLAN中的接口应该可以与同一团体VLAN中的其他接口,以及所有交换机上相应主VLAN中的所有杂合接口进行通信。某个主VLAN中的杂合接口应该可以与这个主VLAN中的所有其他杂合接口,以及所有交换机上关联的所有二级VLAN中的所有接口进行通信。由于这些要求默认假设一个主VLAN或二级VLAN接口收到的数据帧可以通过Trunk接口转发到其他交换机上,因而建立了另一个通信规则:杂合、团体或隔离接口上收到的数据帧总是可以通过Trunk接口转发。
显然,如果主/二级VLAN、它们的ID、类型以及关联关系,在所有交换机(假设它们都支持私有VLAN特性)上的配置都相同的话,在它们针对某个VLAN建立了成员关系后,它们对数据帧会使用一致的操作行为。因为交换机之间的数据帧是通过Trunk接口传输的,所以了解如何在私有VLAN接口收到的数据帧上进行标记是很重要的。
如果交换机在团体或隔离接口上收到了数据帧,并且要通过Trunk转发这个数据帧,交换机会使用相应二级VLAN的VLAN ID标记数据帧。接收交换机将根据二级VLAN类型进一步转发收到的数据帧。
如果交换机在杂合接口上收到了数据帧,并且要通过Trunk转发这个数据帧,交换机会使用相应主VLAN的VLAN ID标记数据帧。接收交换机将按照对待来自杂合接口的数据帧的方式来转发数据帧。
私有VLAN中的通信和标记规则总结如下:
属于某个团体VLAN的接口(即团体接口)可以与同一团体VLAN中的所有其他接口、相应主VLAN中的所有杂合接口,以及所有Trunk接口进行通信;
属于某个隔离VLAN的接口(即隔离接口)可以与相应主VLAN中的所有杂合接口,以及所有Trunk接口通信;
某个主VLAN中的接口(即杂合接口)可以与同一主VLAN中的所有其他杂合接口、所有与此主VLAN关联的二级VLAN中的接口,以及所有Trunk接口通信;
在将从团体或隔离接口上接收到的数据帧从Trunk接口转发出去时,交换机会使用相应二级VLAN的ID标记数据帧;
在将从杂合接口上接收到的数据帧从Trunk接口转发出去时,交换机会使用相应主VLAN的ID标记数据帧;
从Trunk接口上收到有团体或隔离VLAN ID标记的数据帧后,交换机会按照本地相应的二级VLAN的团体或隔离接口的操作规则进行转发;
从Trunk接口上收到有主VLAN ID标记的数据帧后,交换机会按照本地相应主VLAN杂合接口的操作规则进行转发;
团体VLAN可被看作是承载“上行”流量的VLAN,“上行”流量是指一台主机发往同一团体VLAN主机,以及发往相应主VLAN杂合接口主机的流量。隔离VLAN也可被看作是承载“上行”流量的VLAN,这里的“上行”流量是指一台主机发往相应主VLAN杂合接口的流量。主VLAN可被看作是承载“下行”流量的VLAN,“下行”流量是指杂合接口发往其他杂合接口,以及发往所有关联二级VLAN中主机的流量。
表2-2总结了不同接口间的通信规则。
1团体VLAN和隔离VLAN是二级VLAN。
2杂合接口在主VLAN中,可以与其他所有接口通信。
关于私有VLAN在Trunk链路上的操作有两种常见的误解。第一种误解与标记有关。很多人通常会错误地认为私有VLAN会在Trunk上使用双标记。这种想法由二级VLAN嵌套在相关主VLAN中的理念而来。事实上,二级VLAN不在主VLAN“内部”;它们只是与其关联而已。这种关联只表示为:二级VLAN中收到的数据帧可以被转发给相关主VLAN中的杂合接口,反之亦然。
第二种误解与Trunk接口的类型有关。至此,本书已经描述了用于普通VLAN及私有VLAN的普通Trunk(switchport mode trunk)。然而,私有VLAN有两种特殊类型的Trunk接口,分别称为杂合PVLAN Trunk接口,以及隔离PVLAN Trunk接口。工程师不应该在支持私有VLAN的交换机之间,将这两种类型的接口用在普通的私有VLAN部署中;它们的使用仅限于一些特定的情形。为了更好地理解,参见图2-3,这个拓扑稍微修改了一些,其中VLAN 100是主VLAN,VLAN 101和102是团体VLAN,VLAN 199是隔离VLAN。此外,还有VLAN 999作为管理VLAN,跨越了路由器以及两台交换机。假设SW1交换机支持私有VLAN,而SW2不支持。
第一种特殊的Trunk类型是杂合PVLAN Trunk。当二级VLAN中的数据帧要从这样的Trunk接口发出时,它的VLAN标记将被改写为适当的主VLAN ID。当这个Trunk链路承载包含私有VLAN在内的多个VLAN,并且它连接的外部设备并不支持私有VLAN时,就需要进行重写;这样私有VLAN也可以访问外部设备,就好像外部设备连接在杂合接口一样。例如图2-3中的单臂路由器R1,它负责路由多个VLAN的流量,其中包括主VLAN,这个外部路由器不知道多个二级VLAN实际上映射到一个主VLAN。杂合PVLAN Trunk接口会把所有二级VLAN ID转换成对应的主VLAN ID,这样外部路由器就总是只能看到主VLAN。
第二种特殊的Trunk类型是隔离PVLAN Trunk。这种Trunk类型会将主VLAN ID转换为与主VLAN关联的隔离VLAN的ID。这样做就可以通过承载多VLAN的Trunk链路,将隔离VLAN扩展到并不支持PVLAN特性,但却能够隔离自己接口的交换机上。入门级的Catalyst交换机不支持私有VLAN,但支持所谓的保护接口(此特性有时被称为私有VLAN边界)。在这些交换机上,工程师可以使用switchport protected命令配置保护接口特性。配置了此命令的保护接口之间禁止互相通信——实质上,它们就像是隔离接口一样。如果主VLAN中的杂合接口收到了一个数据帧,并且交换机要从隔离PVLAN Trunk接口将其转发出去,这个数据帧当前主VLAN的VLAN标记会被重写为隔离VLAN ID。如果邻接交换机将保护接口分配给了隔离VLAN(由于不支持私有VLAN,该VLAN并未配置为隔离VLAN),它就能够将数据帧转发到正确的主机。在图2-3中,工程师使用隔离PVLAN Trunk,将隔离PVLAN 199从SW1扩展到不支持PVLAN的SW2上,SW2在本地隔离了VLAN 199中的接口。SW2不允许这些接口之间进行通信,但是允许它们与连接SW1的Trunk接口进行通信。SW1确保在VLAN 199中另一个隔离接口上收到的数据帧,并不会被从连接SW2的隔离PVLAN Trunk转发出去,而且保证从SW2隔离PVLAN Trunk发来的带有VLAN 199标记的数据帧,并不会被转发到相同二级VLAN中的任何其他隔离接口。这样一来,隔离二级VLAN就被扩展到了SW2,并且没有丢失其隔离属性。然而,如果R1或任何其他杂合接口上的设备想要向SW2上的站点发送数据包,这些数据包会正常地使用主VLAN 100标记。然而在SW1的隔离PVLAN Trunk上,标记100将被重写为199并转发给SW2,从而允许杂合Trunk上的R1能够与SW2上的站点进行通信。
所以实质上,这些Trunk的特殊性在于它们执行的标记重写行为:
杂合PVLAN Trunk接口在发送数据帧时,将二级VLAN ID重写为主PVLAN ID。当收到数据帧时,交换机不执行标记操作。而且,也不对普通VLAN的数据帧执行标记操作;
隔离PVLAN Trunk接口在发送数据帧时,将主VLAN ID重写为隔离二级VLAN ID。当收到数据帧时,交换机不执行标记操作。而且,也不对普通VLAN的数据帧执行标记操作。
只有特定类型的高端Catalyst交换机能够支持特殊的私有VLAN Trunk类型。
例2-5显示了私有VLAN的交换机配置。普通Trunk的配置未显示。
例2-5 配置私有VLAN
! If not running VTPv3, a switch must be put into VTP Transparent mode before
! configuring Private VLANs
AccessSw(config)# vtp mode transparent
Setting device to VTP Transparent mode for VLANS.
! One isolated secondary VLAN and three community secondary VLANs will now be
! created. Afterwards, they will be associated with the primary VLAN 100.
AccessSw(config)# vlan 199
AccessSw(config-vlan)# name Isolated
AccessSw(config-vlan)# private-vlan isolated
AccessSw(config-vlan)# vlan 101
AccessSw(config-vlan)# name Community1
AccessSw(config-vlan)# private-vlan community
AccessSw(config-vlan)# vlan 102
AccessSw(config-vlan)# name Community2
AccessSw(config-vlan)# private-vlan community
AccessSw(config-vlan)# vlan 103
AccessSw(config-vlan)# name Community3
AccessSw(config-vlan)# private-vlan community
AccessSw(config-vlan)# vlan 100
AccessSw(config-vlan)# name Primary1
AccessSw(config-vlan)# private-vlan primary
AccessSw(config-vlan)# private-vlan association 101-103,199
AccessSw(config-vlan)# exit
! The show vlan private-vlan command is useful to verify the types and associations
! of private VLANs and their member ports. At this moment, there are no ports
! assigned to these VLANs yet.
AccessSw(config)# do show vlan private-vlan
Primary Secondary Type Ports
------- --------- ----------------- ------------------------------------------
100 101 community
100 102 community
100 103 community
100 199 isolated
! Now, ports will be assigned to these VLANs:
! Fa0/1 - 3: Secondary community VLAN 101
! Fa0/4 - 5: Secondary community VLAN 102
! Fa0/6 - 8: Secondary community VLAN 103
! Fa0/9 - 12: Secondary isolated VLAN 199
! Fa0/13: Promiscuous port in primary VLAN 100
! For brevity purposes, only the configuration of Fa0/1 - 3 will be shown, as all
! other ports in secondary VLANs, isolated or community, are configured similarly
! Afterwards, show vlan private-vlan is issued to verify the port assignment.
! As Fa0/13 is a promiscuous port, it will be shown in all associated secondary
! VLANs
AccessSw(config)# interface range fa0/1 - 3
AccessSw(config-if-range)# switchport mode private-vlan host
AccessSw(config-if-range)# switchport private-vlan host-association 100 101
AccessSw(config-if-range)# interface fa0/13
AccessSw(config-if)# switchport mode private-vlan promiscuous
AccessSw(config-if)# switchport private-vlan mapping 100 101-103,199
AccessSw(config-if)# do show vlan private-vlan
Primary Secondary Type Ports
------- --------- ----------------- ------------------------------------------
100 101 community Fa0/1, Fa0/2, Fa0/3, Fa0/13
100 102 community Fa0/4, Fa0/5, Fa0/13
100 103 community Fa0/6, Fa0/7, Fa0/8, Fa0/13
100 199 isolated Fa0/9, Fa0/10, Fa0/11, Fa0/12, Fa0/13
! If a SVI is used as a gateway for devices associated with the primary VLAN 100,
! it must also be configured as promiscuous
AccessSw(config-if)# interface Vlan100
AccessSw(config-if)# private-vlan mapping 101-103,199
AccessSw(config-if)# ip address 192.168.100.254 255.255.255.0