多租户沙箱中network namespace实现网络隔离的核心是为每个租户分配独立网络栈,确保ip不冲突、路由不可达、防火墙独立生效;需禁用默认bridge互通,创建专属自定义bridge网络,并关闭host共享、容器网络复用等逃逸路径。

在多租户沙箱环境中,利用 Network Namespace 为不同容器分配完全隔离的 IP,核心不是“手动配 IP”,而是让每个租户运行在独立网络栈中——IP 地址天然不冲突、路由互不可达、防火墙规则各自生效。Docker 默认已启用 Network Namespace,但要实现“完全隔离”,关键在于避免共享、禁用互通机制,并合理配置边界。
确保每个容器拥有独立 Network Namespace
Docker 启动容器时,默认就创建全新 Network Namespace,这是隔离的基础。验证方式:
- 查容器主进程 PID:docker inspect -f '{{.State.Pid}}'
- 查该 PID 对应的 netns ID:ls -l /proc/
/ns/net (输出如 net:[4026532519]) - 对比多个租户容器的 net:[…] 数字——只要不同,就说明网络栈已分离
禁用默认 bridge 的跨容器互通
Docker 默认 bridge(docker0)会让同网桥下所有容器可互 ping、互连,这不是租户隔离,而是共享风险。必须绕过它:
- 不使用 --network=bridge 或默认网络
- 为每个租户创建专属自定义 bridge 网络:docker network create --subnet=10.10.1.0/24 tenant-a-net
- 启动容器时强制绑定:docker run --network tenant-a-net nginx
- 不同网络间无路由、无 DNS 解析、无 ARP 响应——连 ping 10.10.2.10(另一租户 IP)都会超时
配合 veth + namespace 手动精细化控制(进阶)
当需要更底层控制(比如对接物理网卡、定制防火墙策略),可脱离 Docker 网络驱动,直接操作 namespace:
- 创建租户命名空间:ip netns add tenant-b
- 建立 veth 对并一端移入:ip link add veth-b1 type veth peer name veth-b2 && ip link set veth-b2 netns tenant-b
- 在 namespace 内配 IP 并启用:ip netns exec tenant-b ip addr add 192.168.100.2/24 dev veth-b2 && ip netns exec tenant-b ip link set veth-b2 up
- 宿主机端 veth-b1 桥接或配路由,所有进出流量必须经过这对 veth——天然阻断直连
补充关键安全动作
仅靠 namespace 不等于绝对安全,还需关闭常见逃逸路径:
- 禁止 --network=host:否则复用宿主机网络栈,IP 和端口全暴露
- 禁用 --network=container::会共享 netns,两个租户变一个
- 不挂载共享 volume 到 /etc/resolv.conf 或 /etc/hosts:防止 DNS 或 hosts 劫持
- 若用 firewalld/nftables,在每个租户网络入口加 DROP 规则,例如:nft add rule ip filter FORWARD iifname "veth-b1" oifname "veth-c1" drop











