Linux实现的IEEE 802.1Q VLAN(1)


VLAN是一种将局域网设备从逻辑上划分成一个个网段,从而实现虚拟工作组的新兴数据交换技术。IEEE802.1q协议也就是“VirtualBridgedLocalAreaNetworks”(虚拟桥接局域网,简称“虚拟局域网”)协议,主要规定了VLAN的实现方法。本博文将重新解读该协议,并演示Vlan间通信的原理及配置。 

VLAN的核心概念

说起IEEE 802.1q,都知道是VLAN,说起VLAN,基本上也没有盲区,网络基础。然而说到配置,基本所有人都能顺口溜一样说出Cisco或者H3C设备的配置命令,对于Linux的VLAN配置却存在大量的疑问。这些疑问之所以存在我觉得有两点原因:

1.对VLAN的本质还是没有理解。

不管你的Cisco/H3C命令敲得再熟练,如果看不懂Linux的vconfig,那么也将无法掩饰你对概念理解的浅显;

2.对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可以和它们有大不同。

关键看最后3点,也就是3,4,5。这是VLAN最难理解的部分,不过一旦理解了,VLAN也就不剩下什么了。为了使得叙述上以及配置上更加的方便,Cisco以及其他的厂商定义了很多的细节,而这些细节在IEEE 802.1q标准中并没有被定义,这些细节包括但不局限于以下几点:

1.每一个VLAN交换机端口需要绑定一个VLAN id;

2.每一个VLAN交换机端口处于下面三类中的一类:access,trunk,hybrid。

2.1.access端口:从此类端口收到的数据帧是不打tag的,从此类端口发出的数据帧是不打tag的;

2.2.trunck端口:从此类端口收到的数据帧打着tag,从此类端口发出的数据帧需要打tag(不考虑缺省VLAN的情况);

2.3.hybrid端口:略

我们实则没有必要去深究Cisco/H3C的命令以及到底那三类端口类型有何区别,之所以有三类端口类型完全是为了将VLAN的概念(最终的IEEE 802.1q标准)很方便的用起来。说白了,trunk端口的存在是因为不得已,因为有属于多个VLAN的数据帧要通过单一的物理链路,不打tag是无法区分各自属于哪个VLAN的,于是就有了IEEE 802.1q这个标准,定义了一个tag插入到以太帧中,为了使这个理论性的东西被使用起来,厂商便定义了一系列的概念性的东西,比如和tag相关的链路就是trunk链路之类。

于是乎,我们可以完全抛开任何的配置命令,抛开任何厂商定义的东西,完全按照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,十分显然的办法就是为数据帧打上tag,因此上述1.2中的端口J和端口K之间的链路上的数据帧需要打tag,端口J和端口K都同属于两个VLAN,分别为VLAN m和VLAN n。换句话说,只要一个端口需要传输和接收属于多个VLAN的数据帧,那么从该端口发出的数据帧就要打上tag,从该端口接收的数据帧可以通过tag来识别它属于哪个VLAN,用Cisco/H3C等厂商的术语来讲,它就是trunk端口,两个trunck端口之间的链路属于trunk链路。

我们知道,一般而言,我们的PC机直接连接在常规二层交换机或者支持VLAN的交换机端口上,而我们的PC机发出的一般都是常规的以太网数据帧,这些数据帧是没有tag的,它们可能根本不知道802.1q为何物,然而VLAN存在的目的就是把一些PC机划在一个VLAN中,而把另一些PC机划在另一个VLAN中从而实现隔离,那么很显然的一种办法就是将支持VLAN的交换机的某些端口划在一个VLAN,而另一些端口划在另一个VLAN中,一个VLAN的所有端口其实就形成了一个逻辑上的二层常规交换机,同属于一个VLAN的PC机连接在划在同一个VLAN的端口上,为了扩展VLAN,鉴于单台交换机端口数量的限制,需要级联交换机,那么级联链路上则同时承载着不同VLAN流量,因此级联链路则成为trunk链路,所有不是级联链路的链路都是直接链路,用厂商术语来讲就是access链路(注意,这里暂且不谈hybrid),自然而然的,access链路两端的端口都是和tag无关的,只需要做到“没有tag直通,有tag去掉即可”,因此它可以连接PC机或者常规交换机以及VLAN交换机的非trunk端口。

VLAN的内容基本也就是以上那些了,分为三部分:

1.设计目的

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

2.IEEE 802.1q

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

3.如何使用VLAN

将某些端口划为一个VLAN,基于MAC地址什么的...

其实,至于怎么划分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。


相关内容