转: linux虚拟网络设备之vlan配置详解
转载:https://www.jb51.net/article/130486.htm
linux虚拟网络设备之vlan配置详解
这篇文章主要给大家介绍了关于linux虚拟网络设备之vlan配置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
简介
VLAN是网络栈的一个附加功能,且位于下两层。首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去。下两层涉及到具体的硬件设备,日趋完善的Linux内核已经做到了很好的代码隔离,对网络设备驱动也是如此,如下图所示:

这里要注意的是,Linux下的网络设备net_dev并不一定都对应实际的硬件设备,只要注册一个struct net_device{}结构体(netdevice.h)到内核中,那么这个网络设备就存在了。该结构体很庞大,其中包含设备的协议地址(对于IP即IP地址),这样它就能被网络层识别,并参与路由系统,最有名的当数loopback设备。不同的设备(包括硬件和非硬件)的ops操作方法各不相同,由驱动自己实现。一些通用性的、与设备无关的操作流程(如设备锁定等)则被Linux提炼出来,我们称为驱动框架。
linux虚拟网络设备之vlan配置
我们通过一个网桥两个设备对,来连接两个网络名字空间,每个名字空间中创建两个vlan
借助vconfig来配置vlan:
1 #创建网桥 2 brctl addbr br-test-vlan 3 #创建veth对儿 4 ip link add veth01 type veth peer name veth10 5 ip link add veth02 type veth peer name veth20 6 #将veth对儿的一段添加到网桥 7 brctl addif br-test-vlan veth01 8 brctl addif br-test-vlan veth02 9 #启动设备 10 ip link set dev br-test-vlan up 11 ip link set dev veth01 up 12 ip link set dev veth02 up 13 ip link set dev veth10 up 14 ip link set dev veth20 up 15 #创建网络名字空间 16 ip netns add test-vlan-vm01 17 ip netns add test-vlan-vm02 18 #将设备对儿的另一端添加到另个名字空间(其实在一个名字空间也能玩,只是两个名字空间更加形象) 19 ip link set veth10 netns test-vlan-vm01 20 ip link set veth20 netns test-vlan-vm02 21 #分别进入两个名字空间创建vlan和配置ip 22 #配置名字空间test-vlan-vm01 23 ip netns exec test-vlan-vm01 bash 24 #配置vlan 3001 和 vlan 3002 25 vconfig add veth10 3001 26 vconfig add veth10 3002 27 #启动两个vlan的设备 28 ip link set veth10.3001 up 29 ip link set veth10.3002 up 30 #分别在两个vlan上配置ip (这里简单起见,使用了同一个网段了IP,缺点是,需要了解一点儿路由的知识) 31 ip a add 172.16.30.1/24 dev veth10.3001 32 ip a add 172.16.30.2/24 dev veth10.3002 33 #添加路由 34 route add 172.16.30.21 dev veth10.3001 35 route add 172.16.30.22 dev veth10.3002 36 #配置名字空间test-vlan-vm02 37 ip netns exec test-vlan-vm02 bash 38 #配置vlan 3001 和 vlan 3002 39 vconfig add veth20 3001 40 vconfig add veth20 3002 41 #启动两个vlan的设备 42 ip link set veth20.3001 up 43 ip link set veth20.3002 up 44 #分别在两个vlan上配置ip (这里简单起见,使用了同一个网段了IP,缺点是,需要了解一点儿路由的知识) 45 ip a add 172.16.30.21/24 dev veth20.3001 46 ip a add 172.16.30.22/24 dev veth20.3002 47 #添加路由 48 route add 172.16.30.1 dev veth20.3001 49 route add 172.16.30.2 dev veth20.3002
查看一下vlan配置:
1 # cat /proc/net/vlan/config 2 VLAN Dev name | VLAN ID 3 Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD 4 veth10.3001 | 3001 | veth10 5 veth10.3002 | 3002 | veth10
现在,我们可以分别在两个名字空间来ping另外一个名字空间的两个IP,虽然两个IP都能ping通,但是使用的源IP是不同的,走的vlan也是不同的,我们可以在veth01/veth10/veth02/veth20/br-test-vlan 任意一个上抓包,会看到vlan信息:
如果试图从veth10.3001 去ping 172.16.30.22 是不能通的,因为是不同的vlan呀:
不适用vconfig的解法:
另: vlan 一般以 设备名.vlanid 来命名,不过并非强制,如下命名为 vlan3003也是没问题的
注意:一个主设备上相同vlan好的子设备最多只能有一个
1 # ip link add link veth10 name vlan3001 type vlan id 3001 2 RTNETLINK answers: File exists
所以,正常来讲,一般是这样的:

参考: http://network.51cto.com/art/201504/473419.htm
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

浙公网安备 33010602011771号