VLAN基础

VLAN(virtual LAN),即虚拟局域网。LAN一般指所属同一广播域的数台机器组成的网络,VLAN则特指使用路由器分割成不同广播域的网络。

为什么要使用VLAN

为什么要使用VLAN

试想有一个具有大量终端的局域网内,当某台机器A希望访问机器B时,计算机A会先发ARP广播请求来尝试获取机器B的MAC地址,此时该局域网内所有机器都会收到该广播请求。可以想象,当ARP请求比较多时引起广播风暴,将会对服务器CPU造成压力。

常见的广播通信有:

  1. ARP请求
  2. RIP
  3. DHCP
  4. NetBEUI
  5. IPX
  6. Apple Talk

实现VLAN的机制

在一台未设置任何VLAN的二层交换机上,任何广播数据帧都会被转发给除接收端的所有端口。
lan
如上图,当第一台机器请求访问第二台机器时,其他所有机器也都会收到ARP请求。此时,如果将交换机的端口划分为多个VLAN,即可避免广播域过大的问题。
vlan
如图,将绿色端口划分到一个VLAN下,蓝色端口划分到一个VLAN下,当同一VLAN内的机器相互访问时,ARP广播请求不会发送到其他VLAN中。

如何跨VLAN访问:

VLAN是广播域,通常两个广播域是由路由器连接。因此,VLAN间的通信也需要路由器提供中继服务,这被称作“VLAN间路由”。VLAN间路由可以使用普通的路由器,也可以使用三层交换机。不同VLAN间通信需要用到路由功能。

VLAN划分方式

划分方式 如何划分 特点
静态划分 静态VLAN也叫基于端口的VLAN,交换机给每个端口指定VLAN 缺点:端口需要一个个指定,且修改网络拓扑机构时维护比较麻烦
基于MAC的划分 通过查询并记录端口所连计算机上网卡的MAC地址来决定VLAN 不受网络拓扑结构影响,但是当更换机器时依赖于MAC地址给其划分VLAN,当划分方式不当时,很容易造成各VLAN大小不均匀,达不到目的
基于子网的划分 通过所连计算机的IP地址来决定VLAN 不受网络拓扑结构影响,即使更换服务器,只要IP设定为原IP即可加入原VLAN
基于用户的划分 根据交换机所连计算机用户决定属于哪个VLAN 一般指计算机中登录的用户名,放到办公网络区域可行。但是在服务器环境不可行,大部分公司内部机器用户名都是统一的规定的,可能就几个用户名

VLAN的汇聚链接

设置跨越多台交换机的VLAN

前文讲到的VLAN都是在一个交换机下划分的,如何将不同交换机的多个接口划分到同一VLAN下呢?

一种很容易想到的方法就是:每个VLAN使用一个专用网口,将多个交换机串到一起。这么做存在一个问题,有多少VLAN就需要多少额外的网口来作为跨交换机通信的接口。

为了避免这种低效的通信方式,人们想到一种让交换机互联的线集中到一根上,这时使用的就是汇聚链接(Trunk Link)。

何谓汇聚链接

汇聚链接(Trunk Link)指的是能够转发不同VLAN的通信的端口。汇聚流通的数据帧上都附加了识别分属于哪个VLAN的标示信息。

用户只需将交换机互联的端口设定为汇聚链接就可以使用了,无需其他额外的特殊布线。接下来看下汇聚链接是如何实现跨交换机的VLAN的:

  1. A发送的数据帧从交换机1经过汇聚链接到达交换机2时,在数据帧上附加了表示属于红色VLAN的标记
  2. 交换机2收到数据帧后,经过检查VLAN标示发现这个数据帧是属于红色VLAN的
  3. 除去标记后,根据需要将复原的数据帧只转发给其他属于红色VLAN的端口
    trunk link

VLAN间路由

不同VLAN间通信

对交换机划分不同VLAN之后,处于同一交换机下不同VLAN的设备是无法通信的,即使它们连在同一个交换机上。

为什么会无法通信呢:在LAN内的终端间通信,必须在数据帧头中指定mac地址,而为了获取mac地址,TCP/IP协议下使用的是ARP协议,通过广播ARP请求得到目的终端的mac地址。对交换机划分VLAN后,不同VLAN的设备不在一个广播域,因此无法直接通信。

为了让设备通信,只能通过更高一层的信息进行路由。路由可以使用路由器,也可使用三层交换机实现。

使用路由器进行VLAN间路由

由于一个交换机上的VLAN有多个,因此要考虑路由器如何识别的问题。同设置跨多台交换机的VLAN方法类似,使用到汇聚链接。

具体实现方法:首先将用于连接路由器的交换机端口设为汇聚链接,而路由器上的端口也必须支持汇聚链路。双方用于汇聚链路的协议自然也必须相同。接着在路由器上定义对应各个VLAN的“子接口(Sub Interface)”。尽管实际与交换机连接的物理端口只有一个,但在理论上我们可以把它分割为多个虚拟端口。VLAN将交换机从逻辑上分割成了多台,因而用于VLAN间路由的路由器,也必须拥有分别对应各个VLAN的虚拟接口。采用这种方法的话,即使之后在交换机上新建VLAN,仍只需要一条网线连接交换机和路由器。用户只需要在路由器上新设一个对应新VLAN的子接口就可以了。

通信的数据流程

communication

如上图所示,为各终端、路由器子接口设定IP地址。红色VLAN(VLAN ID=1)的网络地址为192.168.1.0/24,蓝色VLAN(VLAN ID=2)的网络地址为192.168.2.0/24。终端的mac地址简记为A、B、C、D。交换机通过对各端口所连接的终端MAC地址学习,生成如下地址表:

端口 MAC地址 VLAN
1 A 1
2 B 1
3 C 2
4 D 2
5 - -
6 R 汇聚链接

同一VLAN下的终端数据通信

收发信双方同属于一个VLAN内的通信,一切处理均在交换机内完成。
communication

  1. 终端A发出ARP请求信息后,请求解析B的mac地址
  2. 交换机收到数据帧,检索MAC地址中与收信端口属于同一VLAN的表项。
  3. 发现终端B连接在端口2上,于是将数据帧转发到端口2,最终终端B收到数据帧。

不同VLAN下的终端数据通信

communication

  1. 计算机A从通信目标的IP地址(192.168.2.1)得出C与本机不属于同一个网段。因此会向设定的默认网关(Default Gateway,GW)转发数据帧。在发送数据帧之前,需要先用ARP获取路由器的MAC地址。
  2. 得到路由器的MAC地址R后,接下来就是按图中所示的步骤发送往C去的数据帧。①的数据帧中,目标MAC地址是路由器的地址R、但内含的目标IP地址仍是最终要通信的对象C的地址。
  3. 交换机在端口1上收到①的数据帧后,检索MAC地址列表中与端口1同属一个VLAN的表项。由于汇聚链路会被看作属于所有的VLAN,因此这时交换机的端口6也属于被参照对象。这样交换机就知道往MAC地址R发送数据帧,需要经过端口6转发。从端口6发送数据帧时,由于它是汇聚链接,因此会被附加上VLAN识别信息。由于原先是来自红色VLAN的数据帧,因此如图中②所示,会被加上红色VLAN的识别信息后进入汇聚链路。
  4. 路由器收到②的数据帧后,确认其VLAN识别信息,由于它是属于红色VLAN的数据帧,因此交由负责红色VLAN的子接口接收。接着,根据路由器内部的路由表,判断该向哪里中继。由于目标网络192.168.2.0/24是蓝色VLAN,且该网络通过子接口与路由器直连,因此只要从负责蓝色VLAN的子接口转发就可以了。这时,数据帧的目标MAC地址被改写成计算机C的目标地址;并且由于需要经过汇聚链路转发,因此被附加了属于蓝色VLAN的识别信息。这就是图中③的数据帧。
  5. 交换机收到③的数据帧后,根据VLAN标识信息从MAC地址列表中检索属于蓝色VLAN的表项。由于通信目标——计算机C连接在端口3上、且端口3为普通的访问链接,因此交换机会将数据帧除去VLAN识别信息后(数据帧④)转发给端口3,最终计算机C才能成功地收到这个数据帧。

进行VLAN间通信时,即使通信双方都连接在同一台交换机上,也必须经过:“发送方——交换机——路由器——交换机——接收方”这样一个流程。

通信实验

实操1,windows下使用工具模拟网络

网络拓扑

网络拓扑结构

如上图,2个交换机,左边交换机连接终端PC0,PC1,它们在同一VLAN下,右边交换机连接终端PC3,PC4,其中PC3在tag100的VLAN下,PC4在tag200的VLAN下。两个交换机通过一对trunk口连接。左侧交换机trunk口连接到路由器上,并在路由器分了子接口,每个子接口配置了IP,另外子接口还需配置数据通过子接口时增加VLANID的操作。

操作过程

实验使用cisco packet tracer7.2模拟各种设备。
cisco packet tracer图示
如图,router使用的型号是1841,switch使用的型号是2960。

配置方法:

  1. 增加各种设备,并将设备连接起来,PC按照网络拓扑图配置IP地址。PC网关地址分别是(192.168.1.2, 192.168.2.2)
  2. 双击打开switch,给switch增加vlan,两switch都配置,如图配置:
    添加vlan
  3. 配置端口类型,如下图,fastEthernet0/x 指一个端口,然后右侧可以配置access模式和trunk模式,acces模式要选择vlan的id,trunk口默认选择所有vlan。根据网络拓扑结构,左侧交换机2个tag100的acces口,分别连接PC0 PC1,2个trunk口,分别连接到另一个交换机和路由器;右侧交换机1个tag100的access口连接PC3,一个tag200的access口连接PC4,1个trunk口连接到左侧交换机。
    配置switch端口类型
  4. 配置路由器。我这边测试时,是将左侧交换机连接到路由器的FastEthernet0/0接口。点击路由器,进入到cli选项卡,即可在命令行下操作。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    // 在路由器上配置trunk的封装协议的命令: encapsulation [isl/dot1q] vlan
    Router> en
    Router# conf ter
    Router(config)# interface fa0/0.1
    Router(config-subif)# encapsulation dot1Q 100
    Router(config-subif)# ip address 192.168.1.2 255.255.255.0
    Router(config-subif)# interface fa0/0.2
    Router(config-subif)# encapsulation dot1Q 200
    Router(config-subif)# ip address 192.168.2.2 255.255.255.0
    Router(config-subif)# exit
    Router(config)# interface fa0/0
    Router(config-if)# shutdown
    Router(config-if)# no shutdown
    Router(config-if)# exit
    Router(config)# exit
    Router# show interface fa0/0.1
    FastEthernet0/0.1 is up, line protocol is up (connected)
    Hardware is PQUICC_FEC, address is 000a.f32d.9601 (bia 000a.f32d.9601)
    Internet address is 192.168.1.2/24
    MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
    reliability 255/255, txload 1/255, rxload 1/255
    Encapsulation 802.1Q Virtual LAN, Vlan ID 100
    ARP type: ARPA, ARP Timeout 04:00:00,
    Last clearing of "show interface" counters never
    Router#show interface fa0/0.2
    FastEthernet0/0.2 is up, line protocol is up (connected)
    Hardware is PQUICC_FEC, address is 000a.f32d.9601 (bia 000a.f32d.9601)
    Internet address is 192.168.2.2/24
    MTU 1500 bytes, BW 100000 Kbit, DLY 100 usec,
    reliability 255/255, txload 1/255, rxload 1/255
    Encapsulation 802.1Q Virtual LAN, Vlan ID 200
    ARP type: ARPA, ARP Timeout 04:00:00,
    Last clearing of "show interface" counters never
  5. 通信测试,PC0 、PC1、PC3、PC4都可通,在设备上ping内部IP都可通。

实操2,linux下利用网络空间模拟

网络拓扑

网络拓扑结构

如上图,一共使用2个交换机,左边连接网络空间 ns0,ns1,ns2,右侧连接网络空间ns10,ns12,其中ns0 ns1 ns10在vid为100的vlan内,ns2 ns12在vid为200的vlan内。两个ovs通过trunk口连接,ovs-br0通过两个access口连接到主机(这么做主要是还没研究出怎么使用路由器子接口一样把ovs的一端加到宿主机上,就使用多个access口代替单个trunk口的作用)

实验脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/sh
#创建2个ovs
ovs-vsctl add-br ovs-br0;ip l s ovs-br0 up
ovs-vsctl add-br ovs-br1;ip l s ovs-br1 up
# 创建ns,并创建veth pair将一端加入到ns,同时添加默认路由规则
for i in `seq 0 2`;do \
ip netns add ns$i
ip l a veth$i type veth peer name nveth$i; \
ip l s nveth$i name eth0 netns ns$i; \
ip l s veth$i up; \
ip netns exec ns$i ip l s eth0 up; \
ip netns exec ns$i ip l s lo up; \
done
for i in `seq 10 11`;do \
ip netns add ns$i
ip l a veth$i type veth peer name nveth$i; \
ip l s nveth$i name eth0 netns ns$i; \
ip l s veth$i up; \
ip netns exec ns$i ip l s eth0 up; \
ip netns exec ns$i ip l s lo up; \
done
# 配置IP
ip netns exec ns0 ip a a 10.2.1.10/24 dev eth0
ip netns exec ns1 ip a a 10.2.1.11/24 dev eth0
ip netns exec ns2 ip a a 10.2.2.10/24 dev eth0
ip netns exec ns10 ip a a 10.2.1.12/24 dev eth0
ip netns exec ns11 ip a a 10.2.2.11/24 dev eth0
# 将5个ns分别连到两个交换机上的指定vlan口
# ovs-br0
ovs-vsctl add-port ovs-br0 veth0 tag=100
ovs-vsctl add-port ovs-br0 veth1 tag=100
ovs-vsctl add-port ovs-br0 veth2 tag=200
# ovs-br1
ovs-vsctl add-port ovs-br1 veth10 tag=100
ovs-vsctl add-port ovs-br1 veth11 tag=200
##
## connect ovs-br0 and ovs-br1
ip l a tveth0 type veth peer name tveth1;
ip l s tveth0 up;ip l s tveth1 up
ovs-vsctl add-port ovs-br0 tveth0
ovs-vsctl add-port ovs-br1 tveth1
ovs-vsctl set port tveth0 vlan_mode=trunk
ovs-vsctl set port tveth1 vlan_mode=trunk
ovs-vsctl set port tveth0 trunks=100,200
ovs-vsctl set port tveth1 trunks=100,200
# 创建两个veth pair将ovs的两个tag以access方式连接到宿主机
ip l a rveth0 type veth peer name rtveth0
ip l a rveth1 type veth peer name rtveth1
ip l s rveth0 up;ip l s rtveth0 up
ip l s rveth1 up;ip l s rtveth1 up
# 给两个网卡增加IP,作为VLAN的网关
ip a a 10.2.1.2/24 dev rveth0
ip a a 10.2.2.2/24 dev rveth1
ovs-vsctl add-port ovs-br0 rtveth0 tag=100
ovs-vsctl add-port ovs-br0 rtveth1 tag=200
# 给ns增加路由
ip netns exec ns0 route add default gw 10.2.1.2 dev eth0
ip netns exec ns1 route add default gw 10.2.1.2 dev eth0
ip netns exec ns2 route add default gw 10.2.2.2 dev eth0
ip netns exec ns10 route add default gw 10.2.1.2 dev eth0
ip netns exec ns11 route add default gw 10.2.2.2 dev eth0

做完实验清理脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
ovs-vsctl del-br ovs-br0
ovs-vsctl del-br ovs-br1
for i in `seq 0 2`;do \
ip netns del ns$i; \
ip l d veth$i; \
done
for i in `seq 10 11`;do \
ip netns del ns$i; \
ip l d veth$i; \
done
ip l d rveth0
ip l d rveth1
ip l d tveth0

经过测试,ns0,ns1,ns2,ns10,ns11之间全部互通。

在各个ns中,无法ping通外网,主要是两个VLAN是在挂在宿主机下的子网,如果想访问外网,要在宿主机上增加NAT规则。

参考资料

  1. VLAN基础部分参考
  2. VLAN利用cisco packet tracer模拟网络操作参考