超越Bridge:全面掌握Docker网络隔离与通信的底层逻辑! 文章目录本篇摘要一.Docker 网络原理虚拟网卡之tun/tap虚拟网卡之tun/tap基础指令模拟实战了解虚拟网卡之tun/tap虚拟网卡之VethVeth实战之验证不同namespace之间正常通信veth和网络命名空间常见指令虚拟交换机linux bridge虚拟网卡之多veth基于网桥的通信实战常见网桥操作指令网络原理组网虚拟组网之VLAN与VXLAN虚拟组网之**MACVLAN**虚拟组网之IPVALN二.本篇小结本篇摘要本文深度解析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命令创建。创建 tapip tuntap add dev [名称] mode tap创建 tunip tuntap add dev [名称] mode tun删除虚拟网卡使用ip tuntap del命令移除。删除 tapip tuntap del dev [名称] mode tap删除 tunip tuntap del dev [名称] mode tun激活网卡创建后的网卡默认处于“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 bridgeLinux Bridge是一个虚拟交换机主要工作在二层数据链路层功能类似于现实生活中的家用路由器或交换机用于连接多个设备让它们之间能够通信。单纯用veth pair直连两个网络命名空间netns就像用一根网线直连两台电脑只能点对点通信。无法实现一台设备与网络中众多其他设备通信的需求。Bridge 就是为了解决这个“多对多”互联的问题。如何工作无论是物理网卡如 eth0还是虚拟网卡如 veth、tap都可以绑定接入到 Linux Bridge 上。所有接入的设备就像都接入了同一个交换机彼此之间可以方便地通信。比如它的角色就像家庭网络中的Wi-Fi路由器。手机、电脑等设备只要连接到同一个路由器上就能相互通信并上网。Linux Bridge 在容器网络中扮演的就是这个“中央交换机”的角色。一句话Linux Bridge 是一个虚拟交换机把多个网络设备物理的或虚拟的连接在一起组成一个局域网解决了点对点直连无法实现的多设备通信问题。虚拟网卡之多veth基于网桥的通信实战重温下对应的linux bridgeLinux Bridge就是个虚拟交换机把多个虚拟网卡或物理网卡连在一起让它们能互相通信就像家用路由器连多台手机电脑一样使用纯软件实现能学MAC地址、能二层转发还能配IP地址不用它的话虚拟设备只能一对一通信像直连两根线用了它就能多对多联网像插到同一个路由器上。常见网桥操作指令安装工具CentOS系统用yum install -y bridge-utilsUbuntu系统用apt-get install -y bridge-utils创建网桥命令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相互间通信。操作流程开始创建和查看命名空间创建和查看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为什么需要SDN物理网络结构固定改动麻烦。云上应用需要频繁变动扩缩容等。所以需要一个能灵活变化的虚拟网络SDN。SDN是什么下层Underlay真实的物理网络保证连通。上层Overlay在物理网络上虚拟出的逻辑网络灵活适配应用需求。VLAN是什么在一台物理交换机上逻辑划分出多个虚拟的小交换机广播域。不同VLAN之间互相隔离无法直接通信更安全、更高效。vlan是全局的所在的虚拟网络层划分出很多valn小组只有每个组才能互相通信。一句话SDN虚拟网络解决灵活性问题VLAN虚拟局域网解决隔离和安全问题相对于vxlan是底层。VLAN 的好处省带宽把大网络隔成小间广播不乱跑不用物理拓扑而是软件层操作限制广播域有匹配规则。更安全不同小间默认不能直接通话需要“路由器”当翻译手动划分有数据隔离保护。很灵活组团队不看你在哪办公只看网络配置。VLAN 的不足数量有限最多只能分4千多个小间不够大型云平台用。地址冲突无法解决不同用户IP/MAC地址一样的问题。压力太大虚拟机太多交换机记不住所有地址影响效率。一句话VLAN 是个好用的“网络隔断”但面对巨大的云数据中心它有点不够用了。因此下面引入vxlanVXLAN 超级虚拟局域网解决啥问题传统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等虚拟组网技术的特点与应用场景为理解容器网络奠定基础。