linux上做vlan,access trunk的理解???
本帖最后由 linuxlearning4RMB 于 2015-12-17 11:27 编辑在linux机器上,通过brctl和vconfig来模拟vlan实验
在linux上要做vlan,那么如创建一个access口,一个trunk口?
假设有网卡eth0 eth1 eth2 eth3
vconfig add eth0 100
vconfig add eth1 100
那么现在eth0 eth1都是access口了
然后通过brctl把eth0.100 eth1.100加到br0里面,那么这样就有一vlan了
那么现在要把eth2做成trunk口,trunk口应该是同时属于多个vlan的
vconfig add eth2 300
vconfig add eth2 400
那么能不能这样理解,在linux上如果某个网卡只属于一个vlan,那么这个网卡就是access口;
如果一个网口同时属于多个vlan,那么它就是trunk口。
会存在这么一种情况吗,就是在linux上把某个网卡设置为trunk口,但是这个网卡 只 属于一个vlan?
感觉在linux上创建的vlan和思科 h3c他们的有些不太一样。
思科 h3c上的native vid对应linux上的什么呢
思科 h3c上可以把某个口设置为trunk口,但是只有给一个vid的吗,没有使用过思科 华三的设备。
1. 不能这么理解:“那么能不能这样理解,在linux上如果某个网卡只属于一个vlan,那么这个网卡就是access口;
如果一个网口同时属于多个vlan,那么它就是trunk口“
2. 会存在这么一种情况吗,就是在linux上把某个网卡设置为trunk口,但是这个网卡 只 属于一个vlan?
这种情况是存在的,你可有找台交换机配置一下看看
本帖最后由 linuxlearning4RMB 于 2015-12-17 11:47 编辑
woshipanlaoda 发表于 2015-12-17 10:57 static/image/common/back.gif
1. 不能这么理解:“那么能不能这样理解,在linux上如果某个网卡只属于一个vlan,那么这个网卡就是access口;
如果一个网口同时属于多个vlan,那么它就是trunk口“
2. 会存在这么一种情况吗,就是在linux上把某个网卡设置为trunk口,但是这个网卡 只 属于一个vlan?
这种情况是存在的,你可有找台交换机配置一下看看
在交换机上,某一个网口是可以设置为trunk口,但是却只属于一个vlan。
但是在linux机器上,通过brctl和vconfig来模拟vlan实验,那么你根本没有办法把某一个网口置为trunk口,因为内核里面没有这么一个对应的字段;同理也没有办法把一个网口置为access。
现在讨论的是在是linux机器上通过brctl和vconfig来模拟vlan。 本帖最后由 nswcfd 于 2015-12-17 15:57 编辑
===删除跟5楼重复的内容=== 内核里没有acess/trunk的概念。
基于brctl和vconfig,可以模拟交换机的vlan行为。
通常意义上,可以认为bridge的每个port是access口(因为它没有任何tag操作),vconfig创建的虚口除外(虚口的核心功能是tag操作)。
不严格的说,如果哪个port用vconfig创建了多个虚口,并且每个虚口都加入了一个bridge,就可以称这个port是trunk口。
linux在这方面的一个很大不足就是,需要多少个vlan,就得创建多少个bridge(trunk口需要创建同样数量的虚口)。
根本上是由于bridge的转发表没有vlan tag的维度,要想实现不同vlan独立转发,只能使用多个bridge实例来实现转发表的隔离。
由于一个port只能加入一个bridge,所以楼主的“在linux上如果某个网卡只属于一个vlan,那么这个网卡就是access口”这个话是成立的。
这句话的另外一半,“如果一个网口同时属于多个vlan,那么它就是trunk口”,不太严格,建议改成“一个网口有多个虚口属于多个vlan,那么它就是trunk口”。
注意这个trunk口本身是不属于任何bridge的。 回复 5# nswcfd
非常感谢你的指点,非常详尽!!!明白了很多,我这里举一个例子,看看我是不是理解到位了:假设有网卡eth0 eth1 eth2
建一个vid为100的vlan
vconfig add eth0 100
vconfig add eth1 100
brctl addbr brvlan100
brctl addif brvlan100 eth1.100 eth0.100 #那么现在eth0 eth1都是access口了
再建一个vid为200的vlan
vconfig add eth1 200
vconfig add eth2 200
brctl addbr brvlan200 #这个时候eth1严格来说,还不是trunk口,对吗?
brctl addif brvlan200 eth1.200 eth2.200 #这个时候eth1才是trunk口 有点问题。
任何加入bridge的port,如果是vconfig生成的虚拟port,那么它只能收取带tag的报文,发送的报文也必定带着tag,这是8021q这个模块决定的。
对于vlan100,eth0和eth1都只能收取tag=100的报文,不能收取不带tag或者是带其它tag的报文。
从这个意义上来说,它不是access口(如果把access定义为只接受不带tag的报文的话)。
不考虑硬件的vlan加速(由硬件剥离tag),报文在vlan100的处理流程为:
1)eth0接收报文(假设目的mac不是本机);
2)eth0口不是bridge的port,所以进入正常的本地layer 2分发;
3)如果报文不带tag,则是普通IP报文,进入本地IP协议栈处理,已经跟vlan无关了;
4)带tag的报文是8021q报文,所以进入8021q的处理函数;
5)剥离tag,检查入口(eth0)上有没有对应的虚接口;
6)如果tag不是100或200,则不存在虚接口,报文被丢弃;
7)找到eth0.100或者eth0.200,以此为新的接收口,重新执行接收逻辑(模拟虚接口的rx);
8)在虚口eth0.100上收到了剥离tag后的IP报文;
9)eth0.100是bridge的port,所以进入vlan100的处理流程,不再进行layer 2的分发。
只要是把虚接口加入到bridge里面,就只能接受带特定tag的报文了。
如果只创建了vlan100而没有创建vlan200,eth0,eth1还是trunk口,只是这个trunk只能允许一个tag而已。
楼主的“在linux上如果某个网卡只属于一个vlan,那么这个网卡就是access口”这句话,我理解成把port本身加入vlan,于是说是正确的;
但楼主想表达的是把port的一个虚口加入vlan(相对于多个虚口而言),不好意思,没真正理解楼主的意图。 回复 7# nswcfd
刚才创建vlan的方式不对。更改一下:假设有网卡eth0 eth1 eth2
建一个vid为100的vlan
vconfig add eth1 100
brctl addbr brvlan100
brctl addif brvlan100 eth1.100 eth0 #那么现在eth0 eth1都是access口了
再建一个vid为200的vlan
vconfig add eth1 200
brctl addbr brvlan200 #这个时候eth1严格来说,还不是trunk口,对吗?
brctl addif brvlan200 eth1.200 eth2 #这个时候eth1才是trunk口这样创建,eth0 eth2 才是access口,eth1是trunk口对吧???eth1是为了和别的“交换机”(使用linux的brctl来模拟的)连接
回复 7# nswcfd
vconfig add eth1 100
vconfig add eth2 100
brctl addbr vlan100
brctl addif vlan100 eth1.100 eth2.100
vconfig add eth3 200
vconfig add eth4 200
brctl addbr vlan200
brctl addif vlan200 eth3.200 eth4.200在这种情况下,网卡1 网卡2 网卡3 网卡4都是 trunk口
左边的配置:vconfig add eth5 100
brctl addbr vlan100
brctl addif vlan100 eth5.100 eth2 eth1
vconfig add eth5 200
brctl addbr vlan200
brctl addif vlan200 eth5.200 eth3 eth4网卡1 网卡2 网卡3 网卡4都是access口,网卡5才是trunk口 嗯,是这个意思。
PS,第一张图,如果需求只是1/2,3/4独立交互的话,没有必要引入trunk。
页:
[1]
2