这篇文章给你们分享的是有关linux虚拟网路设备之vlan配置的示例剖析的内容。小编感觉挺实用的,因而分享给你们做个参考,一起追随小编过来瞧瞧吧。

简介

VLAN是网路栈的一个附加功能,且坐落下两层。首先来学习Linux中网路栈下两层的实现,再去看怎么把VLAN这个功能附加起来。下两层涉及到具体的硬件设备,日趋健全的Linux内核早已做到了挺好的代码隔离,对网路设备驱动也是这么,如右图所示:

这儿要注意的是中国linux,Linux下的网路设备net_dev并不一定都对应实际的硬件设备,只要注册一个structnet_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 veth20
ip link add veth02 type veth peer name veth30 
#将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 veth20 up
ip link set dev veth30 up 
#创建网络名字空间
ip netns add test-vlan-vm01
ip netns add test-vlan-vm02 
#将设备对儿的另一端添加到另个名字空间(其实在一个名字空间也能玩,只是两个名字空间更加形象)
ip link set veth20 netns test-vlan-vm01
ip link set veth30 netns test-vlan-vm02 
#分别进入两个名字空间创建vlan和配置ip
#配置名字空间test-vlan-vm01
ip netns exec test-vlan-vm01 bash
#配置vlan 3001 和 vlan 3002
vconfig add veth20 3001
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.1/24 dev veth20.3001
ip a add 172.16.30.2/24 dev veth20.3002 
#添加路由
route add 172.16.30.21 dev veth20.3001
route add 172.16.30.22 dev veth20.3002 
#配置名字空间test-vlan-vm02
ip netns exec test-vlan-vm02 bash
#配置vlan 3001 和 vlan 3002
vconfig add veth30 3001
vconfig add veth30 3002
#启动两个vlan的设备
ip link set veth30.3001 up
ip link set veth30.3002 up
#分别在两个vlan上配置ip (这里简单起见,使用了同一个网段了IP,缺点是,需要了解一点儿路由的知识)
ip a add 172.16.30.21/24 dev veth30.3001
ip a add 172.16.30.22/24 dev veth30.3002 
#添加路由
route add 172.16.30.1 dev veth30.3001
route add 172.16.30.2 dev veth30.3002

查看一下vlan配置:

# cat /proc/net/vlan/config 
VLAN Dev name | VLAN ID
Name-Type: VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD
veth20.3001 | 3001 | veth20
veth20.3002 | 3002 | veth20

如今linux虚拟网络设备,我们可以分别在两个名子空间来ping另外一个名子空间的两个IP,即使两个IP都能ping通,并且使用的源IP是不同的,走的vlan也是不同的linux虚拟网络设备,我们可以在veth01/veth20/veth02/veth30/br-test-vlan任意一个上抓包,会听到vlan信息:

# tcpdump -i veth20 -nn -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on veth20, 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 3001, p 0, ethertype IPv4, 172.16.30.1 > 172.16.30.21: ICMP echo request, id 19466, seq 1, length 64
15:38:18.381183 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 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 3002, p 0, ethertype IPv4, 172.16.30.2 > 172.16.30.22: 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, 172.16.30.22 > 172.16.30.2: ICMP echo reply, id 19473, seq 1, length 64

假如企图从veth20.3001去ping172.16.30.22是不能通的,由于是不同的vlan呀:

# ping -I veth20.3001 172.16.30.22
PING 172.16.30.22 (172.16.30.22) from 172.16.30.1 veth20.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 veth20 name veth20.3001 type vlan id 3001

linux虚拟网卡怎么配置_linux虚拟网络设备_linux虚拟ip配置

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

# ip link add link veth20 name vlan3003 type vlan id 3003

注意:一个主设备上相同vlan好的子设备最多只能有一个

# ip link add link veth20 name vlan3001 type vlan id 3001
 RTNETLINK answers: File exists

所以,正常来讲,通常是这样的:

谢谢诸位的阅读!关于“linux虚拟网路设备之vlan配置的示例剖析”这篇文章就分享到这儿了linux移植,希望以上内容可以对你们有一定的帮助,让你们可以学到更多知识,假如认为文章不错,可以把它分享出去让更多的人看见吧!

本文原创地址://q13zd.cn/lxdwlsbzvpzj.html编辑:刘遄,审核员:暂无