转: 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信息:

1 # tcpdump -i veth10 -nn -e
2 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
3 listening on veth10, link-type EN10MB (Ethernet), capture size 262144 bytes
4 15:38:18.381010 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan <span style="color: #ff0000;">3001</span>, p 0, ethertype IPv4, <strong><span style="color: #ff0000;">172.16.30.1 > 172.16.30.21</span></strong>: ICMP echo request, id 19466, seq 1, length 64
5 15:38:18.381183 9e:58:72:fa:11:15 > 82:f7:0e:2d:3f:62, ethertype 802.1Q (0x8100), length 102: vlan <span style="color: #ff0000;"><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
6 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
7 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
8 15:38:23.162052 82:f7:0e:2d:3f:62 > 9e:58:72:fa:11:15, ethertype 802.1Q (0x8100), length 102: vlan 3002, p 0, ethertype IPv4, 172.16.30.2 > <strong><span style="color: #ff0000;">172.16.30.22</span></strong>: ICMP echo request, id 19473, seq 1, length 64
9 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 style="color: #ff0000;">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呀:

1 # ping -I veth10.3001 172.16.30.22
2 PING 172.16.30.22 (172.16.30.22) from 172.16.30.1 veth10.3001: 56(84) bytes of data.
3 ^C
4 --- 172.16.30.22 ping statistics ---
5 9 packets transmitted, 0 received, 100% packet loss, time 8231ms

 

不适用vconfig的解法:

1 ip link add link veth10 name veth10.3001 type vlan id 3001

 

另: vlan 一般以  设备名.vlanid 来命名,不过并非强制,如下命名为 vlan3003也是没问题的

1 # ip link add link veth10 name vlan3003 type vlan id 3003

 

注意:一个主设备上相同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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

posted @ 2019-12-01 15:32  gageshen  阅读(1137)  评论(0)    收藏  举报