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 插件则把这些原语自动化。
这四层不是并列的四个知识点,而是从"隔离"到"连通"再到"跨主机"的递进关系。下面的图给出本课程的整体结构:左侧是内核提供的原语,中间是组合出的网络形态,右侧是最终要达成的能力。
实验环境:选择与准备
网络命名空间的操作需要 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,那么即使配了地址,本机回环通信也会失败。这是后续排障中非常常见的一个坑。
环境自检清单
在进入后续章节前,用下面这张表逐项确认。任何一项不通过,都应在开始正式实验前解决,否则后面会出现难以定位的异常。
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| 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 里执行,看到的网络视图完全不同。排障时先问自己"我现在站在哪个命名空间里看问题",往往能迅速缩小范围。