容器 22:两个隔离进程怎样通过 veth 通信
从内核对象推导路径
让进程 A、B 分别进入两个 netns:每一侧起初可只看到自己的 loopback 设备;需先把 lo 置 up,建立 veth 对,把两个端点分别放入 netns,给接口分配互通地址与路由,确认 ARP/邻居条目及链路状态,再用同一 probe_app.py 的 /health 观测端到端访问。对同一网段的直连流量,veth 负责把一端送出的二层帧交给另一端;想连第三个网段需路由/网关,不是再加一个 curl 就能自动到达。IP 地址和监听地址各有作用:只监听 127.0.0.1 的服务不会因 veth 配通而自动变得可从另一 netns 访问。
本云端可以安全调用 unshare -Ur -n;原始记录显示新 netns inode net:[4026532574] 与原来 net:[4026531994] 不同,新视图只列出 lo,进程退出后原 namespace inode 不变。这是“视图可以分离”的 LAB_VERIFIED,不是“veth 已连通”。这里缺 ip 工具与专用网络实验 VM,尚未创建/抓包两个 netns、veth、地址和路由;完整通信验收 NOT_RUN。复跑入口与清理和统一源码包保留路径,不改共享宿主默认网络。先前网络 33的静态模型不能代替这次真实连通数据。
反例可在 VM 先只建 veth 而不配地址,观察链路对象存在但请求仍失败;再只让服务监听 127.0.0.1,对比同 netns 和异 netns 访问结果。失败阶段应分别保留接口状态、路由、监听 socket、抓包和 HTTP 返回,不能一口断定为 CNI 的问题。
| 现象 | 对象 | 限定条件 |
|---|---|---|
| netns inode 不同 | /proc/<pid>/ns/net |
不证明已有 veth |
| ping 通但服务失败 | socket 监听与端口 | 传输层以上另核查 |
| 无地址时链路存在 | veth 端点及路由 | veth 不分配 IP |
练习
- 先预测只建立 veth 对、不配地址时两个进程能否互相 HTTP 请求;专用 VM 按步骤逐项补齐并抓包定位第一次成功的条件。
- 预测 A 监听
127.0.0.1与0.0.0.0时 B 的访问差异;在两个自建 netns 用相同探针记录监听地址、请求目标与日志。
上一篇:21:停止与日志;下一篇:23:bridge、端口、DNS。
系列总目录:从进程隔离到运行时与编排。
参考资料
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.



