DEBUG.WIKI
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国
雨云;给项目一台云服务器
RackNerd;$21.99/年 · 1GB KVM

Docker macvlan 在局域网能访问,宿主机却连不上:检查 parent 隔离

局域网其他机器能访问 macvlan 容器,唯独宿主 parent 接口不能直连。区分内核隔离与其他故障,按目标地址约束选择 bridge 或宿主子接口路径。

容器有独立的局域网 IP,其他机器可以访问它,容器也能联网;唯独运行 Docker 的宿主机无法直连这个 IP,容器反过来也连不上宿主的 parent 接口地址。使用 Linux macvlan 时,这可能符合内核的接口隔离行为,不一定是 Docker 发布端口或防火墙遗漏。

本文针对原生 Linux 上的 macvlan bridge 模式。该驱动不适用于 rootless,也不受 Docker Desktop for Mac、Windows 支持。若局域网其他机器同样访问失败,应先检查网络配置、交换机或虚拟交换机允许多个 MAC 的条件,不能把所有不可达都解释为宿主隔离。

先确认两端地址和网络驱动

保存现有网络与应用配置,用只读检查核对实际驱动、parent、IPAM 和容器地址。下面的名称需替换:

docker network inspect lan-macvlan
docker inspect app-container --format '{{json .NetworkSettings.Networks}}'

确认 network 的 Driver 确实是 macvlan,Options 中的 parent 是实际连接局域网的接口或 VLAN 子接口;检查实际模式,不把其他模式的通信限制直接套用到 bridge。IP、网段和网关应与当前网络一致,不根据以前的地址猜测。输出按内部网络资料保管。

将访问路径分开比较:局域网另一台机器到容器 IP、宿主到同一 IP,以及容器到宿主 parent 地址。使用应用真正监听的服务端口。浏览器或 curl 的 No route to host 只是失败现象,需要结合实际路由、接口和访问方向判断;网络路由表里有一个匹配条目,也不保证这条路径被允许通信。

当其他局域网主机能到容器,而宿主 parent 这一路独自失败时,才重点考虑 macvlan 的父子接口隔离。这个限制不能靠多加一条 Docker ports 映射,或把宿主防火墙整体关闭来解除。

能使用独立内部路径时,增加受控 bridge 网络

如果宿主与应用之间不必使用原来的局域网 IP,可以让应用同时接入 macvlan 和一个受控 bridge 网络。对外依旧使用 macvlan 的独立地址,宿主通信则走内部 bridge 路径,避免直接从 parent 接口访问 macvlan 子接口。

这需要明确内部路径的访问方式:宿主上的客户端使用可达的 bridge 地址或经过审定的宿主端口发布;另一个容器则应加入共同的 bridge 网络,并使用其服务名与内部端口。不要把内部地址交给局域网外部客户端,也不要依赖重建后仍保持不变的动态 IP。

应用必须在这条新路径上监听,认证和访问控制仍须保留。增加一张网络会改变可达范围,不能顺手把数据库、缓存和所有应用接到同一个不受限制的网络。应用如果固定只监听 macvlan 的 IP,新网络存在也不会自动让服务可用。

必须保留 macvlan 时,宿主可建立同类子接口

另一条路径是在宿主上创建使用相同 parent 的 macvlan 接口,为它分配当前 Docker macvlan 网段中未占用的独立 IP。容器与这个宿主子接口之间可以按 macvlan bridge 的同类接口路径通信,避免直接使用 parent 地址。

这不是把 parent 地址搬到新接口,也不是再占用一个已经分给容器的 IP。管理员需先从 DHCP 与 Docker 地址池中排除该地址,检查实际接口模式,并规划宿主到目标容器地址范围的路由。范围应只覆盖需要走这条路径的地址,不能为了试验替换默认路由或删除整段局域网路由。

容器需要访问宿主服务时,应使用新子接口的地址,宿主服务也必须允许在这个地址上接收请求。若客户端只能使用写死的原宿主地址、无法改目标,新接口并不能自动满足这一约束。此时需重新评估应用支持的网络方式,不能承诺“添加接口就一定恢复”。

接口、地址和路由的持久配置取决于宿主网络管理方式。临时手工添加后的成功,不代表重启后还存在。应纳入现有网络管理配置,避免手工命令与系统网络管理器互相覆盖。

变更前留下恢复网络的通道

调整宿主接口和路由可能中断远程管理。先保存当前接口、路由、地址池与部署清单,安排受控窗口,并准备控制台或其他可靠管理路径。涉及重建应用时,还应确认持久卷和备份;不需要为这类连接限制删除卷或清空 Docker 网络。

新增 bridge 路径后,验证宿主可以访问预期应用,同时确认局域网原入口仍正常,认证与其他依赖没有扩大暴露。新增宿主 macvlan 子接口后,还需检查请求实际经新路径到达,容器到宿主新地址的必要服务可用,并确认没有 IP 冲突或影响其他 LAN 主机。

回退应移除这次新增的网络连接、接口和路由,并恢复保存的应用监听或客户端目标。只处理本次改动,不删除 parent 接口或已有默认路由。验收也要包括持久配置恢复后的结果;一次 ping 成功不能代替应用协议与访问控制检查。