22 的 veth只是一段二层链路;把几段 veth 的宿主侧接进 bridge 才可能形成一个二层转发域。外部从宿主端口进入、容器把名字解析成地址、应用真正监听到这个地址,又是不同的链路步骤。不能看到 `docker -p` 就把 DNS、路由、NAT 都说成“bridge 干的”。

两条访问路径要分开画

对同一 bridge 子网中两个端点,发送方按照目标 IP/路由挑下一跳,经 veth 到宿主 bridge,再依据二层目的 MAC 转发。对宿主公开端口,请求的原始目标是宿主 IP:端口;具体实现可通过 NAT/代理把流量送入容器 IP:端口,需要核对当时的规则和 conntrack 元组,不能把容器 IP:端口的直连记录冒充端口发布记录。DNS 把名字变成地址,解析成功后仍可能因服务只在 loopback 监听、规则丢包或目标端口未打开而失败。

专用 VM 正例应给同一个 probe-app 分别测试“容器 IP 直连”“宿主发布端口”“名字解析后访问”,记录请求前后源/目的元组、路由、conntrack 与 DNS 结果。三个反例依次让探针只监听 127.0.0.1、让测试域名解析失败、在仅作用于自建实验 namespace 的过滤规则中拒绝请求;分别检查监听、DNS 服务器返回和抓包。不要改共享宿主防火墙、默认路由或全局解析配置。

独立复跑入口与探针包包括受控 HTTP 程序,但本环境缺 `ip`、Docker 与专用 VM,bridge/NAT/conntrack 和 DNS 拒绝实测 `NOT_RUN`。文中的路径来自 Linux bridge 文档和前篇机制分析,不是该云端的抓包结果。
现象 首先查 排除什么误判
直连可通,发布端口不通 宿主监听/NAT/转发 不先责怪 bridge
DNS 返回地址但请求失败 地址、路由、端口及监听 不把解析成功当成服务成功
容器能访问自身 loopback netns 内监听范围 外侧不一定可达

练习

  1. 先预测从宿主发布端口访问时目标 IP:端口在每个环节如何变化,在专用 VM 抓包与 conntrack 对照,不凭口头拓扑画最终元组。
  2. 分别预测“域名无法解析”“域名可解析但 TCP 拒绝”的观察差异,用同一实验服务单独注入这两种故障,并恢复自建资源。

上一篇:22:netns 和 veth;下一篇:24:CNI。

系列总目录:从进程隔离到运行时与编排。

参考资料