超越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相互间通信。

操作流程:
#mermaid-svg-n3pT1OmCu7l4n93r{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-n3pT1OmCu7l4n93r .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-n3pT1OmCu7l4n93r .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-n3pT1OmCu7l4n93r .error-icon{fill:#552222;}#mermaid-svg-n3pT1OmCu7l4n93r .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-n3pT1OmCu7l4n93r .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-n3pT1OmCu7l4n93r .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-n3pT1OmCu7l4n93r .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-n3pT1OmCu7l4n93r .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-n3pT1OmCu7l4n93r .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-n3pT1OmCu7l4n93r .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-n3pT1OmCu7l4n93r .marker{fill:#333333;stroke:#333333;}#mermaid-svg-n3pT1OmCu7l4n93r .marker.cross{stroke:#333333;}#mermaid-svg-n3pT1OmCu7l4n93r svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-n3pT1OmCu7l4n93r p{margin:0;}#mermaid-svg-n3pT1OmCu7l4n93r .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-n3pT1OmCu7l4n93r .cluster-label text{fill:#333;}#mermaid-svg-n3pT1OmCu7l4n93r .cluster-label span{color:#333;}#mermaid-svg-n3pT1OmCu7l4n93r .cluster-label span p{background-color:transparent;}#mermaid-svg-n3pT1OmCu7l4n93r .label text,#mermaid-svg-n3pT1OmCu7l4n93r span{fill:#333;color:#333;}#mermaid-svg-n3pT1OmCu7l4n93r .node rect,#mermaid-svg-n3pT1OmCu7l4n93r .node circle,#mermaid-svg-n3pT1OmCu7l4n93r .node ellipse,#mermaid-svg-n3pT1OmCu7l4n93r .node polygon,#mermaid-svg-n3pT1OmCu7l4n93r .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-n3pT1OmCu7l4n93r .rough-node .label text,#mermaid-svg-n3pT1OmCu7l4n93r .node .label text,#mermaid-svg-n3pT1OmCu7l4n93r .image-shape .label,#mermaid-svg-n3pT1OmCu7l4n93r .icon-shape .label{text-anchor:middle;}#mermaid-svg-n3pT1OmCu7l4n93r .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-n3pT1OmCu7l4n93r .rough-node .label,#mermaid-svg-n3pT1OmCu7l4n93r .node .label,#mermaid-svg-n3pT1OmCu7l4n93r .image-shape .label,#mermaid-svg-n3pT1OmCu7l4n93r .icon-shape .label{text-align:center;}#mermaid-svg-n3pT1OmCu7l4n93r .node.clickable{cursor:pointer;}#mermaid-svg-n3pT1OmCu7l4n93r .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-n3pT1OmCu7l4n93r .arrowheadPath{fill:#333333;}#mermaid-svg-n3pT1OmCu7l4n93r .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-n3pT1OmCu7l4n93r .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-n3pT1OmCu7l4n93r .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-n3pT1OmCu7l4n93r .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-n3pT1OmCu7l4n93r .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-n3pT1OmCu7l4n93r .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-n3pT1OmCu7l4n93r .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-n3pT1OmCu7l4n93r .cluster text{fill:#333;}#mermaid-svg-n3pT1OmCu7l4n93r .cluster span{color:#333;}#mermaid-svg-n3pT1OmCu7l4n93r div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-n3pT1OmCu7l4n93r .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-n3pT1OmCu7l4n93r rect.text{fill:none;stroke-width:0;}#mermaid-svg-n3pT1OmCu7l4n93r .icon-shape,#mermaid-svg-n3pT1OmCu7l4n93r .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-n3pT1OmCu7l4n93r .icon-shape p,#mermaid-svg-n3pT1OmCu7l4n93r .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-n3pT1OmCu7l4n93r .icon-shape .label rect,#mermaid-svg-n3pT1OmCu7l4n93r .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-n3pT1OmCu7l4n93r .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-n3pT1OmCu7l4n93r .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-n3pT1OmCu7l4n93r :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开始
创建和查看命名空间
创建和查看veth pair
将veth两端设置到不同的命名空间
激活网卡并分配IP地址
测试网络连通性

如ping
创建和启动虚拟网桥bridge
为网桥配置IP地址
将网卡插入网桥

并测试最终连通性
结束

  • 首先进行下载安转。
  • 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等虚拟组网技术的特点与应用场景,为理解容器网络奠定基础。

相关推荐
启博网络41 分钟前
IPv4枯竭、NAT穿透卡顿?用公网IPv6直连搭建异地组网,速度直接起飞
网络·远程安全访问·启博
A-刘晨阳1 小时前
Windows硬盘里的媒体太乱?我用WSL+Plex把本地文件整理成一个统一媒体中心
运维·cpolar
Thomas.Sir1 小时前
第34课:微服务Docker容器化部署 & 生产环境上线
spring cloud·docker·微服务
小马同学-1 小时前
K8s 节点管理:查看、维护与集群删除操作
容器·kubernetes
古法老登瞎折腾1 小时前
大数据智能运维实战(六):任务一直在等——排查调度队列与执行资源
java·大数据·运维·spring ai·mcp
电梯界知识分子1 小时前
江西赣州赣县三层设计师自建房:1700mm中空极限利用,全观光铝合金电梯的精度与防震处理
大数据·服务器·网络·人工智能·家用电梯
wtblszn2 小时前
实验室通风设备远程监控运维管理系统方案
运维
对象存储与RustFS19 小时前
网盘限速逼你开会员?用 RustFS 自己搭一个不限速的“私人网盘
服务器·后端·docker
众壹新能源科技21 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化