linux虚拟网络设备之vlan配置详解

https://www.jb51.net/article/130486.htm

 

注意VLAN方式达到了网络隔离,但是mac地址是相同的,意思就是基于同一个网卡出来的vlan mac地址相同。要想不通,可以用macvlan,macvtap等相关高级功能

简介

VLAN是网络栈的一个附加功能,且位于下两层。首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去。下两层涉及到具体的硬件设备,日趋完善的Linux内核已经做到了很好的代码隔离,对网络设备驱动也是如此,如下图所示:

这里要注意的是,Linux下的网络设备net_dev并不一定都对应实际的硬件设备,只要注册一个struct net_device{}结构体(netdevice.h)到内核中,那么这个网络设备就存在了。该结构体很庞大,其中包含设备的协议地址(对于IP即IP地址),这样它就能被网络层识别,并参与路由系统,最有名的当数loopback设备。不同的设备(包括硬件和非硬件)的ops操作方法各不相同,由驱动自己实现。一些通用性的、与设备无关的操作流程(如设备锁定等)则被Linux提炼出来,我们称为驱动框架。

linux虚拟网络设备之vlan配置

我们通过一个网桥两个设备对,来连接两个网络名字空间,每个名字空间中创建两个vlan

借助vconfig来配置vlan:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

#创建网桥

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

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配置:

1

2

3

4

5

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

1

2

3

4

5

6

7

8

9

# 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 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

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

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 > <strong><span style="color: #ff0000;">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 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

2

3

4

5

# 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的解法:

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

2

# ip link add link veth10 name vlan3001 type vlan id 3001

 RTNETLINK answers: File exists

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

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Linux VLAN配置是指在Linux操作系统中,通过虚拟局域网(VLAN)技术将一个物理网络划分为多个逻辑独立的虚拟网络,以实现不同网络设备之间的隔离与通信。 首先,在Linux系统中,我们可以使用vconfig命令来创建和管理VLAN。通过该命令,我们可以创建一个或多个虚拟网络接口,并为每个接口指定一个VLAN ID。例如,可以使用以下命令创建一个VLAN接口: vconfig add eth0 10 上述命令将为eth0物理接口创建一个VLAN ID为10的虚拟接口。接下来,我们可以使用ifconfig命令给该虚拟接口分配IP地址和其他相关网络参数,从而使其能够与其他设备进行通信。 另外,我们还可以通过修改系统的网络配置文件来实现VLAN的持久化配置。在大多数Linux发行版中,网络配置文件通常位于/etc/network/interfaces或/etc/sysconfig/network-scripts目录中。我们可以在该文件中添加类似如下的配置: auto eth0.10 iface eth0.10 inet static address 192.168.1.10 netmask 255.255.255.0 vlan_raw_device eth0 上述配置将为VLAN ID为10的虚拟接口eth0.10分配静态IP地址为192.168.1.10,并指定其底层的物理接口为eth0。 最后,为了实现不同VLAN之间的通信,我们还需要在Linux系统上配置路由策略。可以使用ip命令来添加静态路由或者使用动态路由协议,如OSPF或RIP等。路由配置的具体方法与网络环境和需求有关。 总结起来,Linux VLAN配置涉及创建虚拟网络接口、为其分配IP地址、修改网络配置文件以及配置路由策略等步骤。这些操作可通过命令行工具来完成,也可以通过修改网络配置文件实现持久化配置。使用Linux VLAN技术,可以灵活地划分和管理网络资源,实现网络设备之间的隔离和通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值