linux虚拟⽹络设备之vlan配置详解
简介
VLAN是⽹络栈的⼀个附加功能,且位于下两层。⾸先来学习Linux中⽹络栈下两层的实现,再去看如何把VLAN这个功能附加上去。下两层涉及到具体的硬件设备,⽇趋完善的Linux内核已经做到了很好的代码隔离,对⽹络设备驱动也是如此,如下图所⽰:
这⾥要注意的是,Linux下的⽹络设备net_dev并不⼀定都对应实际的硬件设备,只要注册⼀个struct net_device{}结构体(netdevice.h)到内核中,那么这个⽹络设备就存在了。该结构体很庞⼤,其中包含设备的协议地址(对于IP即IP地址),这样它就能被⽹络层识别,并参与路由系统,最有名的当数loopback设备。不同的设备(包括硬件和⾮硬件)的ops操作⽅法各不相同,由驱动⾃⼰实现。⼀些通⽤性的、与设备⽆关的操作流程(如设备锁定等)则被Linux提炼出来,我们称为驱动框架。
linux虚拟⽹络设备之vlan配置
我们通过⼀个⽹桥两个设备对,来连接两个⽹络名字空间,每个名字空间中创建两个vlan
借助vconfig来配置vlan:
#创建⽹桥
brctl addbr br-test-vlan
#创建veth对⼉
ip link add veth01 type veth peer name veth10
ip link add veth02 type veth peer name veth20
#将veth对⼉的⼀段添加到⽹桥
brctl addif br-test-vlan veth01
brctl addif br-test-vlan veth02
#启动设备
ip link set dev br-test-vlan up
ip link set dev veth01 up
ip link set dev veth02 up
ip link set dev veth10 up
ip link set dev veth20 up
#创建⽹络名字空间
ip netns add test-vlan-vm01
ip netns add test-vlan-vm02
#将设备对⼉的另⼀端添加到另个名字空间(其实在⼀个名字空间也能玩,只是两个名字空间更加形象)
ip link set veth10 netns test-vlan-vm01
ip link set veth20 netns test-vlan-vm02
#分别进⼊两个名字空间创建vlan和配置ip
#配置名字空间test-vlan-vm01
ip netns exec test-vlan-vm01 bash
#配置vlan 3001 和 vlan 3002
vconfig add veth10 3001
vconfig add veth10 3002
#启动两个vlan的设备
ip link set veth10.3001 up
ip link set veth10.3002 up
#分别在两个vlan上配置ip (这⾥简单起见,使⽤了同⼀个⽹段了IP,缺点是,需要了解⼀点⼉路由的知识)
ip a add 172.16.30.1/24 dev veth10.3001
ip a add 172.16.30.2/24 dev veth10.3002
#添加路由
route add 172.16.30.21 dev veth10.3001
route add 172.16.30.22 dev veth10.3002
#配置名字空间test-vlan-vm02
ip netns exec test-vlan-vm02 bash
#配置vlan 3001 和 vlan 3002
vconfig add veth20 3001
route add 添加路由vconfig add veth20 3002
#启动两个vlan的设备
ip link set veth20.3001 up
ip link set veth20.3002 up
#分别在两个vlan上配置ip (这⾥简单起见,使⽤了同⼀个⽹段了IP,缺点是,需要了解⼀点⼉路由的知识)
ip a add 172.16.30.21/24 dev veth20.3001
ip a add 172.16.30.22/24 dev veth20.3002
#添加路由
route add 172.16.30.1 dev veth20.3001
route add 172.16.30.2 dev veth20.3002
查看⼀下vlan配置:
# cat /proc/net/vlan/config
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
veth10.3001 | 3001 | veth10
veth10.3002 | 3002 | veth10
现在,我们可以分别在两个名字空间来ping另外⼀个名字空间的两个IP,虽然两个IP都能ping通,但是使⽤的源IP是不同的,⾛的vlan也是不同的,我们可以在veth01/veth10/veth02/veth20/br-test-vlan
任意⼀个上抓包,会看到vlan信息:
# tcpdump -i veth10 -nn -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth10, link-type EN10MB (Ethernet), capture size 262144 bytes
15:38:18.381010 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan <span >3001</span>, p 0, ethertype IPv4, <strong><span >172.16.30.1 > 172.16.30.21</span></strong>: ICMP e 15:38:18.381183 9e:58:72:fa:11:15 > 82:f7:0e:2d:3f:62, ethertype 802.1Q (0x8100), length 102: vlan <span ><strong>3001</strong></span>, p 0, ethertype IPv4, 172.16.30.21 > 172.16.30.1: ICMP echo reply, id 19466, seq 1, length 64 15:38:19.396796 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan 3001, p 0, ethertype IPv4, 172.16.30.1 > 172.16.30.21: ICMP echo request, id 19466, seq 2, length 64
15:38:19.396859 9e:58:72:fa:11:15 > 82:f7:0e:2d:3f:62, ethertype 802.1Q (0x8100), length 102: vlan 3001, p 0, ethertype IPv4, 172.16.30.21 > 172.16.30.1: ICMP echo reply, id 19466, seq 2, length 64
15:38:23.162052 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan 3
002, p 0, ethertype IPv4, 172.16.30.2 > <strong><span >172.16.30.22</span></strong>: ICMP echo request, id 19473, seq 1, length 64 15:38:23.162107 9e:58:72:fa:11:15 > 82:f7:0e:2d:3f:62, ethertype 802.1Q (0x8100), length 102: vlan 3002, p 0, ethertype IPv4, <strong><span >172.16.30.22 > 172.16.30.2</span></strong>: ICMP echo reply, id 19473, seq 1, length 64如果试图从veth10.3001 去ping 172.16.30.22 是不能通的,因为是不同的vlan呀:
# ping -I veth10.3001 172.16.30.22
PING 172.16.30.22 (172.16.30.22) from 172.16.30.1 veth10.3001: 56(84) bytes of data.
^C
--- 172.16.30.22 ping statistics ---
9 packets transmitted, 0 received, 100% packet loss, time 8231ms
不适⽤vconfig的解法:
ip link add link veth10 name veth10.3001 type vlan id 3001
另: vlan ⼀般以设备名.vlanid 来命名,不过并⾮强制,如下命名为 vlan3003也是没问题的
# ip link add link veth10 name vlan3003 type vlan id 3003
注意:⼀个主设备上相同vlan好的⼦设备最多只能有⼀个
# ip link add link veth10 name vlan3001 type vlan id 3001
RTNETLINK answers: File exists
所以,正常来讲,⼀般是这样的:
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论