超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑!

本篇摘要

本文深度解析Linux虚拟网络设备(Tun/Tap、Veth、Bridge)工作原理,实战演示网络命名空间隔离通信,并深入剖析VLAN、VXLAN、Macvlan、IPVLAN四大虚拟组网技术的核心机制与应用场景。

一.Docker 网络原理

虚拟网卡之tun/tap

  1. 本质是虚拟设备 :tun和tap是纯软件模拟的网络接口卡,并非物理硬件。它们像真实网卡一样可以配置IP、路由流量,但流量仅在主机内部流转。

如:

  • A程序通过eth0访问外面;必须通过tun0借助b程序进行访问。
  1. 两者操作层级不同:
  • tap :操作二层 数据包,模拟的是以太网设备,处理以太网帧(Ethernet frames)。
  • tun :操作三层 数据包,模拟的是网络层设备,处理IP报文。
  1. 核心目的与工作模式 :其核心目的是让用户态程序 (如VPN)能够接管并处理 网络流量。数据包从协议栈发出后,不是直接送往物理网卡,而是通过字符设备(如 /dev/net/tun)交给用户进程处理,处理完后再由该程序发回协议栈。

  2. 典型应用 :主要用于VPN等场景。如下图所示,VPN程序通过tun设备接收原始数据包,进行加密、封装等操作后,再通过物理网卡(eth0)发送出去,从而实现隧道通信。

  1. 主要性能缺点 :使用tun/tap设备,数据包需要两次经过 操作系统内核的网络协议栈 ,这会带来一定的性能开销。正是为了改善这个性能问题,才引入了veth(虚拟以太网设备) pair等其他虚拟网络方案。

虚拟网卡之tun/tap基础指令

  1. 添加虚拟网卡 使用 ip tuntap add 命令创建。

    • 创建 tap :ip tuntap add dev [名称] mode tap
    • 创建 tun :ip tuntap add dev [名称] mode tun
  2. 删除虚拟网卡 使用 ip tuntap del 命令移除。

    • 删除 tap :ip tuntap del dev [名称] mode tap
    • 删除 tun :ip tuntap del dev [名称] mode tun
  3. 激活网卡 创建后的网卡默认处于"DOWN"状态,需使用 ip link set [名称] up 命令之后才能进行网络通信。

  4. 配置IP地址 使用 ip addr add 命令为已激活的虚拟网卡分配IP地址和子网掩码。

    • 例如:ip addr add 10.5.0.1/24 dev tun0 为 tun0 网卡配置IP 10.5.0.1,子网掩码 255.255.255.0。
  5. 查看命令帮助 若忘记完整命令语法,可通过 ip tuntap help 快速查看关于 tuntap 子命令的使用说明和参数选项。

模拟实战了解虚拟网卡之tun/tap

  • 添加不同层的tap tun两个虚拟网卡。
  • 查看本机网络设备无法发现;因为还需要主动激活(ifconfig -a 可以查看所有的包括未激活)。

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

  • 成功添加。
  • 对应网卡有ip;蒙骗过ping命令了;故能ping通。
  • 取消激活;对应ifconfig看不到了。
  • 然后移除这个tun的虚拟网卡。

虚拟网卡之Veth

  1. 本质与形态 veth 不是一个单独的设备,而是成对出现的虚拟设备对(veth pair) 。它可以被形象地理解为一根虚拟的网线,两端各连接着一个虚拟网卡。

  2. 核心用途 主要用于连接两个隔离的网络命名空间(Network Namespace) ,实现它们之间的直接通信 。数据从一端输入,会从另一端原封不动地流出。

  3. 性能优势 与 tun/tap 设备相比,veth 通信不需要多次经过主机的网络协议栈 ,因此数据传输的性能更好、开销更低。

  4. 主要限制 veth 是点对点 的连接,只能连接两个 命名空间。如果需要连接三个或更多 的命名空间到一个网络中,不能只靠 veth,需要引入虚拟网桥(virtual switch) 来实现。

Veth实战之验证不同namespace之间正常通信

  • 这里我们知道:veth是两根虚拟"网线",总是一对一起创建(共生共死);数据从一端进,立马从另一端出,像一根管道;专门用来连通隔离环境(如Docker容器、网络命名空间);它是Docker容器网络的基础,让容器能与外界通信。

veth和网络命名空间常见指令

  1. 创建 veth pair

    使用命令:ip link add <veth名> type veth peer name <对端名>;这是一次性创建一对虚拟网卡的命令,一根"网线"两端同时生成。

  2. 删除 veth

    使用命令:ip link delete <veth名>删除指定名称的 veth 设备,其配对的对端设备也会被自动删除。

  3. 查看 veth

    使用命令:ip link show会列出所有的网络接口,其中包括已创建的 veth 设备,可以通过名称识别(通常名为 vethXXX)。

  4. 创建网络命名空间 (netns)

    使用命令:ip netns add <命名空间名> 创建一个全新的、隔离的网络环境(命名空间)(添加网卡去对应命名空间如:ip link set veth11 netns ns1)。

  5. 删除网络命名空间

    使用命令:ip netns del <命名空间名>删除指定的网络命名空间。

  6. 在命名空间中执行命令

    使用命令:ip netns exec <命名空间名> <命令>;这是关键命令,用于在指定的隔离网络环境内执行任何命令(如 bash、ip addr 等),从而配置或查看该环境内的网络状态。

  7. 查看所有命名空间

    使用命令: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地址;不用它的话,虚拟设备只能一对一通信(像直连两根线);用了它就能多对多联网(像插到同一个路由器上)。

常见网桥操作指令

  1. 安装工具

    • CentOS 系统用:yum install -y bridge-utils
    • Ubuntu 系统用:apt-get install -y bridge-utils
  2. 创建网桥

    • 命令:brctl addbr <网桥名>
    • 作用:新建一个虚拟交换机(网桥)。
  3. 添加网口

    • 命令:brctl addif <网桥名> <设备名>
    • 作用:把一块网卡(比如 eth0)插到这个虚拟交换机上。
  4. 查看网桥

    • 命令:brctl show
    • 作用:显示所有网桥和插在它们上面的网口。
  5. 启动网桥

    • 命令:ip link set <网桥名> up
    • 作用:给虚拟交换机通电,开始工作。
  6. 删除网桥

    • 先断电:ip link set <网桥名> down
    • 再拆除:brctl delbr <网桥名> (或者用 ip link del <网桥名>)

一句话: brctl 是Linux上管理虚拟交换机的命令行工具,用它来创建、查看、修改和删除网桥。

下面基于bridge完成namespace里面网卡通信:

  • 实现对应的veth相互间通信。

操作流程:

flowchart TD A[开始] --> B[创建和查看命名空间] B --> C[创建和查看veth pair] C --> D[将veth两端设置到不同的命名空间] D --> E[激活网卡并分配IP地址] E --> F[测试网络连通性<br>如ping] F --> G[创建和启动虚拟网桥bridge] G --> H[为网桥配置IP地址] H --> I[将网卡插入网桥<br>并测试最终连通性] I --> J[结束]
  • 首先进行下载安转。
  • 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

  1. 为什么需要SDN?
  • 物理网络:结构固定,改动麻烦。
  • 云上应用:需要频繁变动(扩缩容等)。
  • 所以需要 :一个能灵活变化的虚拟网络(SDN)。
  1. SDN是什么?
  • 下层(Underlay):真实的物理网络,保证连通。
  • 上层(Overlay):在物理网络上虚拟出的逻辑网络,灵活适配应用需求。
  1. VLAN是什么?
  • 在一台物理交换机 上,逻辑划分出多个虚拟的小交换机(广播域)。
  • 不同VLAN之间互相隔离,无法直接通信,更安全、更高效。
  • vlan是全局的,所在的虚拟网络层划分出很多valn小组;只有每个组才能互相通信。

一句话:SDN(虚拟网络)解决灵活性问题,VLAN(虚拟局域网)解决隔离和安全问题(相对于vxlan是底层)。

VLAN 的好处:

  1. 省带宽:把大网络隔成小间,广播不乱跑(不用物理拓扑;而是软件层操作,限制广播域,有匹配规则)。
  2. 更安全:不同小间默认不能直接通话,需要"路由器"当翻译(手动划分有数据隔离保护)。
  3. 很灵活:组团队不看你在哪办公,只看网络配置。

VLAN 的不足:

  1. 数量有限:最多只能分4千多个小间,不够大型云平台用。
  2. 地址冲突:无法解决不同用户IP/MAC地址一样的问题。
  3. 压力太大:虚拟机太多,交换机记不住所有地址,影响效率。

一句话:VLAN 是个好用的"网络隔断",但面对巨大的云数据中心,它有点不够用了。

==因此下面引入vxlan:==

VXLAN = 超级虚拟局域网

  1. 解决啥问题?
  • 传统VLAN最多只能分4096个,不够云平台用。
  • VXLAN能分1600多万个,足够用。
  1. 怎么做到的?
  • 把二层 的网络数据包(Ethernet Frame),套个UDP 的壳,变成三层的数据包,在IP网络里传输。
  • 就像给一封信(二层数据)套上一个新信封(UDP/IP包头),然后通过邮局(三层网络)寄出去,对方收到后再拆开信封。
  1. 有啥好处?
  • 无视物理位置:只要网络能通,就能把不同地方的设备"拉"到同一个虚拟局域网里。
  • 规模超大:轻松支持海量租户和虚拟机。

一句话:VXLAN就是用"套壳"的方法,在现有IP网络上构建出规模巨大的虚拟二层网络。(相当于vlan是上层)

虚拟组网之MACVLAN

  1. 是啥?

    一项网络技术,能让一张物理网卡 虚拟出多个"虚拟网卡" ,每个都有自己独立的MAC地址(像一个人有多个身份证)。

  2. 干嘛用?

    跳过虚拟交换机(Bridge),让容器或虚拟机直接"挂"在物理网卡上通信。

  • 左边(传统) :容器 -> veth -> 虚拟交换机 -> 物理网卡 → 路径长,性能有损耗。
  • 右边(MACVLAN) :容器 -> 虚拟网卡 -> 物理网卡 → 路径短,性能高。
  1. 有啥缺点?

    很多物理网卡的硬件不支持太多MAC地址。虚拟的网卡一多,性能反而会下降。所以这技术很好,但还没完全普及。

一句话:MACVLAN就是给物理网卡办多个"身份证",让容器能直连它上网,速度更快。但"身份证"办太多可能会卡。

因为一块物理网卡需要支持多个ip;因此底层需要受限制;因此引出ipvlan。

虚拟组网之IPVALN

  1. 核心概念:

    IPVLAN 是一种网络技术,允许一个物理网卡(父接口) 虚拟出多个子接口。

  2. 最大特点(与MACVLAN的区别):

    所有子接口不拥有独立的MAC地址 ,而是共享父接口的同一个MAC地址 。但每个子接口可以配置自己独立的IP地址。

  3. 生活比喻:

    这就像 "一个身份证(MAC地址)对应了多个人(子接口/IP地址)"。

  4. 主要影响与限制:

  • 共享MAC地址可能会影响依赖MAC地址的服务,如DHCP。需要配置独立的ClientID来获取IP。
  • 由于很多网络设备不支持一个MAC地址对应多个IP(即DHCp协议不支持clientid配置),因此这项技术未能像MACVLAN那样被大规模推广使用。
  1. 主要价值:

    在特定场景下,它可以提供一种高效的网络虚拟化方案,避免了使用虚拟交换机(如Linux Bridge)带来的性能开销。

二.本篇小结

本篇详细介绍了Docker网络的核心原理,包括虚拟网卡tun/tap和veth pair的工作原理与操作指令,以及Linux Bridge虚拟交换机的组网实战。最后探讨了VLAN、VXLAN、MACVLAN和IPVLAN等虚拟组网技术的特点与应用场景,为理解容器网络奠定基础。

相关推荐
他日若遂凌云志1 小时前
深入剖析 ET8 框架的 ETTask 机制:await 的挂起、唤醒、异常与零 GC
后端
星轨zb1 小时前
[支付专题4]支付回调幂等性和状态:状态机与终态检查的边界
后端·支付架构学习
会编程的吕洞宾1 小时前
Spring AI 2.0 结构化输出实战:让大模型返回精准 JSON 不再“抽风“,准确率从 78% 拉到 99%
java·后端
用户298698530141 小时前
Python 实现 Word 与 TIFF 双向转换的方案
后端·python·api
cpp_w2 小时前
C#基础3- 面向对象中级应用3
后端·c#
代码小学僧2 小时前
如何低成本部署网站?Vercel 和 Cloudflare 怎么选?
前端·后端·serverless
MetWeave2 小时前
从零跑一个气象数据管道:抓取、清洗、对账、节奏
后端·python
gopher95112 小时前
RUST:序列化与反序列化 serde + derive 详解
开发语言·后端·rust
铁皮饭盒2 小时前
CPU就行, 老照片变清晰, 本地部署582mb腾讯的模型, 本地部署, 过节了给长辈们变个小魔术
前端·javascript·后端