虚拟局域网(VLAN)

embedded/2024/9/22 19:21:36/

关键词:vethvlan、bridge、iptables、nat、tcpdump、icmp、cidr、arp、路由表、计算机网络协议栈

前言

在过去的几十年里,互联网发展得非常快。许多新兴技术迅速崛起,也有不少曾经的主流技术被淘汰。然而,有些技术因为其基础性和核心地位,一直在不断进步中保持着重要作用。
计算机网络就是其中之一。虽然网络架构和传输协议在不断更新,但其核心概念和原理一直都在发挥着关键作用,支撑着全球的信息交换。在这些技术中,网卡作为计算机连接网络的桥梁,起到了至关重要的作用。

网卡是什么?

网卡属于计算机硬件的一部分,是实现计算机数据传输的关键部件,最常见的有无线网卡和有线网卡,通常是直接或间接集成在计算机主板中,
它可以将计算机产生的数据发送到另一个网络,也可以将另一个网络的数据传递给我们的主机。

什么是虚拟网卡?

虚拟网卡是一种软件实现的网络接口,模拟了物理网卡的功能,使操作系统和应用程序可以通过它发送和接收网络流量。虚拟网卡在虚拟化、容器化的网络环境中发挥着重要的作用。

VETH——创建虚拟网卡及多个内部网络

环境:腾讯云轻量级应用服务器、CentOS 7操作系统

结构图

image-20240517101944754

Shell

# 创建三个网络命名空间用于隔离内部网络(查看命名空间:ip netns)
> ip netns add n1
> ip netns add n2
> ip netns add n3
# 创建三对虚拟网卡(查看网卡:ip link)
> ip link add veth0 type veth peer name veth1
> ip link add veth2 type veth peer name veth3
> ip link add veth4 type veth peer name veth5
# 为veth0、veth2、veth4分配ip地址
> ip addr add 192.168.0.1/24 dev veth0
> ip addr add 192.168.100.1/16 dev veth2
> ip addr add 192.167.0.1/16 dev veth4
# 将veth1、veth3、veth5分别移动到网络命名空间n1、n2、n3中
> ip link set veth1 netns n1
> ip link set veth3 netns n2
> ip link set veth5 netns n3
# 为veth1、veth3、veth5分配ip地址(ip netns exec前缀用来指定具体的网络命名空间)
> ip netns exec n1 ip addr add 192.168.0.2/24 dev veth1
> ip netns exec n2 ip addr add 192.168.100.2/16 dev veth3
> ip netns exec n3 ip addr add 192.167.0.2/16 dev veth5
# 启动网卡
> ip link set veth0 up
> ip netns exec n1 ip link set veth1 up
> ip link set veth2 up
> ip netns exec n2 ip link set veth3 up
> ip link set veth4 up
> ip netns exec n3 ip link set veth5 up# 网络连通测试(仅用veth0、veth1示例,其他两对同理) 
> ping -I veth0 192.168.0.2
> ip netns exec n1 ping 192.168.0.1

小结

网络命名空间(netns)用来隔离三个虚拟以太网,成对出现的虚拟网卡(veth)在这里起到了类似于物理网线的作用。

VLAN——使用虚拟网桥连接多个局域网

结构图

image-20240517113259688

shell

# 创建虚拟网桥
> ip link add br-mybridge type bridge
# 将 veth0、veth2、veth4桥接到网桥中
> ip link set veth0 master br-mybridge
> ip link set veth2 master br-mybridge
> ip link set veth4 master br-mybridge
# 启动网桥
> ip link set br-mybridge up
# 修改主机路由表(删除旧路由+添加新路由)
> ip route del 192.168.0.0/24 dev veth0
> ip route del 192.168.0.0/16 dev veth2
> ip route del 192.167.0.0/16 dev veth4
> ip route add 192.168.0.0/16 dev br-mybridge
> ip route add 192.167.0.0/16 dev br-mybridge
# 添加命名空间内部的路由
> ip netns exec n1 ip route del 192.168.0.0/24 dev veth1
> ip netns exec n1 ip route add 192.168.0.0/16 dev veth1
> ip netns exec n1 ip route add 192.167.0.0/16 dev veth1
> ip netns exec n2 ip route add 192.167.0.0/16 dev veth3
> ip netns exec n3 ip route add 192.168.0.0/16 dev veth5
# 删除veth0、veth2、veth4的ip地址
> ip addr del 192.168.0.1/24 dev veth0
> ip addr del 192.168.100.1/16 dev veth2
> ip addr del 192.167.0.1/16 dev veth4
# 网络连通测试(仅用n1网络作为示例,其他两个网络同理) 
> ip netns exec n1 ping 192.168.100.2
> ip netns exec n1 ping 192.167.0.2

小结

虚拟网桥类似于物理交换机的作用,通过将多个虚拟网卡串联在一起实现内部通信功能。

深入思考:为什么网桥不需要设置ip地址?

因为网桥和物理交换机一样是工作在数据链路层基于mac地址转发帧(frame)的一种设备。如果该设备仅用来做转发功能,那么ip地址对其来说是可选的。

深入思考:为什么桥接后不修改路由表时,内部网络无法ping通原主机?

猜测:设置了桥接模式后,veth0/veth2/veth4的作用就仅仅是转发数据链路层的帧(frame)。此时ping命令产生的arp请求会转发给网桥br-mybridge进行处理,或许是网桥进行arp广播的时候veth0/veth2/veth4没有处理arp请求,所以导致无法通信。

vlan_120">NAT——使用iptables打通vlan和互联网

结构图

image-20240522145240147

shell

# 打开内核的ip转发功能:将net.ipv4.ip_forward=0 变更为 net.ipv4.ip_forward=1
> vim /etc/sysctl.conf
# 检查ip转发功能是否开启
> sysctl -p 
# 设置网关ip地址
> ip addr add 192.168.0.1/16 dev br-mybridge
# 设置子网的网关地址
> ip netns exec n1 ip route add default via 192.168.0.1 dev veth1
> ip netns exec n2 ip route add default via 192.168.0.1 dev veth3
> ip netns exec n3 ip route add default via 192.168.0.1 dev veth4
# (可选)关闭firewalld防火墙,因为firewalld防火墙是基于iptables的,所以会有很多规则可能会影响测试结果。生产环境切勿贸然尝试
> systemctl stop firewalld
# 添加br-mybridge与eth0的转发规则
> iptables -A FORWARD -i br-mybridge -o eth0 -j ACCEPT
> iptables -A FORWARD -i eth0 -o br-mybridge -j ACCEPT
# 添加nat规则
> iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 互联网连通测试(仅用n1网络作为示例,其他两个网络同理) 
> ip netns exec n1 curl baidu.com
> ip netns exec n1 ping 192.167.0.2

小结

通过iptables实现了虚拟网桥的路由功能,此时这里的虚拟网桥(br-mybridge)已经不仅仅只是做数据帧转发工作,同时还将基于ip协议转发网络层的数据包。所以这里br-mybridge的作用更相近于路由器

总结

本文通过veth讲解了虚拟局域网的通信方式,并通过虚拟网桥、iptables、nat等技术模拟了生活中比较常见的一些网络结构。


http://www.ppmy.cn/embedded/42757.html

相关文章

Web开发核心

文章目录 1.http协议简介2.http协议特性3.http请求和响应协议4.最简单的Web程序5.基于flask搭建web⽹站6.浏览器开发者⼯具(重点) 1.http协议简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于 万维网(WWW:Norld W…

嵌入式学习——3——TCP并发(未完成)

1、多进程实现TCP并发 //定义信号处理函数 void handler(int signo) {if(signo SIGCHLD){// 回收所有的僵尸进程while(waitpid(-1, NULL, WNOHANG) ! 0); } }int main(){//将SIGCHLD信号绑定到信号处理函数中signal(SIGCHLD, handler);sfd socket(); //创建用于…

B站滑块登录之极验点选

滑块登录这些东西都不是很难,我个人的去处理的话一般会考虑三种方案,一个是自动化selenium 二是各类打码平台 三是ocr识别,本文是selenium接打码平台,也是个比较常规的操作。 先常规步骤跟着来吧,做登录的话把基本的模…

算法随想录第十三天打卡|239. 滑动窗口最大值,347.前 K 个高频元素

239. 滑动窗口最大值 (一刷至少需要理解思路) 之前讲的都是栈的应用,这次该是队列的应用了。 本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。 题目链接/文章讲解/视频讲解:代码随想录 c…

MySQL8.0新特性CTE表达式递归实现累加运算 1+2+…+n 等于多少?

上一篇内容,通过MySQL存储过程实现累加运算 12…n 等于多少的需求,使用当前主流版本MySQL5.7.x 和MySQL8.0.x,以及最新的MySQL8.4 LST版本。 WITH AS子句在MySQL 8.0.x及更高版本中得到支持,而在MySQL 5.7及以下版本中则不支持。…

设计模式之六大设计原则

文章目录 高内聚低耦合设计原则开闭原则单一职责原则里氏代换原则依赖倒置原则迪米特原则接口隔离原则 高内聚低耦合 提高代码的可读性、可维护性和可扩展性,降低开发和维护的成本,并减少系统的风险 内聚: 表示内部间聚集、关联的程度 耦合…

东方通TongWeb结合Spring-Boot使用

一、概述 信创需要; 原状:原来的服务使用springboot框架,自带的web容器是tomcat,打成jar包启动; 需求:使用东方通tongweb来替换tomcat容器; 二、替换步骤 2.1 准备 获取到TongWeb7.0.E.6_P7嵌入版 这个文件,文件内容有相关对应的依赖包,可以根据需要来安装到本地…

Mysql自增id、uuid、雪花算法id的比较

MySQL自增id: 优点: 1.简单易用 ​ MySQL自增id 由数据库自动生成。 2.效率高 自增id是按顺序递增的,可以提高插入和查询的效率。 3.索引效率高 自增id可以作为主键或索引列,提高查询效率。 缺点: 1.不适用于分布式系统 在分布式…