Docker宿主网络模式下GCE虚拟机端口无法被同网络其他VM访问的问题排查
遇到这种情况别慌,咱们一步步梳理可能的问题点:
GCE防火墙规则限制:GCE的默认防火墙策略是比较严格的,哪怕是同VPC网络内的虚拟机,也需要明确的入站规则允许端口访问。你得去GCE控制台的防火墙设置里看看,有没有创建允许TCP 7000和9042端口的规则,规则的目标范围要覆盖你这台提供服务的VM,来源要包含同网络里其他VM的IP段或者对应的标签。
宿主VM本地防火墙拦截:虽然容器用了宿主网络,但宿主VM自己的防火墙(比如Linux的
iptables或者ufw)可能没开放这两个端口。你可以在宿主VM上执行iptables -L或者ufw status看看,有没有拒绝来自同网络IP段的7000、9042端口的入站流量。如果有的话,需要添加允许规则,比如ufw allow from <同网络IP段> to any port 7000,9042。端口绑定的IP范围限制:从你的
netstat输出看,端口绑定的是VM的私有IP,而不是0.0.0.0(所有网卡)。虽然理论上同网络VM访问这个私有IP是没问题的,但要确认你测试连接的时候用的是不是这个正确的私有IP,另外还要检查VM有没有多个网卡,是不是绑定的网卡和同网络通信的网卡不一致。如果想更宽松一点,可以修改容器启动参数,让服务绑定到0.0.0.0,确保所有网卡都能接收请求。容器内服务的监听配置:虽然容器用了
--net=host,但容器里的服务本身可能配置成只监听127.0.0.1或者某个特定IP,而不是允许所有IP访问。你可以进入容器内部,用netstat -tulpn看看服务实际监听的地址,或者检查服务的配置文件,确保监听地址是0.0.0.0或者VM的私有IP。VPC网络路由异常:先测试一下同网络的VM能不能ping通这台服务VM的私有IP,如果ping不通,那说明不是端口的问题,而是网络连通性本身有问题。这时候要检查VPC的子网配置,看看两个VM是不是在同一个子网或者有正确的路由规则,另外还要确认VM的网卡有没有正常启用,有没有IP地址配置错误。
备注:内容来源于stack exchange,提问作者hphp95

