帮同事解决了一个ping不通一个内网域名的问题,这里记录一下希望给大家解决类似问题一些帮助。
现象
在容器内部ping一个内网的域名,ping不通。
排查步骤
-
怀疑是不是dns的问题,在容器内直接ping ip地址也是不通的
-
怀疑是宿主机防火墙问题,在目标机上抓包
tcpdump -i eth0 -p icmp
没有收到ping包,证明包没有发出去。查看防火墙配置以及和正常机器防火墙配置对比没有发现问题,基本可以排除防火墙drop了ping包的可能性。
-
怀疑路由表配置,但是在宿主机上可以正常ping通,证明对应的规则没有问题
-
怀疑是ip_forward参数没有开启导致ping包到了docker0后没有办法转发到宿主机的网卡,
cat /proc/sys/net/ipv4/ip_forward
输出的结果是1,证明没有问题
-
在容器内部ping宿主机ip发现ping不通,这个现象很奇怪。。
-
在容器内部ping其他容器发现也ping不通,感觉是网桥的转发规则出了问题。再次回到路由表
route -n
发现下面的转发规则,
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
尝试添加如规则,发现提示docker0是down的。
-
使用ifconfig查看当前设备,果然没有docker0
-
使用ifconfig up docker0启动docker0,发现ping不通的问题得到了解决。
总结
docker相关的网络问题大多数与dns, 防火墙(nat, filter等), route, ip_forward, 网桥相关。当遇到问题时,从上面的几个方面入手逐步进行排查,大多数问题都可以很快的解决。