Linux虚拟网络化与隔离技术
参考:
https://wiki.archlinux.org/title/Network_bridge
https://zhuanlan.zhihu.com/p/549456494
Linux 的虚拟网络无需额外硬件,仅通过内核软件配置即可实现隔离、虚拟化等功能,是容器化、虚拟机部署的核心基础。
虚拟以太网(veth)、网桥(bridge)、macvlan 是最基础常用的三类技术,基于 Namespace、CGroup 和虚拟网络设备驱动实现,核心是在单物理主机上构建独立、可互通的网络环境,适配容器、虚拟机的网络需求。
虚拟以太网 - veth
veth 是 Linux 内核提供的点对点虚拟网络设备,核心作用是打通两个独立的网络命名空间(Network Namespace)——网络命名空间是 Linux 实现网络隔离的基础,每个命名空间拥有独立的网卡、IP、路由表,相当于一个“独立的小网络”,而 veth 就是连接这些“小网络”的唯一链路。
veth 必须成对存在(称为 veth pair),无法单独使用,就像一根两端都有接头的网线,一端插入一个网络命名空间,另一端插入另一个网络命名空间,仅允许这两个命名空间通过该链路通信,与外部网络完全隔离。
当创建一对 veth 设备(如 veth0 和 veth1)时,内核会为两者建立双向数据通道:
- veth0 分配给主机命名空间,veth1 分配给容器命名空间;
- 容器数据包经 veth1 传至 veth0,由主机协议栈(如 NAT)处理后实现联网;
- 主机数据包经 veth0 传至 veth1,进入容器命名空间。
注:veth 本身不具备路由、NAT、桥接能力,仅负责数据转发,容器要访问外网,必须依赖主机的网络协议栈做额外处理。
网桥 - bridge
网桥(又称虚拟网桥)是 Linux 内核提供的二层网络交换设备,本质是一个软件版的交换机。它的核心作用是将多个物理网卡、虚拟网卡(如 veth)桥接到同一个广播域,让所有连接到网桥上的设备,共享同一网络链路,相当于所有设备都插在同一个物理交换机上,可直接互通,无需经过路由转发。
与 veth 的点对点通信不同,网桥支持一对多通信,能够连接多个网络命名空间、物理设备,是构建多设备虚拟局域网(LAN)的核心技术。
网桥的工作机制与物理交换机类似,核心是 MAC 地址学习和数据包转发:
- 当网桥启动后,会监听所有连接到它的网卡(物理网卡、veth 等)的数据包,记录每个网卡对应的设备 MAC 地址,形成一张 MAC 地址表;
- 当收到数据包时,网桥会查看数据包的目标 MAC 地址,根据 MAC 地址表,将数据包转发到对应的网卡(仅转发到目标设备,不广播到所有设备);
- 若网桥未在 MAC 地址表中找到目标 MAC 地址,则会将数据包广播到所有连接的网卡,直到目标设备响应,再更新 MAC 地址表。
在容器场景中,通常会将主机的物理网卡(如 wlan0、eth0)桥接到网桥上,再将容器的 veth 网卡也连接到网桥上——这样,容器、主机、局域网其他设备就处于同一个广播域,可直接互通,容器无需依赖主机 NAT 转发就能访问外网。
使用参考文档:
https://segmentfault.com/a/1190000009491002#item-4
macvlan
macvlan 是 Linux 内核提供的物理网卡虚拟化技术,核心作用是在单块物理网卡上,生成多个独立的虚拟网卡(称为 macvlan 子接口),每个子接口拥有独立的 MAC 地址——相当于给物理网卡分身,每个分身都能独立工作,直接共享物理网卡的网络链路,无需经过网桥、veth 等中间层。
与 veth、网桥不同,macvlan 无需依赖其他虚拟设备,直接让容器挂靠在物理网卡上,成为局域网内的独立设备,在路由器看来,容器与主机是平级的两个设备,均能通过 DHCP 获取局域网 IP。
macvlan 的工作原理非常简单,本质是 MAC 地址隔离与转发:
- 在物理网卡(如 wlan0)上创建多个 macvlan 子接口(如 mv-wlan0、mv-wlan1),每个子接口分配独立的 MAC 地址;
- 将每个子接口分配给一个容器,容器将该子接口作为自身的默认网卡;
- 容器发送的数据包,会携带自身子接口的 MAC 地址,通过物理网卡直接发送到路由器,路由器根据 MAC 地址和 IP 地址,将数据包转发到目标设备;
- 外部设备发送给容器的数据包,路由器会根据容器的 MAC 地址,通过物理网卡转发到对应的 macvlan 子接口,再传递到容器内部。
macvlan 支持多种模式(如 bridge、private、vepa 等),其中最常用的是 bridge 模式,允许同一物理网卡上的多个 macvlan 子接口之间互相通信,同时也能与局域网其他设备互通。
macvlan 适合容器需要独立局域网 IP、配置简单、高速互通的场景,是单机容器需获得局域网独立 IP 场景的最轻量高效方案
关于 macvlan 的 bridge 模式与传统 Linux 网桥(bridge):
- macvlan 的
bridge:是 macvlan 网卡虚拟化的一种工作模式,作用是让同一物理网卡上的多个 macvlan 子接口之间、子接口与局域网其他设备之间能互通,无任何虚拟交换机组件; - 传统网桥(bridge):本身就是虚拟二层交换机,「bridge」是其技术本质,所有桥接设备的流量都需经该虚拟交换机转发、寻址。
所以 macvlan 的 bridge 模式更加节省 CPU、内存,同时网络延迟更低,吞吐率更高。
总结
| 对比维度 | 虚拟以太网(veth) | 网桥(bridge) | macvlan |
|---|---|---|---|
| 技术本质 | 点对点虚拟链路,命名空间通信工具 | 虚拟二层交换机,多设备桥接组网 | 物理网卡虚拟化,单网卡分身扩容 |
| 网络隔离性 | 强隔离:仅两命名空间互通 | 弱隔离:同广播域,无隔离 | 中等隔离:容器独立,局域网互通 |
| IP 网段 | 主机私有网段,与局域网无关 | 局域网网段,与主机同段 | 局域网网段,与主机同段 |
| 互通性 | 仅主机↔容器互通 | 全互通(主机、容器、局域网) | 容器↔局域网互通,主机↔容器需经路由器回环 |
| 上网方式 | 依赖主机 NAT+iptables | 直连路由器,无需 NAT | 直连路由器,无需 NAT |
| 配置复杂度 | 低,默认自动创建 | 高,需手动创建桥接 | 极低,仅指定物理网卡 |
| MAC 地址 | 容器端有独立 MAC(宿主机内可见),对外部网络可见性取决于是否桥接/NAT | 无独立 MAC,复用 veth | 有独立 MAC,子接口唯一 |
| 使用场景 | 容器仅需与主机通信 | 多设备组网,需全互通 | 容器需局域网 IP,配置简单 |
扩展
除三类基础技术外,以下 4 种进阶方案适配复杂场景:
ipvlan
ipvlan 与 macvlan 同属物理网卡虚拟化技术,工作原理几乎一致,核心区别是:ipvlan 的所有子接口共享物理网卡的 MAC 地址,仅 IP 地址不同,而 macvlan 的每个子接口有独立的 MAC 地址。
适配场景:路由器限制 MAC 地址数量(如部分企业路由器仅允许单个 MAC 地址接入),此时使用 ipvlan,所有容器共享主机 MAC 地址,可正常获取局域网 IP;
不适用于需要独立 MAC 地址的场景(如路由器基于 MAC 地址分配固定 IP)。
macvtap
macvtap 是 macvlan 的衍生技术,专门为虚拟机(如 KVM、QEMU)设计,本质是将 macvlan 与 tap 设备(虚拟机与主机的网络接口)结合,实现虚拟机与物理网卡的直接连接。
与 macvlan 相比,macvtap 支持更多的虚拟化场景,能够更好地适配虚拟机的网络 IO,降低延迟,同时保留了 macvlan“直连局域网、配置简单”的优势。
适配场景:虚拟机需要直连局域网,获取独立 IP,追求高速网络 IO;
不适合容器场景(容器用 macvlan 更简洁)。
Open vSwitch
Open vSwitch(简称 OVS)是一款开源的高级虚拟交换机,功能远超 Linux 原生网桥,支持 VLAN、VXLAN、GRE 等多种网络协议,能够实现跨主机组网、流量控制、端口镜像、网络隔离等高级功能。
与原生网桥相比,OVS 的优势在于可管理性和扩展性,支持通过命令行、API、Web 界面管理,能够适配大规模容器/虚拟机集群(如跨主机的容器集群),是企业级部署的首选方案。
适配场景:多主机容器集群(如 K8s 集群)、企业级虚拟机部署,需要高级网络管理(如流量监控、访问控制);
不适用于简单场景,配置复杂。
VXLAN
VXLAN(虚拟可扩展局域网)是一种隧道技术,核心作用是突破物理网络限制,实现跨主机的虚拟网络互通——当容器部署在多台物理主机上时,VXLAN 可以在物理网络之上,构建一个虚拟的二层网络,让不同主机上的容器,仿佛处于同一个局域网,可直接互通。
VXLAN 通常与 OVS、Docker Swarm、K8s 等工具结合使用,解决跨主机容器通信的问题,是云原生场景下的核心网络技术。
适配场景:多主机容器集群、跨机房部署,需要容器之间跨主机直接通信;
不适用于单主机场景(无需隧道转发,徒增延迟)。