当前位置:首页 > 技术 > 正文内容

从零构建容器网络:Linux 虚拟化技术实现桥接方案

访客 技术 2026年7月5日 2

容器技术的核心隔离机制依赖 Linux Namespace,而网络隔离后的通信问题则需要借助虚拟网络设备解决。本文通过 veth 设备对、网桥、iptables 等底层技术,完整复现容器桥接网络的构建过程,深入理解数据包在容器与宿主机之间的流转路径。

核心组件解析

veth 设备对

veth(Virtual Ethernet)是成对创建的虚拟网卡,具有双向管道特性:向一端写入的数据包会立即出现在另一端。利用这一特性,可将 veth 的一端置于隔离的网络命名空间(模拟容器环境),另一端保留在宿主机,从而打通跨命名空间的通信通道。

Linux Bridge

Linux Bridge 是内核实现的二层虚拟交换机,负责连接多个网络接口并实现同网段内的数据帧转发。与物理交换机类似,它维护 MAC 地址表,根据目标 MAC 将流量定向到正确端口。Docker 的 bridge 网络驱动本质上就是对此机制的封装。

NAT 地址转换

容器使用私有网段地址,与外部网络通信时必须经过地址转换:

  • SNAT(源地址转换):容器发出的请求经过宿主机出口时,将源 IP 替换为宿主机 IP,确保响应能正确返回
  • DNAT(目的地址转换):外部访问容器服务时,将宿主机 IP 映射到容器内部 IP,实现流量定向

实验环境搭建

实验基于 Ubuntu 20.04,通过 ip netns 创建隔离环境模拟容器。

创建网络命名空间

sudo ip netns add c1
sudo ip netns add c2

构建 veth 设备对

sudo ip link add tap-c1 type veth peer name br-c1
sudo ip link add tap-c2 type veth peer name br-c2

将一端移入命名空间:

sudo ip link set tap-c1 netns c1
sudo ip link set tap-c2 netns c2

配置网桥

sudo ip link add dev br0 type bridge
sudo ip link set br-c1 master br0
sudo ip link set br-c2 master br0

分配地址并激活

网桥地址:

sudo ip addr add 10.0.5.1/24 dev br0
sudo ip link set br0 up

容器内网卡:

sudo ip netns exec c1 ip addr add 10.0.5.10/24 dev tap-c1
sudo ip netns exec c1 ip link set tap-c1 up
sudo ip netns exec c1 ip link set lo up

sudo ip netns exec c2 ip addr add 10.0.5.11/24 dev tap-c2
sudo ip netns exec c2 ip link set tap-c2 up
sudo ip netns exec c2 ip link set lo up

宿主机侧网卡:

sudo ip link set br-c1 up
sudo ip link set br-c2 up

连通性验证

容器间通信

在 c1 中测试到 c2 的可达性:

sudo ip netns exec c1 ping -c 3 10.0.5.11

抓包观察网桥上的 ARP 学习过程:

sudo tcpdump -i br0 -n -e

输出显示 ARP 请求广播后,网桥学习到 MAC 地址映射,后续 ICMP 包直接单播转发,验证了二层交换机制。

宿主机直接访问容器

在 c1 启动监听服务:

sudo ip netns exec c1 python3 -m http.server 8080

宿主机直接通过容器 IP 访问:

curl http://10.0.5.10:8080/

外部网络互通配置

容器访问外网(SNAT)

配置容器默认路由指向网桥:

sudo ip netns exec c1 ip route add default via 10.0.5.1
sudo ip netns exec c2 ip route add default via 10.0.5.1

开启宿主机 IP 转发:

sudo sysctl -w net.ipv4.ip_forward=1

添加 MASQUERADE 规则,自动替换源地址:

sudo iptables -t nat -A POSTROUTING -s 10.0.5.0/24 ! -o br0 -j MASQUERADE

验证外网连通:

sudo ip netns exec c1 ping -c 3 223.5.5.5

外部访问容器(DNAT)

将宿主机 8080 端口映射到 c1 的 80 端口:

sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.0.5.10:80

处理宿主机本机发起的访问(OUTPUT 链):

sudo iptables -t nat -A OUTPUT -p tcp --dport 8080 -j DNAT --to-destination 10.0.5.10:80

数据包完整路径分析

以容器 c1 访问公网为例,数据包经历以下处理:

  1. 容器内路由决策,默认网关指向 10.0.5.1
  2. ARP 解析网关 MAC,封装二层帧经 tap-c1 发出
  3. veth 对端 br-c1 接收,网桥查询 MAC 表后从 br0 转发
  4. 宿主机内核识别目的地址非本地,触发 IP 转发
  5. POSTROUTING 钩子执行 SNAT,源地址替换为宿主机公网 IP
  6. 数据包经物理网卡 eth0 进入公网

响应包返回时路径相反,conntrack 模块自动还原地址,确保回到正确容器。

环境清理

sudo ip netns del c1
sudo ip netns del c2
sudo ip link del br0
sudo iptables -t nat -F

手动构建过程揭示了 Docker 网络的本质:Namespace 提供隔离,veth 打通通道,Bridge 汇聚连接,iptables 实现内外转换。理解这些底层机制,有助于排查容器网络故障、设计自定义网络方案。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。