
本篇摘要
本文深度解析Linux虚拟网络设备(Tun/Tap、Veth、Bridge)工作原理,实战演示网络命名空间隔离通信,并深入剖析VLAN、VXLAN、Macvlan、IPVLAN四大虚拟组网技术的核心机制与应用场景。
一.Docker 网络原理
虚拟网卡之tun/tap
- 本质是虚拟设备 :
tun和tap是纯软件模拟的网络接口卡,并非物理硬件。它们像真实网卡一样可以配置IP、路由流量,但流量仅在主机内部流转。
如:

- A程序通过eth0访问外面;必须通过tun0借助b程序进行访问。
- 两者操作层级不同:
- tap :操作二层 数据包,模拟的是以太网设备,处理以太网帧(Ethernet frames)。
- tun :操作三层 数据包,模拟的是网络层设备,处理IP报文。
-
核心目的与工作模式 :其核心目的是让用户态程序 (如VPN)能够接管并处理 网络流量。数据包从协议栈发出后,不是直接送往物理网卡,而是通过字符设备(如
/dev/net/tun)交给用户进程处理,处理完后再由该程序发回协议栈。 -
典型应用 :主要用于VPN等场景。如下图所示,VPN程序通过tun设备接收原始数据包,进行加密、封装等操作后,再通过物理网卡(eth0)发送出去,从而实现隧道通信。

- 主要性能缺点 :使用tun/tap设备,数据包需要两次经过 操作系统内核的网络协议栈 ,这会带来一定的
性能开销。正是为了改善这个性能问题,才引入了veth(虚拟以太网设备) pair等其他虚拟网络方案。
虚拟网卡之tun/tap基础指令
-
添加虚拟网卡 使用
ip tuntap add命令创建。- 创建 tap :
ip tuntap add dev [名称] mode tap - 创建 tun :
ip tuntap add dev [名称] mode tun
- 创建 tap :
-
删除虚拟网卡 使用
ip tuntap del命令移除。- 删除 tap :
ip tuntap del dev [名称] mode tap - 删除 tun :
ip tuntap del dev [名称] mode tun
- 删除 tap :
-
激活网卡 创建后的网卡默认处于"DOWN"状态,需使用
ip link set [名称] up命令之后才能进行网络通信。 -
配置IP地址 使用
ip addr add命令为已激活的虚拟网卡分配IP地址和子网掩码。- 例如:
ip addr add 10.5.0.1/24 dev tun0为tun0网卡配置IP10.5.0.1,子网掩码255.255.255.0。
- 例如:
-
查看命令帮助 若忘记完整命令语法,可通过
ip tuntap help快速查看关于tuntap子命令的使用说明和参数选项。
模拟实战了解虚拟网卡之tun/tap

- 添加不同层的tap tun两个虚拟网卡。

- 查看本机网络设备无法发现;因为还需要主动激活(
ifconfig -a可以查看所有的包括未激活)。

- 手动激活后发现对应ip 掩码等都是0;还需要分配。

- 成功添加。

- 对应网卡有ip;蒙骗过ping命令了;故能ping通。

- 取消激活;对应ifconfig看不到了。

- 然后移除这个tun的虚拟网卡。
虚拟网卡之Veth

-
本质与形态 veth 不是一个单独的设备,而是成对出现的虚拟设备对(veth pair) 。它可以被形象地理解为一根虚拟的网线,两端各连接着一个虚拟网卡。
-
核心用途 主要用于连接两个隔离的网络命名空间(Network Namespace) ,实现它们之间的直接通信 。数据从一端输入,会从另一端原封不动地流出。
-
性能优势 与 tun/tap 设备相比,veth 通信不需要多次经过主机的网络协议栈 ,因此数据传输的性能更好、开销更低。
-
主要限制 veth 是点对点 的连接,只能连接两个 命名空间。如果需要连接三个或更多 的命名空间到一个网络中,不能只靠 veth,需要引入虚拟网桥(virtual switch) 来实现。
Veth实战之验证不同namespace之间正常通信

- 这里我们知道:veth是两根虚拟"网线",总是一对一起创建(共生共死);数据从一端进,立马从另一端出,像一根管道;专门用来连通隔离环境(如Docker容器、网络命名空间);它是Docker容器网络的基础,让容器能与外界通信。
veth和网络命名空间常见指令
-
创建 veth pair
使用命令:
ip link add <veth名> type veth peer name <对端名>;这是一次性创建一对虚拟网卡的命令,一根"网线"两端同时生成。 -
删除 veth
使用命令:
ip link delete <veth名>删除指定名称的 veth 设备,其配对的对端设备也会被自动删除。 -
查看 veth
使用命令:
ip link show会列出所有的网络接口,其中包括已创建的 veth 设备,可以通过名称识别(通常名为vethXXX)。 -
创建网络命名空间 (netns)
使用命令:
ip netns add <命名空间名>创建一个全新的、隔离的网络环境(命名空间)(添加网卡去对应命名空间如:ip link set veth11 netns ns1)。 -
删除网络命名空间
使用命令:
ip netns del <命名空间名>删除指定的网络命名空间。 -
在命名空间中执行命令
使用命令:
ip netns exec <命名空间名> <命令>;这是关键命令,用于在指定的隔离网络环境内执行任何命令(如bash、ip addr等),从而配置或查看该环境内的网络状态。 -
查看所有命名空间
使用命令:
ip netns list列出当前系统上所有已创建的网络命名空间。
实战测试:

- 将这两个不同网络命名空间下的虚拟网卡试下ping通。

- 首先构建两个veth类型的虚拟网卡对。

- 发现出现了两个对应网络接口。

- 创建两个网络隔离命名空间;分别把veth1和veth2加进去。

- ip link show 可以看到对应的联通的虚拟网卡veth对。

- 可以ifconfig看到对应的这对网卡正常。

- 给对应命名空间的网卡分配ip。

- 查看每个网络命名空间的虚拟网卡的ip地址;以及可以看到与这个虚拟网卡veth连接的另一端veth(也就是pair对的另一端)所在的的网络命名空间等。

- 这里在对应的网络命名空间进行互相pingpair另一端的veth虚拟网卡ip;发现可以ping通;故跨命名空间完成通信。

- 删除对应的命名空间;然后再用
ip link delete删除对应虚拟网卡设备。
但是这样的网络拓扑存在一个弊端,随着网络设备的增多,网络连线的复杂度将成倍增长(保证每个设备之间都能通信);如:

- 因此可以引用Linux Bridge(网桥)技术来解决。
虚拟交换机(linux bridge)
Linux Bridge 是一个虚拟交换机,主要工作在二层(数据链路层) ,功能类似于现实生活中的家用路由器或交换机,用于连接多个设备,让它们之间能够通信。
- 单纯用 veth pair 直连两个网络命名空间(netns),就像用一根网线直连两台电脑,只能点对点通信。无法实现一台设备与网络中众多其他设备通信的需求。Bridge 就是为了解决这个"多对多"互联的问题。
如何工作?

-
无论是物理网卡 (如 eth0)还是虚拟网卡 (如 veth、tap),都可以绑定(接入) 到 Linux Bridge 上。所有接入的设备就像都接入了同一个交换机,彼此之间可以方便地通信。
-
比如:它的角色就像家庭网络中的Wi-Fi路由器 。手机、电脑等设备只要连接到同一个路由器上,就能相互通信并上网。Linux Bridge 在容器网络中扮演的就是这个"中央交换机"的角色。
一句话:Linux Bridge 是一个虚拟交换机,把多个网络设备(物理的或虚拟的)连接在一起,组成一个局域网,解决了点对点直连无法实现的多设备通信问题。
虚拟网卡之多veth基于网桥的通信实战
重温下对应的linux bridge: 
Linux Bridge就是个虚拟交换机 ;把多个虚拟网卡(或物理网卡)连在一起,让它们能互相通信,就像家用路由器连多台手机电脑一样;使用纯软件实现,能学MAC地址、能二层转发,还能配IP地址;不用它的话,虚拟设备只能一对一通信(像直连两根线);用了它就能多对多联网(像插到同一个路由器上)。
常见网桥操作指令
-
安装工具
- CentOS 系统用:
yum install -y bridge-utils - Ubuntu 系统用:
apt-get install -y bridge-utils
- CentOS 系统用:
-
创建网桥
- 命令:
brctl addbr <网桥名> - 作用:新建一个虚拟交换机(网桥)。
- 命令:
-
添加网口
- 命令:
brctl addif <网桥名> <设备名> - 作用:把一块网卡(比如
eth0)插到这个虚拟交换机上。
- 命令:
-
查看网桥
- 命令:
brctl show - 作用:显示所有网桥和插在它们上面的网口。
- 命令:
-
启动网桥
- 命令:
ip link set <网桥名> up - 作用:给虚拟交换机通电,开始工作。
- 命令:
-
删除网桥
- 先断电:
ip link set <网桥名> down - 再拆除:
brctl delbr <网桥名>(或者用ip link del <网桥名>)
- 先断电:
一句话: brctl 是Linux上管理虚拟交换机的命令行工具,用它来创建、查看、修改和删除网桥。
下面基于bridge完成namespace里面网卡通信:

- 实现对应的veth相互间通信。
操作流程:

- 首先进行下载安转。

- linux bridge 创建成功。

- 创建对应虚拟网卡veth pair对于网络命名空间。

- 这里可以看到对应的虚拟网卡对创建成功。

- 把对应网卡对的另一端接到网络命名空间内;进行激活+ip地址分配。

- 这里发现激活后自己ping自己,不能ping。

- 进行自己ping本地激活(否则就只能被外面ipping或者 ping出去外面ip)。

- 成功ping通。

- 虚拟网卡-网桥端接入bridge。

- bridge进行激活+IP地址分配。

- 这里对应网卡的网桥端共用网桥ip;故不需要分配ip;直接激活。

- 不同命名空间通过网桥成功ping通。

- 这里因为另一端在网络命名空间内;ifconfig宿主机看不到;只能看到外面也就是接入网桥的这端。

- 把对应的虚拟网卡的一端删除;自动一对就删除了;然后删除对应命名空间和网桥。

- 成功删除网桥。

- iptables 规则清理!!!!!慎重操作,不要删除错 id,可能会导致各种网络问题,不影响系统使用也可以不操作(指令:
iptables -D FORWARD 13删除防火墙转发规则里的第13条;找到对应的网桥所在的行进行操作)。
总结下:
- 这里首先是从对应虚拟网卡发来的通信;首先会传到对应另一端也就是网桥处;然后网桥处识别到信息后推送与它连接的端;自然流到对应的ns那端;ip匹配就收到信息;然后进行答复(也是同理)。
网络原理组网
虚拟组网之VLAN与VXLAN

- 为什么需要SDN?
- 物理网络:结构固定,改动麻烦。
- 云上应用:需要频繁变动(扩缩容等)。
- 所以需要 :一个能灵活变化的虚拟网络(SDN)。
- SDN是什么?
- 下层(Underlay):真实的物理网络,保证连通。
- 上层(Overlay):在物理网络上虚拟出的逻辑网络,灵活适配应用需求。
- VLAN是什么?
- 在一台物理交换机 上,逻辑划分出多个虚拟的小交换机(广播域)。
- 不同VLAN之间互相隔离,无法直接通信,更安全、更高效。
- vlan是全局的,所在的虚拟网络层划分出很多valn小组;只有每个组才能互相通信。
一句话:SDN(虚拟网络)解决灵活性问题,VLAN(虚拟局域网)解决隔离和安全问题(相对于vxlan是底层)。
VLAN 的好处:
- 省带宽:把大网络隔成小间,广播不乱跑(不用物理拓扑;而是软件层操作,限制广播域,有匹配规则)。
- 更安全:不同小间默认不能直接通话,需要"路由器"当翻译(手动划分有数据隔离保护)。
- 很灵活:组团队不看你在哪办公,只看网络配置。
VLAN 的不足:
- 数量有限:最多只能分4千多个小间,不够大型云平台用。
- 地址冲突:无法解决不同用户IP/MAC地址一样的问题。
- 压力太大:虚拟机太多,交换机记不住所有地址,影响效率。
一句话:VLAN 是个好用的"网络隔断",但面对巨大的云数据中心,它有点不够用了。
==因此下面引入vxlan:==

VXLAN = 超级虚拟局域网
- 解决啥问题?
- 传统VLAN最多只能分4096个,不够云平台用。
- VXLAN能分1600多万个,足够用。
- 怎么做到的?

- 把二层 的网络数据包(Ethernet Frame),套个UDP 的壳,变成三层的数据包,在IP网络里传输。
- 就像给一封信(二层数据)套上一个新信封(UDP/IP包头),然后通过邮局(三层网络)寄出去,对方收到后再拆开信封。
- 有啥好处?
- 无视物理位置:只要网络能通,就能把不同地方的设备"拉"到同一个虚拟局域网里。
- 规模超大:轻松支持海量租户和虚拟机。
一句话:VXLAN就是用"套壳"的方法,在现有IP网络上构建出规模巨大的虚拟二层网络。(相当于vlan是上层)
虚拟组网之MACVLAN

-
是啥?
一项网络技术,能让一张物理网卡 虚拟出多个"虚拟网卡" ,每个都有自己独立的MAC地址(像一个人有多个身份证)。
-
干嘛用?
跳过虚拟交换机(Bridge),让容器或虚拟机直接"挂"在物理网卡上通信。

- 左边(传统) :
容器 -> veth -> 虚拟交换机 -> 物理网卡→ 路径长,性能有损耗。 - 右边(MACVLAN) :
容器 -> 虚拟网卡 -> 物理网卡→ 路径短,性能高。
-
有啥缺点?
很多物理网卡的硬件
不支持太多MAC地址。虚拟的网卡一多,性能反而会下降。所以这技术很好,但还没完全普及。
一句话:MACVLAN就是给物理网卡办多个"身份证",让容器能直连它上网,速度更快。但"身份证"办太多可能会卡。
因为一块物理网卡需要支持多个ip;因此底层需要受限制;因此引出ipvlan。
虚拟组网之IPVALN

-
核心概念:
IPVLAN 是一种网络技术,允许一个物理网卡(父接口) 虚拟出多个子接口。
-
最大特点(与MACVLAN的区别):
所有子接口不拥有独立的MAC地址 ,而是共享父接口的同一个MAC地址 。但每个子接口可以配置自己独立的IP地址。
-
生活比喻:
这就像 "一个身份证(MAC地址)对应了多个人(子接口/IP地址)"。
-
主要影响与限制:
- 共享MAC地址可能会影响依赖MAC地址的服务,如DHCP。需要配置独立的ClientID来获取IP。
- 由于很多网络设备不支持一个MAC地址对应多个IP(即DHCp协议不支持clientid配置),因此这项技术未能像MACVLAN那样被大规模推广使用。
-
主要价值:
在特定场景下,它可以提供一种高效的网络虚拟化方案,避免了使用虚拟交换机(如Linux Bridge)带来的性能开销。
二.本篇小结
本篇详细介绍了Docker网络的核心原理,包括虚拟网卡tun/tap和veth pair的工作原理与操作指令,以及Linux Bridge虚拟交换机的组网实战。最后探讨了VLAN、VXLAN、MACVLAN和IPVLAN等虚拟组网技术的特点与应用场景,为理解容器网络奠定基础。