2021-04-24 19:52:15 update

写这篇文章的过程中我脑海中就一直在发问,为什么有 dns 的问题,明明已经返回了正确的 ip 了,但就是 icmp 包没有返回,全都丢失,这为什么是 dnsmasq 的问题呢,为什么要监听 eth4 的 ip? 没有必要呀,docker中的容器将 dns query 发给 软路由的 lan 口,lan有到wan的路由通路,dnsmasq 根本就不需要监听 eth4 的ip 了。事实证明是因为 wan 那边原本是通过光猫 拨号 这边 dhcp 获取的ip,前两天改成了光猫桥接 这边 wan(也就是 eth4)通过 PPPoE 拨号上网的,dockerd 需要重启才能获得网络,我没有重启dockerd 导致没网的。

讨论见这个帖子:ping 域名返回了ip 但是ping不通是为什么?

实际上对于本文的标题,解决方法很简单,重启 dockerd 就好了


以下是原文:

我说昨晚微信没有收到 server酱 的一个推送,平常都是准时准点的,但是昨晚并没有推送消息到微信,我还以为docker容器(代称容器A,就是发现容器A无法联网,才知道所有容器都没法联网了,影响很大)挂掉了 或者 docker daemon 挂掉了。刚通过日志确认,应该是容器无法访问网络了的原因。日志如下图

20210424140814.png

还有这段日志

2021-04-23 20:50:08 ERROR : org.apache.http.conn.HttpHostConnectException: Connect to sc.ftqq.com:443 [sc.ftqq.com/220.181.136.120] failed: Connection refused (Connection refused),

由于此时这个容器没有网络,所以我们也不能安装 ping 工具包测试,我们使用其他自带 ping 工具的镜像/容器 测试。

# 此时在openwrt中,进入 emby 这个镜像的容器中 ping 测试看看

docker exec -it emby /bin/ash

# 执行完上面的命令就已经进入了 emby 的容器,emby 是容器的名称(你也可以使用容器id)
# ping baidu.com -c 4
PING baidu.com (220.181.38.148): 56 data bytes

--- baidu.com ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss

没有 ICMP 包返回,说明网络不通。

想想和之前有何不同?那肯定是光猫改了桥接啊😂️,现在我的软路由的 eth0 到 eth4 接口有所变化,上面的ping返回了ip地址但是没有 icmp 包返回。问题还是出在dns 上?

看看目前软路由和光猫连接的 eth4 接口信息

# ifconfig eth4
eth4      Link encap:Ethernet  HWaddr 00:E0:70:2A:3F:59  
          inet addr:192.168.1.254  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13129963 errors:0 dropped:18497 overruns:0 frame:0
          TX packets:20642219 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9423348725 (8.7 GiB)  TX bytes:23961982092 (22.3 GiB)

因为设置了软路由 eth4(wan, PPPoE 拨号的接口)直通光猫 192.168.1.1,所以设置了 eth4 的ip地址是 192.168.1.254。见这篇文章:光猫桥接模式下使用openwrt路由器访问光猫配置教程

从容器中 traceroute 10.10.10.1 或者 192.168.1.254 再到 192.168.1.1 都是通的,说明这里路由表没问题,问题还是出在docker的宿主机(也就是 openwrt)dns 的监听。

查看一下 /etc/dnsmasq.conf

resolv-file=/etc/resolv.dnsmasq.conf
strict-order
listen-address=127.0.0.1,10.10.10.1,172.10.10.1,192.168.20.1
addn-hosts=/etc/dnsmasq.hosts

将 listen-address 中添加 eth4 的 IP,因为这个接口是wan,通向光猫然后直到 Internet 的接口,修改好之后是

resolv-file=/etc/resolv.dnsmasq.conf
strict-order
listen-address=127.0.0.1,10.10.10.1,172.10.10.1,192.168.20.1,192.168.1.254
addn-hosts=/etc/dnsmasq.hosts

改好了之后重启 dnsmasqdockerd

/etc/init.d/dnsmasq restart

/etc/init.d/dockerd restart

再进入容器A,这个容器使用 debian 系的软件包管理方式,默认没有安装 ping ifconfig 等程序,我们自己安装一下确认吧(此时已经修复好了容器的网络了)

# 更新一下软件源列表
apt-get update

# 安装 ifconfig
apt-get install net-tools

# 安装 ping
apt-get install iputils-ping

ifconfig 一下看看

# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.10.10.0  netmask 255.255.0.0  broadcast 172.10.255.255
        ether 02:42:ac:0a:0a:00  txqueuelen 0  (Ethernet)
        RX packets 7019  bytes 9321265 (8.8 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5005  bytes 366618 (358.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 28  bytes 2098 (2.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 2098 (2.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

容器A 的 ip 是 172.10.10.0,容器使用的网络网关地址是 172.10.10.1,这个地址在 dnsmasq 的监听列表中,没问题~

ping 一下看看

# ping baidu.com -c 4
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=49 time=22.8 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=49 time=22.5 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=49 time=22.9 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=49 time=23.2 ms

--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 6ms
rtt min/avg/max/mdev = 22.511/22.846/23.174/0.299 ms

ok 好耶,解决了

本文的记录或分享结束,end.