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

简介

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

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

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

linux虚拟网络设备之vlan配置

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

linux虚拟网络设备之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

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 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呀:

?

# 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

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

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

参考: http://network.51cto.com/art/201504/473419.htm

总结

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

原文链接:https://phpor.net/blog/post/7109

原创文章,作者:LQKZY,如若转载,请注明出处:https://www.wangzhanshi.com/n/9337.html

(0)
LQKZY的头像LQKZY
上一篇 2025年1月1日 16:40:01
下一篇 2025年1月1日 16:40:05

相关推荐

  • linux性能调试之vmstat分析

    1.性能分析的目的 1)找出系统性能瓶颈(包括硬件瓶颈和软件瓶颈); 2)提供性能优化的方案(升级硬件?改进系统系统结构?); 3)达到合理的硬件和软件配置; 4)使系统资源使用达…

    2025年1月1日
  • Linux使用终端工具给你的电脑发送弹窗提醒!

    大家好,我是良许。 现在人手一部智能手机,这些智能手机都有个非常实用的功能,那就是弹窗提醒。当我们收到短信,或者微信信息时,手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过…

    2025年1月1日
  • Linux下connect超时处理(总结)

    1、前言 最近在写一个测试工具,要求快速的高效率的扫描出各个服务器开放了哪些端口。当时想了一下,ping只能检测ip,判断服务器的网络是连通的,而不能判断是否开放了端口。我们知道端…

    2025年1月1日
  • 初窥Linux 之我最常用的20条命令总结

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了。当然你也…

    Linux 2025年1月1日
  • Linux基础之终端、控制台、tty、pty简介说明

    一、 基本概念 1、 tty tty(终端设备的统称):tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发…

    Linux 2025年1月1日
  • Linux下用pdftk-java 命令编辑 PDF 的四种方法

    用这个方便的 Linux 命令合并 PDF、删除页面、分割 PDF 和填写表格。 技术白皮书、手稿和 RPG 手册,我每天都要处理大量的 PDF 文件。PDF 格式之所以受欢迎,是…

    2025年1月1日
  • 教你如何修改Linux远程登录欢迎提示信息

    无论何时登录公司的某些生产系统,你都会看到一些登录消息、警告或关于你将登录或已登录的服务器的信息,如下所示。这些是登录导语login banner。 在本文中,我们将教你如何配置它…

    2025年1月1日
  • Linux下几种运行后台任务的方法

    1.问题的引入 程序员最不能容忍的是在使用终端的时候往往因为网络,关闭屏幕,执行CTRL+C等原因造成ssh断开造成正在运行程序退出,使得我们的工作功亏一篑。 其背后的主要原因在于…

    2025年1月1日
  • linux ss命令详解

    ss 是 socket statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细…

    2025年1月1日
  • Node.js环境在linux上的部署教程

    我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 ? curl –silent –location https://r…

    2025年1月1日

发表回复

登录后才能评论