一、知识背景
1、子接口技术
子接口(也称子端口)是通过协议和技术将一个物理接口(interface)虚拟出来的多个逻辑接口。相对子接口而言,这个物理接口称为主接口。每个子接口从功能、作用上来说,与每个物理接口是没有任何区别的,它的出现打破了每个设备存在物理接口数量有限的局限性。在路由器中,一个子接口的取值范围是0~4096个,当然受主接口物理性能限制,实际中并无法完全达到4096个,数量越多,各子接口性能越差。
经典应用:在拥有多个VLAN的交换机和路由器上,通过配置子接口和802.1Q协议,实现VLAN间的通信,也称 “ 单臂路由”实验。
2、那么为什么会产生子接口技术呢?
在VLAN虚拟局域网中,通常是一个物理接口对应一个 VLAN。在多个 VLAN 的网络上,无法使用单台路由器的一个物理接口实现 VLAN 间通信,同时路由器有其物理局限性,不可能带有大量的物理接口。
子接口的产生正是为了打破物理接口的局限性,它允许一个路由器的单个物理接口通过划分多个子接口的方式,实现多个VLAN间的路由和通信。
二、vlan间通信原理(https://blog.csdn.net/pwc1996/article/details/50589248)
1、单臂路由
前面的博客已经说过,两个vlan之间的通信需要依据路由,也就是说将两个vlan当作两个不同的网络,需要设置路由表才能在vlan之间进行通信。那么,先看下面这张图,vlan1和vlan2之间的通信需要借助路由器进行,如果说此时vlan1和vlan2位于两个不同的交换机上,那么两者之间的通信就是普通的设置路由就行(https://blog.csdn.net/weixin_40042248/article/details/112428503)。但是,此时只有一个交换机,这时路由器就需要有两个网卡分别连接vlan1和vlan2,如图所示,可是现实中路由器的物理端口有限,如果vlan过多这种利用物理端口分别连接肯定不可行,同样,在实验中,一个交换机和一个路由器之间设置两个物理端口进行连接并不简单,所以vlan间通信就采用了单臂路由,利用子端口技术进行。
为了实现单臂路由,路由器只需一个端口和交换机进行连接,并设置该端口的子端口对应的vlan信息,而交换机只需将连接路由器的端口设置vlan模式为trunk即可,通过单臂路由实现不同vlan通信,可以节省路由端口消耗,如下图所示。
2、三层交换机
三层交换机就是具有部分路由器功能的交换机,工作在OSI网络标准模型的第三层:网络层。三层交换机的最重要目的是加快大型局域网内部的数据交换,所具有的路由功能也是为这目的服务的,能够做到一次路由,多次转发。
VLAN技术在网络中的大量应用,而各个不同VLAN间的通信都要经过路由器来完成转发,随着网间互访的不断增加。单纯使用路由器来实现网间访问,不但由于端口数量有限,而且路由速度较慢,从而限制了网络的规模和访问速度。基于这种情况三层交换机便应运而生,三层交换机是为IP设计的,接口类型简单,拥有很强二层包处理能力,非常适用于大型局域网内的数据路由与交换,它既可以工作在协议第三层替代或部分完成传统路由器的功能,同时又具有几乎第二层交换的速度,且价格相对便宜些。
因此三层交换机具有路由功能,而且三层交换机的端口是vlan端口。
三层交换机实现vlan之间的通信主要分为两种结构:
- 主机——三层交换机——主机
- 主机——交换机——三层交换机——交换机——主机
如下图所示
三、基于Linux的vlan间通信实验
在上一篇文章中(https://blog.csdn.net/weixin_40042248/article/details/113869638),我讲解了vlan的划分,并进行了vlan的实验,本次实验在此基础之上来实现vlan间通信的实验。
1、单臂路由实验
在做vlan划分前,我们先单纯的做一个单臂路由实验,也就是不划分vlan,但是设置两个不同网络段,如果不借助路由器,不同网络段的主机虽然在同一个交换机下,但是仍然不能相互通信。所以,实验做一个单臂路由使得两个网络断的主机能够相互通信。具体的实验拓扑我们使用mininet进行仿真,如下图所示。
各个主机的ip地址设置如下所示。
由于采用的交换机是ovs,所以需要设置流表,将其作为普通的交换机使用,具体的设置命令如下所示。
root@yang-VirtualBox:/home/yang# ovs-ofctl add-flow s1 priority=0,actions=normal
root@yang-VirtualBox:/home/yang# ovs-ofctl dump-flows s1
# cookie=0x0, duration=12.735s, table=0, n_packets=3, n_bytes=210, priority=0 actions=NORMAL
ovs设置完成之后,在同一个网段下的主机之间就可以相互通信了。
接下来,需要对路由器设置子接口,设置之前,先讲解一下Linux如何为网卡设置子接口
创建网卡子接口,添加IP别名
ifconfig eth0:0 2.2.2.2/24
# 或者
ip addr add 2.2.2.2/24 dev eth0 label eth0:0
清除网卡子接口,删除IP别名
ifconfig eth0:1 down
# 或者
ip addr del 2.2.2.2/24 dev eth0 label eth0:0
接下来,对路由器r2进行子接口设置,子接口r2-eth0:1对应的ip地址和h1_1、h2_1的ip在同一个网段下;子接口r2-eth0:2对应的ip地址和h1_2、h2_2、h3_2的ip在同一个网段下。设置的命令如下。
mininet> r2 ip addr add 10.0.1.100/24 dev r2-eth0 label r2-eth0:1
mininet> r2 ip addr add 10.0.2.100/24 dev r2-eth0 label r2-eth0:2
设置完成之后,查看r2的网卡信息如下所示。
此时,如果想要不同的网络段下的主机之间可以相互通信,就需要设置下一跳,也就是设置路由信息,为各个主机设置的下一跳的命令如下所示。
mininet> h1_1 ip route add 10.0.2.0/24 via 10.0.1.100 dev h1_1-eth0
mininet> h2_1 ip route add 10.0.2.0/24 via 10.0.1.100 dev h2_1-eth0
mininet> h1_2 ip route add 10.0.1.0/24 via 10.0.2.100 dev h1_2-eth0
mininet> h2_2 ip route add 10.0.1.0/24 via 10.0.2.100 dev h2_2-eth0
mininet> h3_2 ip route add 10.0.1.0/24 via 10.0.2.100 dev h3_2-eth0
设置完成之后,此时各个主机之间就可以正常的进行通信了。
2、基于单臂路由的vlan间通信
由于,vlan技术产生主要是为了隔离广播域,抑制广播风暴,所以上述实验并没有设置vlan,所以并不能很好的说明vlan的广播域隔离的效果,所以接下来的实验将所5个主机设置两个不同的vlan,并观察vlan的广播域隔离效果,然后设置单臂路由进行vlan间通信。
首先,对未设置vlan的网络的广播域进行检验,在其中一个主机上用arping命令请求其他主机的ip,然后在其余主机上使用tcpdump命令监测网卡数据。具体的步骤如下。
在h1_2主机终端中输入命令arping 10.0.2.2,然后分别在h2_2,h3_2,h2_1主机监测各自的网卡收到的数据,如下图所示。可以看出,arp请求发出后,交换机并不能隔离广播域,所有主机都可以收到arp请求,但是只有对应的ip的一个主机对arp请求响应。
接下来,设置vlan进行广播域的隔离,将h1_1、h2_1主机归为vlan1,h1_2、h2_2、h3_3主机归为vlan2。在mininet终端中输入links命令查看端口之间的对应关系,根据对应关系设置vlan,命令如下。
root@yang-VirtualBox:/home/yang# ovs-vsctl set port s1-eth2 tag=1
root@yang-VirtualBox:/home/yang# ovs-vsctl set port s1-eth3 tag=1
root@yang-VirtualBox:/home/yang# ovs-vsctl set port s1-eth4 tag=2
root@yang-VirtualBox:/home/yang# ovs-vsctl set port s1-eth5 tag=2
root@yang-VirtualBox:/home/yang# ovs-vsctl set port s1-eth6 tag=2
此时,设置完成之后,两个vlan之间就属于了两个广播域,而且由于vlan不同,两个vlan之间就不能继续通信了。
为ovs和路由器连接的端口设置trunk模式,具体的端口模式的区别,见上一篇博客(https://blog.csdn.net/weixin_40042248/article/details/113869638)。trunk模式下,允许vlan1和vlan2的数据通过,设置的具体命令如下所示。
root@yang-VirtualBox:/home/yang# ovs-vsctl set port s1-eth1 VLAN_mode=trunk
root@yang-VirtualBox:/home/yang# ovs-vsctl set port s1-eth1 trunk=1,2
root@yang-VirtualBox:/home/yang# ovs-vsctl show
接下来,需要对路由器的子接口进行802.1q协议的封装,封装完成后,两个vlan之间就可以完成相互通信了。