linux vlan配置详解

发布时间 - 2017-12-14 00:00:00    点击率:

本文主要给大家介绍了关于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
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 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

如果试图从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

VLAN学习总结

交换机VLAN配置


# linux  # 两层  # 我们可以  # 网桥  # 分别在  # 的是  # 使用了  # 很好  # 就能  # 是这样  # 都能 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: PHP正则匹配日期和时间(时间戳转换)的实例代码  googleplay官方入口在哪里_Google Play官方商店快速入口指南  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  ,在苏州找工作,上哪个网站比较好?  如何在阿里云完成域名注册与建站?  进行网站优化必须要坚持的四大原则  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何快速生成可下载的建站源码工具?  浅析上传头像示例及其注意事项  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  教你用AI润色文章,让你的文字表达更专业  中山网站制作网页,中山新生登记系统登记流程?  LinuxCD持续部署教程_自动发布与回滚机制  什么是javascript作用域_全局和局部作用域有什么区别?  jQuery 常见小例汇总  如何在Windows 2008云服务器安全搭建网站?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何在宝塔面板中创建新站点?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  微信小程序 HTTPS报错整理常见问题及解决方案  如何获取免费开源的自助建站系统源码?  SQL查询语句优化的实用方法总结  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  jquery插件bootstrapValidator表单验证详解  使用Dockerfile构建java web环境  Python图片处理进阶教程_Pillow滤镜与图像增强  无锡营销型网站制作公司,无锡网选车牌流程?  如何基于云服务器快速搭建网站及云盘系统?  独立制作一个网站多少钱,建立网站需要花多少钱?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何自定义建站之星网站的导航菜单样式?  Laravel如何发送系统通知?(Notification渠道示例)  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  如何快速搭建个人网站并优化SEO?  如何用已有域名快速搭建网站?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  手机网站制作与建设方案,手机网站如何建设?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  大连 网站制作,大连天途有线官网?  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  魔毅自助建站系统:模板定制与SEO优化一键生成指南  C++时间戳转换成日期时间的步骤和示例代码