17

一次因为光猫桥接后路由器接口变化导致docker内容器无法联网问题的解决

 3 years ago
source link: https://hellodk.cn/post/525
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一次因为光猫桥接后路由器接口变化导致docker内容器无法联网问题的解决

2021-05-24 15:06:45 update

实际上这有可能是 docker 的一个bug,重启了宿主机之后也需要重启一下 dockerd 容器才可以联网。不过也有可能是开机自启脚本有问题,但是前者的可能性更大。/etc/init.d/dockerd restart 重启一下 dockerd 就好啦

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.


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK