1. 课程导入与实验环境搭建

Linux 网络命名空间(network namespace)是内核提供的一种网络资源隔离机制。它把网络协议栈中的关键对象——网卡、IPv4/IPv6 地址、路由表、ARP/邻居表、iptables/nftables 规则、socket 端口空间、/proc/net 视图等——划分成彼此独立的实例。每个命名空间都像一台"只有网络部分的独立主机":默认情况下,它看不到别的命名空间的接口,也无法直接与它们通信。容器网络、Kubernetes Pod 网络、CI 中的网络隔离测试,本质上都建立在这一机制之上。

本课程的目标不是背概念,而是建立一条可反复验证的能力链:能创建和进入网络命名空间;能用 veth pair 把两个命名空间连起来;能配置地址、路由并验证连通性;能借助 bridge、NAT、VXLAN 等把隔离域扩展成更接近真实集群的拓扑;最后能定位"为什么 ping 不通"这类问题。为此,先要理解本课程的知识框架,再把实验环境搭好。

核心概念与知识框架

理解网络命名空间,需要抓住四个层次的对象。第一层是隔离单元:network namespace 本身,以及它内部的 lo、eth0 等接口和地址。第二层是连接件:veth pair 是一对虚拟网卡,从一端发出的帧会从另一端出来,是跨命名空间连接的基本手段;Linux bridge 则像一台虚拟交换机,把多个 veth 端口聚合成一个二层域。第三层是转发与地址转换:路由表决定包往哪走,iptables/nftables 的 NAT 让私有地址访问外部网络。第四层是隧道与编排:VXLAN 等把二层帧封装进 UDP,跨越三层网络;容器运行时和 CNI 插件则把这些原语自动化。

这四层不是并列的四个知识点,而是从"隔离"到"连通"再到"跨主机"的递进关系。下面的图给出本课程的整体结构:左侧是内核提供的原语,中间是组合出的网络形态,右侧是最终要达成的能力。

网络命名空间知识框架:从内核原语到可验证能力 内核原语 network namespace 独立协议栈 / 路由 / 端口 veth pair 成对虚拟网卡 Linux bridge 虚拟二层交换机 路由 / NAT 转发与地址转换 VXLAN 隧道 跨三层封装 组合 组合出的网络形态 单机双命名空间 veth 直连 桥接多命名空间 同网段互通 NAT 访问外网 私有地址出站 跨主机 VXLAN 大二层覆盖 容器 / CNI 网络 自动化编排 支撑 可验证能力 创建 / 进入 / 删除 ip netns 系列命令 配置地址与路由 ip addr / ip route 验证连通性 ping / tcpdump / ss 搭建复杂拓扑 bridge / NAT / VXLAN 排障与定位 分层排查思路

实验环境:选择与准备

网络命名空间的操作需要 root 权限,且会修改主机网络配置。因此不建议直接在个人主力系统上做实验,而应准备一个可随时重建的隔离环境。两种常见选择:

  • 虚拟机:用 VirtualBox、VMware 或 KVM 安装一台 Ubuntu 22.04 / Debian 12。优点是隔离彻底,快照可回滚;缺点是资源占用较大。
  • 容器:用 Docker 运行一个带 --privileged 和 --network host 的容器。优点是启动快;缺点是嵌套网络操作对内核版本和权限有额外要求。

本课程以 Ubuntu 22.04 虚拟机为主要环境,内核版本 5.15 及以上即可。以下命令用于确认环境是否满足要求:

# 确认内核版本与权限
uname -r
id -u          # 应输出 0,表示 root

# 安装本课程需要的工具
apt update
apt install -y iproute2 iputils-ping tcpdump bridge-utils \
               iptables nftables net-tools curl

# 确认 ip netns 子命令可用
ip netns help | head -n 5

如果 ip netns help 能正常输出用法,说明 iproute2 已就绪。接下来做一次最小验证:创建一个命名空间,查看它,再删除它。

ip netns add ns-test
ip netns list                 # 应看到 ns-test
ip netns exec ns-test ip link # 只应看到 lo,且状态为 DOWN
ip netns del ns-test
ip netns list                 # ns-test 消失

这里有一个容易被忽略的细节:新建的命名空间里 lo 默认是 DOWN 的。如果不先 ip netns exec ns-test ip link set lo up,那么即使配了地址,本机回环通信也会失败。这是后续排障中非常常见的一个坑。

建议做法:为实验环境创建快照或导出容器镜像。每次实验前恢复到干净状态,可以避免残留的 veth、bridge、iptables 规则干扰后续实验。命名空间删除后,其内部的 veth 一端也会随之消失,但挂在 bridge 上的另一端可能残留,需要手动清理。

环境自检清单

在进入后续章节前,用下面这张表逐项确认。任何一项不通过,都应在开始正式实验前解决,否则后面会出现难以定位的异常。

检查项 命令 期望结果
root 权限 id -u 输出 0
内核版本 uname -r ≥ 5.15
iproute2 ip netns help 正常打印用法
抓包工具 tcpdump --version 正常输出版本
NAT 工具 iptables -t nat -L -n 可列出 nat 表规则
命名空间可创建 ip netns add t && ip netns del t 无报错

学习方法与排障意识

网络命名空间的实验有一个特点:命令执行成功不代表网络通了,而网络不通时,原因可能分布在多个层次。因此本课程强调"分层验证"的习惯——每配完一层,就用对应工具确认这一层是否正确,而不是等全部配完再一次性 ping。具体来说:接口是否存在用 ip link,地址是否生效用 ip addr,路由是否正确用 ip route,二层是否可达用 ip neigh,包是否真的发出和到达用 tcpdump,端口是否监听用 ss -lntup。这套工具链会贯穿整个课程。

另外要建立"命名空间视角"的意识:同一条命令,在主机上执行和在 ip netns exec 里执行,看到的网络视图完全不同。排障时先问自己"我现在站在哪个命名空间里看问题",往往能迅速缩小范围。

本节要点回顾:网络命名空间是内核级的网络隔离单元;veth pair、bridge、路由/NAT、VXLAN 是把它组合成真实网络的原语;本课程的能力目标是"能建、能配、能验、能排"。实验环境应选择可回滚的虚拟机或特权容器,并在开始前完成权限、内核版本、工具链和命名空间创建能力的自检。