之前在对交换机的介绍中,我们知道交换机的作用就是隔离广播域,在不需要跨网段传输时,在同一子网中转发数据包从而进行通信。实现的核心原理就是在交换机中拥有一张 MAC 表,记录了对应终端设备和接口之间的关系。

今天会在此基础上,介绍 VLAN 的概念,先来看这样一个设计很不好的网络,假设这是一家公司的拓扑图:

可以发现,公司的每个部门之间和核心交换机相连,这就会造成很大的问题:

  • 非常大的广播域 – 广播非常消耗资源,特别是广播域很大的情况,比如 HR 部门发送一条广播,市场部,技术部等等部门都会收到。
  • 不易于管理,比如 HR 看到的信息,其他部门不应该能看到。
  • 安全的威胁,由于所有部门都在一个广播域,当其中一个部门出现安全隐患时,会蔓延到所有部门。
  • 不容易排查问题

而 VLAN 的出现就是为了解决上述的问题。

VLAN

VLAN 翻译成中文,是”虚拟局域网”。 LAN 可以是由少数几家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN 所指的 LAN 特指使用路由器分割的网络,也就是广播域。

也就是说,由原来的二层交换机只能构建单一的广播域,通过启用 VLAN 后,能够将网络分割成多个广播域。

在实现上,在交换机内部的 MAC 表,除了有 MAC 地址和对应的接口号外,还多了一列 VLAN 号,用于将广播域隔离开,数据只在 VLAN 号相同的端口进行传递。

VLAN 号的介绍

VLAN TAG 包的 VLAN ID 号,有效范围是 1-4094,0 和 4095 都为协议保留值,VLAN ID 0 表示不属于任何VLAN,但携带 802.1Q 的优先级标签,所以一般被称为 Priority-only frame,其一般作为系统使用,用户不可使用和删除。

1 为系统默认 VLAN,即 Native VLAN。默认情况下,所有的接口都属于 VLAN1. 当交换机收到未带有 VLAN TAG 包的数据帧时,会将数据包转发至 Native VLAN 端口。

2-1001 是普通的 VLAN,1006-1024 保留仅系统使用,用户不能查看和使用,1002-1005是支持 fddi 和令牌环的 VLAN,1025-4095 是扩展的 VLAN。

中继链路:是只承载标记数据(即具有 VLANID 标签的数据包)的干线链路

VLAN 接口的类型

Access:
Access 类型的端口只能属于一个 VLAN,用于连接终端设备

Trunk:
Trunk 类型的端口可以允许多个 VLAN通过,可以接收和发送多个 VLAN 的报文,用于交换机之间的连接端口。

交换机使用 VLAN 的原理

Access 口的处理过程:

在收到终端设备发送的报文后,会先判断是否带有 VLAN 信息。

  1. 如果没有,则加上该端口的 VLAN 号。
    1. 接着找到目的 MAC 的端口号,并且 VLAN 号也相同,则进行转发,并去掉加上的 VLAN 信息。
    2. 如果找到目的 MAC (比如泛洪全 f),但是对应的接口 VLAN 号不满足,则不进行转发。
  2. 如果有,则丢弃(因为 Access 一般和终端设备直连,而 VLAN 信息都是交换机加上的,所以不会有 VLAN 信息。)

现在通过 Access 实现了隔离同一台交换机的之间的广播域隔离,但如果想要在多台交换机隔离又该怎么办呢?

为了实现在多台交换机的隔离,就需要将 VLAN 信息记录下了,然后在传递的交换机进行判断。在之前的数据链路层文章中介绍,用的协议主要是 Ethernet2 和 IEEE 的 802.3. 但对于这两个协议来说,都不能进行标识 VLAN 的信息,所以为了实现在多台交换机上隔离的效果,就在这两个协议中添加了一个 4Byte 的字段,用于表示 VLAN 信息。

其实 Type 字段:表示使用的协议,如 Ox8100 表示 802.1q .

Priority: 优先级字段,对数据帧分类,分级等,QoS 用到。

CFI:表示是否令牌环网数据。

VLAN ID:VLAN 号 (0 – 4095)

有了新添加的 VLAN 信息,将不同交换机连接起来的这条链路,就称为 Trunk 链路。在 Trunk 中,可以预先设置上允许通信的 VLAN 号,在交换机间传递。

这条链路也被成称为中继链路(干路):在同一链路上,可以实现传输所有 VLAN 的数据。

Native VLAN:当交换机收到没有 vlan 的信息数据包中,会将数据包发到默认的 native vlan 中。在连接的交换机中,要保证 native vlan 要一致。

Trunk 口的引入,处理过程:

在 Trunk 口收到数据时:

  1. 判断是否有 VLAN 信息。
    1. 如果没有则打上端口的 Native VLAN 号,并进行交换转发。
    2. 如果有 VLAN 信息,并且该 Trunk 端口允许该 VLAN 的数据进入,则将报文带有原有 VLAN 标记进行转发,否则丢弃。

在 Trunk 口发出数据时:

  1. 比较端口的 Native VLAN 号和将要发送报文的 VLAN 号
    1. 如果两者相等则剥离 VLAN 信息再发送。(也就是说发送的是本征 VLAN 时,trunk 端口会去除 VLAN 信息)
    2. 否则报文将携带原有的 VLAN 标记进行转发。

为同一 接口 配置不同 VLAN 类型

有时会出现这样的情况,为了方便会将多个终端设备接在一起,比如交换机和接口和一个 IP 电话相连,在电话的后面有着一台 PC。

这种意味着在一个 VLAN 中,有着不同种类的流量,一种是普通的数据流量,另一种是语音的流量。

为了区分这种流量,就需要对交换机额外配置下,第一次配置数据流量,第二次配置语音流量。但需要注意的是,虽然是不同类型的 VLAN,但却配置在同一接口下。

![WeChat Screenshot_202007

也就是说,可以为同一接口配置不同种类的流量(不同的 VLAN 号),但是一个接口只能配置一个同一类别的 VLAN。

配置的注意事项

  1. VLAN 号的最大值取决于使用的交换机。

  2. VLAN 1 是默认 VLAN,也是管理 VLAN. 我们知道交换机是二层设备是没有 IP 的,但实际上会有一个 IP,就是 VLAN 1 所虚拟出来的接口,可以为该接口配置一个 IP,作用就是作为网管使用,比如配合 Telnet 登录,以及一些交换机之间的管理流量比如 VTP, DTP 等。注意 VLAN 1 有两个作用,一个是管理作用,一个是作为默认的 Native VLAN. 两个是完全不同的功能。

  3. 最好将 Native VLAN 改变其他的 VLAN 号。

  4. Trunk 接口两端的接口 Native VLAN 要一致。

  5. 最好为 Trunk 配置上允许的 VLAN,而是默认允许所有。

通信过程

假设所有交换机都刚开机,PC 发出一个数据包经过交换机 SW1,交换机会打上 10 的 VLAN TAG 标记,然后交换机会把这个数据帧转发给 VLAN = 10 的所有端口(除了进口),如下:

由于 SW1 的 Trunk 口包含 VLAN 10 ,并进行转发,数据帧到达 SW3 后,e0/2 和 e 0/3 均为 trunk 口,发现可接受 TAG 为 10 的数据帧,直接进行转发,如下:

SW2 的 trunk 口 e 0/3 同样也能接受 VLAN = 10 的数据。并且在 e 0/0 的 access 口进行 untag。而 e 0/1 的 access 只能接受 VLAN = 20 的数据,所以不进行转发。如下:

这样 PC3 就正常接收到 PC1 的数据了。

配置

# STEP1: set ip and name for every pc 
PC> set pcname pc4
pc4> ip 10.1.1.1 255.255.255.0

# STEP2: Ping one of pc to test the connectivity 
pc4:ping 10.1.1.4

# This means every pc in topography can be connected.
# So we have object that PCs under the same Vlan can communicate, but PCs under different VLAN can not.

# STEP3: Config Trunk in the sw1,sw2 and sw3.
sw1(config)# int range e0/1-2
sw1(config-if-range)# switchport trunk encapsulation dot1q
sw1(config-if-range)# switchport mode trunk

# you can see there are E0/0 and E0/3 Ports in default Vlan but no E0/1,E0/2 Prots.
# Because Trunk mode is configured for the 2,3 Ports.
sw1#show vlan
VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Et0/0, Et0/3
10   VLAN0010                         active
20   VLAN0020                         active
1002 fddi-default                     act/unsup
1003 token-ring-default               act/unsup
1004 fddinet-default                  act/unsup
1005 trnet-default                    act/unsup

sw2(config)#int e0/0
sw2(config-if)# switchport trunk encapsulation dot1q 
sw2(config-if)# switchport mode trunk

sw3(config)#int e0/0
sw3(config-if)# switchport trunk encapsulation dot1q 
sw3(config-if)# switchport mode trunk

# STEP4:Add vlan 10,20 to each switch. and configure access mode for e0/1-2 ports in the sw2 and sw3.
sw1(config)# vlan 10
sw1(config)# vlan 20

sw2(config)# vlan 10
sw2(config)# vlan 20
sw2(config)# int e0/1
sw2(config-if)# switchport mode access 
sw2(config-if)# switchport access vlan 10
sw2(config)# int e0/2
sw2(config-if)# switchport mode access 
sw2(config-if)# switchport access vlan 20
sw2#show vlan
VLAN Name                             Status    Ports
---- -------------------------------- --------- -------------------------------
1    default                          active    Et0/3
10   VLAN0010                         active    Et0/1
20   VLAN0020                         active    Et0/2
1002 fddi-default                     act/unsup
1003 token-ring-default               act/unsup
1004 fddinet-default                  act/unsup
1005 trnet-default                    act/unsup

sw3(config)# vlan 10
sw3(config)# vlan 20
sw3(config)# int e0/1
sw3(config-if)# switchport mode access 
sw3(config-if)# switchport access vlan 10
sw3(config)# int e0/2
sw3(config-if)# switchport mode access 
sw3(config-if)# switchport access vlan 20

# STEP5:Test if VLAN is vaild. 
pc4 pings pc6 is ok in the same vlan 10.
pc4 pings pc5 or pc7 is failed in the different vlan.

pc5 pings pc7 is ok in the same vlan 10.
pc5 pings pc4 or pc6 is failed in the different vlan.

拓展

问题:有这么一个要求,在 SW1 和 SW3 之间传递的数据不带 VLAN10 的标签

由于还需要保证双方的通信,所以 SW1 与 SW3 之间的 TRUNK 是不能改变的,但是在 TRUNK 模式下,发送的 TRUNK 端口可以将本征 VLAN 的标签去除,我们可以利用这个特点

改变本征 VLAN 时,在同一条链路时要同时改

//修改 SW1 e 0/2 端口
sw1(config-if)# switchport trunk native 10

//修改 SW3 e 0/2 端口
sw3(config-if)# switchport trunk native 10

通信过程

PC1 发送数据包进入,SW1 e0/0 的 access 端口,打上 vlan = 10 的标签,SW1 匹配后,转发到相应接口 e0/2,由于该接口的本征 VLAN 为10,又是发送的 TRUNK 端口,进而将 VlanID = 10 的标签去除。如图:

可以看到 SW1 与 SW3 链路中并没有添加的 VLANID 标签

在 SW3 e0/2 端口,收到没有 VLAN Tag 的数据,因此进行 TAG 操作,此时数据包上带有 VLAN = 10 的标签,进行匹配后,e 0/3 对该数据进行转发。如图:

在 SW2 与 SW3 的链路上带有 VLAN = 10 的标签了,SW2 的 e0/3 接收到数据后进行转发,交换机匹配后,e0/0 为 Access 口,对Tag 进行去除,紧着 PC3 收到数据.

总结

Access 口连接的是终端,Trunk 口连接的是交换机。

Access 口,解决的是在同一台交换机下,隔离广播域的作用。

Trunk 口,解决的是在多台连接的交换机下,隔离广播域的作用。

数据包在进入 Access 口时,会加上 VLAN TAG, 在 Access 输出时,会将 TAG 拿掉。在 Trunk 口输出时,VLAN TAG 不变。

数据包在进入 Trunk 口时,如果没有 VLAN TAG 则会加上 Native VLAN,有的话直接转发。 在 Access 输出时,会将 TAG 拿掉,在 Trunk 输出时,如果是 Native VLAN 则把 TAG 拿掉,不是的话直接转发。

版权声明:本文为michael9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/michael9/p/13360084.html