Advertisement

Linux实现的IEEE 802.1Q VLAN

阅读量:

摘要
本文介绍了VLAN的核心概念及其在Linux上的配置与实现。VLAN(虚拟局域网)通过在物理网络中划分逻辑域,实现广播域的隔离、网络扩展和安全策略的隔离。文章详细解释了VLAN的三层交换机制、核心概念(如隔离广播域、扩展网络、安全策略隔离)以及在Linux上的配置步骤,包括如何创建VLAN、trunk端口、access端口,以及VLAN间通信的实现。文章强调了理解VLAN的核心概念的重要性,并指出在Linux上配置VLAN的关键点在于明确端口划分和trunk链路的使用。通过遵循这些原则,可以轻松实现Linux环境下的VLAN配置。

第一部分:VLAN的核心概念

说起IEEE 802.1q,可以说它就是VLAN的代名词。在VLAN的世界里,可以说没有任何知识盲区。然而,说到配置网络设备时,大多数人都能顺口溜般地掌握Cisco或H3C设备的配置命令,但在Linux设备上的VLAN配置却常常让人感到困惑。这些困惑之所以存在,我认为原因有两个:一是对VLAN的本质概念理解得不够深入;二是对Linux环境下实现虚拟网络设备的操作不熟悉。

也许你已透彻掌握了802.1q,还仔细研读了IEEE文档,但对Linux下的Bridge、tap和bond等虚拟设备却理解不深,因此配置VLAN也举步维艰。

在VLAN概念的理解上,需要强调以下几点:
1.VLAN实现了广播域的分离;
2.单独的一个VLAN模拟了一个常规的交换以太网,因此VLAN将一个物理交换机分割成了一个或多个逻辑交换机;
3.不同VLAN之间的通信需要经过三层参与;
4.当多台交换机级联时,VLAN通过VID来识别,该ID插入到标准的以太帧中,被称作tag;
5.大多数的tag并不是端到端的,一般在上行链路的第一个VLAN交换机打tag,下行链路的最后一个VLAN交换机去除tag;
6.只有在一个数据帧不打tag就不能区分属于哪个VLAN时才会打上tag,能去掉时尽早要去掉tag;
7.最终,IEEE 802.1q解决了VLAN的tag问题。除了IEEE 802.1q,其余的都是和实现相关的,尽管Cisco和H3C的实现方式相似,但Linux在实现细节上却大相径庭。

1.每一个VLAN交换机端口需要绑定一个VLAN id;
2.每一个VLAN交换机端口处于下面三类中的一类:access,trunk,hybrid。

该端口接收的数据帧均未携带标签信息,同时该端口发送的数据帧也未携带标签信息。

2.2. trunk端口:此类端口接收的数据帧均带有标记,此类端口发送的数据帧也需带有标记(不考虑缺省VLAN的情况);

2.3.hybrid端口:略

实际上,我们没有必要深入探究Cisco/H3C的具体命令以及各类端口的详细区分。之所以需要划分三类端口类型,完全是为了方便地应用VLAN技术(即IEEE 802.1q标准)。简单来说,trunk端口的出现是无奈之举,因为需要将属于多个VLAN的数据帧通过单根物理链路传输,如果不使用tag标记,就无法区分这些数据帧所属的VLAN。因此,IEEE 802.1q标准应运而生,它通过在以太帧中插入tag,使得这一理论得以实施。为了更好地理解和应用VLAN,厂商又定义了一系列相关概念,比如与tag相关的链路类型等。

因此,我们可以完全摒弃任何关于配置命令的讨论,以及对厂商定义概念的依赖,完全按照IEEE 802.1q标准和实际需求来理解VLAN。这样一来,你就可以在Linux系统上轻松实现任意VLAN的配置。首先,我们需要明确我们的配置需求以及相应的网络拓扑结构,关键在于如何进行正确的接线。

1.情况一.同一VLAN内部通信

1.1.同一交换机同一VLAN的不同端口进行通信
1.2.不同交换机的不同端口进行通信

2.情况二.不同VLAN之间通信

2.1.同一交换机不同VLAN之间进行通信
2.2.不同交换机的不同VLAN进行通信

从上述1.2节可以看出,为节省线缆资源并避免环路形成,两个VLAN交换机的两个端口之间的同一条链路需要承载不同VLAN的数据帧。为了使不同VLAN的数据帧能够被各自所属的VLAN识别,显然的办法是为数据帧添加标识符(tag)。因此,上述1.2节中端口J和端口K之间的链路上的数据帧需要打tag,因为端口J和端口K都属于两个VLAN,分别为VLAN m和VLAN n。换句话说,只要一个端口需要同时传输和接收多个VLAN的数据帧,那么从该端口发出的数据帧就需要打tag,而从该端口接收的数据帧可以通过tag来识别其所属的VLAN。用Cisco/H3C等厂商的术语来说,它就是trunk端口,两个trunk端口之间的链路属于trunk链路。

我们知道,通常情况下,PC机直接连接在常规二层交换机或支持VLAN的交换机端口上,而PC机发送的通常是常规的以太网数据帧,这些数据帧没有tag,它们并不了解802.1q机制。然而,VLAN存在的核心目的是将一些PC机划分为一个VLAN,将另一些PC机划分为另一个VLAN,从而实现网络隔离。显然的一种方法是将支持VLAN的交换机的某些端口划分为一个VLAN,而另一些端口划分为另一个VLAN。一个VLAN内的所有端口就形成了一个逻辑上的二层常规交换机。为了扩展VLAN覆盖范围,由于单台交换机端口数量的限制,需要将交换机级联起来,这样级联链路上的数据帧就会承载不同VLAN的流量。因此,级联链路成为trunk链路,而所有非trunk链路则为access链路(注意:这里暂不讨论hybrid链路)。显然,access链路两端的端口不需要携带tag,只需要做到“无tag直传,有tag去掉即可”,因此它们可以连接PC机、常规交换机以及VLAN交换机的非trunk端口。

VLAN的内容大致可以分为三部分:

1.设计目的

隔离广播域,节省物理设备,隔离安全策略域

2.IEEE 802.1q

为扩展VLAN的级联方案提供了一个标准的协议

3.如何使用VLAN

将某些端口划分为一个VLAN,基于MAC地址的划分... 其实,至于如何划分VLAN,标准中并未对VLAN划分做出硬性规定,只要能够确保属于同一VLAN的所有端口能够通过IEEE 802系列的标准进行通信即可,换句话说,只要同一VLAN内的所有交换机端口能够构成一个完整的以太网即可。 这样一来,我们就可以通过配置以太网桥接设备来实现VLAN划分。 到此为止,我们基本上已经忘记了配置trunk和access命令,以及基于端口划分VLAN的命令,脑子中只留下了VLAN的核心概念。 通过这些核心概念,我们就可以在Linux系统上配置完整的VLAN方案,而如果只是机械地套用Cisco的配置,只会导致配置的失败。 比如,如果你问如何在Linux上配置端口为access,又如何在Linux上将某些网卡划分为一个VLAN... 理解Linux Bridge的人都知道,Linux本身就可以实现多个逻辑意义的Bridge设备,因为Linux的Bridge是软性的,所以一个Linux Box就可以配置多个逻辑意义的Bridge,而多个Bridge设备之间必须通过第三层进行通信,加之第三层正是以太网的边界,因此一个Linux Box也可以模拟多个以太网,不同的Bridge设备就可以代表不同的VLAN。

第二部分:Linux上的VLAN

Linux上的VLAN与Cisco/H3C设备上的VLAN存在显著差异。在Cisco/H3C设备中,VLAN是建立在现有的LAN之上的,通过划分VLAN来实现网络资源的集中管理。而Linux系统则采取了相反的策略,其桥接设备的创建过程与VLAN的划分紧密相关。具体而言,Linux系统在创建VLAN时,需要先生成虚拟网卡设备,再将其与真实的网络接口设备进行绑定。创建VLAN的操作非常简单,可以通过以下命令完成:
ifconfig eth0 0.0.0.0 up
vconfig eth0 10
ifconfig eth0.10 up**
在使用vconfig命令创建eth0.10虚拟网卡后,它将具备真实的虚拟网卡特性,类似于br0、tap0或bond0等设备。在eth0.10虚拟网卡下绑定真实的eth0网卡,这意味着数据将从eth0网卡发出。其中,eth0.10中的“10”标识表示该虚拟网卡可以承载VLAN 10的数据帧。在eth0网卡发送数据之前,必须在eth0.10虚拟网卡上打上相应的tag。这个tag的处理过程由eth0.10的hard_xmit接口完成,其工作流程如下:先在hard_xmit中添加tag,再通过eth0的hard_xmit接口将数据发送出去,如图所示。

真实的物理网卡,如ethx,能够承载多个VLAN的数据帧,因此它就是trunk端口。

Linux的VLAN工具vconfig采用ethx.y接口的方式,通过将ethx端口作为trunk端口,连接VLAN ID为y的VLAN。类比Cisco/H3C的架构,我们实现了trunk端口的创建与配置。具体操作如下:首先,使用vconfig创建一个ethx.y的虚拟设备,这样就实现了ethx端口作为trunk口的功能,其中y代表该trunk口连接的trunk链路可以承载的VLAN数据帧的ID。通过创建ethx.a、ethx.b、ethx.c、ethx.d等端口,我们实现了ethx端口可以承载VLAN a、b、c、d的数据传输。接下来,我们按照以下步骤创建access端口:创建VLAN:
ifconfig eth0 0.0.0.0 up
vconfig eth0 10
ifconfig eth0.10 up
为该VLAN创建trunk端口:
brctl addbr brvlan10
brctl addif brvlan10 eth0.10
为该VLAN添加网卡:
ifconfig eth1 0.0.0.0 up
brctl addif brvlan10 eth1
ifconfig eth2 0.0.0.0 up
brctl addif brvlan10 eth2

这样,eth1和eth2就成为了VLAN 10的access端口,而eth0则是一个trunk端口,用于级联VLAN。如果不需要级联VLAN功能,而仅仅是需要扩展VLAN 10,那么可以将eth1连接到一个二层交换机或Hub设备。同样地,我们也可以通过eth0端口创建另一个VLAN 20,实现对上游VLAN的级联:
ifconfig eth0 0.0.0.0 up
vconfig eth0 20
ifconfig eth0.20 up
brctl addbr brvlan20
brctl addif brvlan20 eth0.20
ifconfig eth5 0.0.0.0 up
brctl addif brvlan20 eth5

如图所示,完成了VLAN的级联配置。

基本上完成了Linux上VLAN的配置。接下来还有一个重要知识点,那就是VLAN之间的通信。这个知识点最简单,那就是通过路由进行通信。为此,很多人认为支持VLAN的三层交换机和路由器等同于。既然使用路由就需要一个IP地址作为网关,那么如何配置IP地址自然就是一个不可忽视的问题。我们要把这个IP配置在哪个位置?可以肯定的是,必须配置在当前VLAN的某处,于是我们有多个地方可以选择。

该VLAN内的同一个路由器接口上,且该路由器具有通往目的VLAN的路由信息(该接口为trunk接口)。

在同一个VLAN组内的ethx.y虚拟接口配置下,该Linux Box已成功配置了通往指定VLAN a的路由信息,其最直接的配置方式是配置了ethx'.a虚拟接口。

属于同一VLAN内的Bridge设备上,Linux Bridge默认提供本地接口,支持IP地址配置。该Linux Box可实现对目标VLAN a的路由连接,通常通过配置ethx'.a虚拟接口或连接目标VLAN的Bridge设备来实现。

出乎意料地比asio的性能更加卓越,这得益于其简单的设计和高效的代码结构。在VLAN配置中,当同一个VLAN在同一个Linux Box内配置了两个trunk端口时,就需要为每个trunk端口分配独立的IP地址。具体来说,可以执行以下操作:
brctl addbr brvlan10
brctl addif brvlan10 eth0.10
brctl addif brvlan10 eth1.10
ifconfig brvlan10 up
这样会生成两个ethx.y类型的虚拟接口。为了避免路由冲突,必须将IP地址配置在主VLAN接口brvlan10上。无论将IP地址配置在桥接端口还是虚拟接口上,数据帧都需要经过IP路由处理。值得注意的是,Linux软件本身并未内置硬件缓存转发机制,因此在VLAN实现中,三层交换本质上是基于IP的路由处理。
在Linux的VLAN实现中,数据帧的tag脱除时间点是一个关键问题。根据定义,tag脱除发生在数据帧从access端口发送出去的那一刻,但从语义上讲,只要确保access端口发送的数据帧不带有tag即可。因此,tag脱除的具体时机并不影响功能实现。
在Linux的VLAN实现中,packet_type函数负责单独处理802.1q数据帧,而802.1q机制与IP协议在功能上处于同一层次。同样,vlan_skb_recv函数也类似于ip_rcv函数,负责处理VLAN相关的数据帧。在实际配置中,当一个端口接收本地数据帧时,才会触发第三层处理逻辑。需要注意的是,Linux软件本身并未内置硬件缓存转发机制,因此它无法处理802.1q数据帧,也无法识别这类数据帧。
以下是trunk端口收发数据帧、IEEE 802.1q帧处理以及VLAN间通信的完整示意图:
(此处应插入相应的示意图说明)

在本次讨论中,我们已经全面覆盖了Linux VLAN的核心要点。基于这些理解,设计一个单臂Linux设备并非难事。单臂设备的主要优势在于能够有效节省物理资源,同时实现网络隔离。值得注意的是,如果不使用VLAN,可以通过在LAN上添加虚拟IP地址的方式来实现类似的隔离功能。然而,PVLAN作为VLAN的替代方案,能够更灵活地解决VLAN间IP网段隔离的问题。在Linux系统中实现PVLAN配置,无非就是在LAN的访问控制策略上进行调整,这可以通过纯软件方式实现,例如使用ebtables、arptables或iptables来配置相应的访问控制规则。PVLAN本质上是VLAN的一种替代方案,它通过软件实现网络分隔,使得同一IP子网内的主机之间无法互相通信,从而达到隔离的目的。即使你对"隔离VLAN"或"团体VLAN"等术语不熟悉,但只要掌握了基本的访问控制策略配置方法,就已经实现了PVLAN功能。

第三部分:几点总结

建议首先规划网络拓扑结构,而非仅关注VLAN在Linux上的配置细节。深入理解VLAN设计的初衷,明确配置哪些参数和规则。首先,明确以下两点:一是哪些端口属于哪个VLAN;二是哪些端口是级联端口,属于多个VLAN。其次,明确哪些VLAN概念是核心,哪些是辅助性的。最后,无需死记硬背,这些信息只是参考。

全部评论 (0)

还没有任何评论哟~