原帖发在了恩山,https://www.right.com.cn/forum/thread-4109783-1-1.html
dns 服务器应该不是问题了,可能就是防火墙的问题。用的是 x86 的 openwrt,防火墙是 iptables 程序,这条 iptables 规则怎么写? docker 中的容器 ping 不通域名这个问题是怎么一回事?
echo echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts 后就能 ping 通 archive.ubuntu.com 这个域名
搜到了下面的方法,但是我不知道用 iptables 该怎么解决,救救孩子🧒🏻吧
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
systemctl restart docker
docker 默认提供三种网络模式
楼主测试的都是使用的 bridge 桥接网络,宿主机创建了 docker0 网络接口似乎是没有问题的
docker0 Link encap:Ethernet HWaddr 02:42:AB:19:BF:95 inet addr:192.168.20.1 Bcast:192.168.21.255 Mask:255.255.254.0 inet6 addr: fe80::42:abff:fe19:bf95/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4449 errors:0 dropped:0 overruns:0 frame:0 TX packets:5611 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4624642 (4.4 MiB) TX bytes:7529616 (7.1 MiB)
使用默认的网络模式 bridge 启动 alpine docker run -it --rm alpine /bin/ash
echo "151.101.110.133 dl-cdn.alpinelinux.org" >> /etc/hosts apk update && apk add bind-tools
然后 dig baidu.com 下面是输出
; <<>> DiG 9.16.11 <<>> baidu.com ;; global options: +cmd ;; connection timed out; no servers could be reached
能 ping 通ip 8.8.8.8 223.5.5.5 这些
换个思路,将alpine使用 宿主机的模式启动, docker run -it --net=host --rm alpine /bin/ash
这样就能ping通域名,容器内访问外网正常了
且这三种网络模式 不可删除
刚刚格式出了点问题,重新发下
宿主机docker0
# ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:42:AB:19:BF:95
inet addr:192.168.20.1 Bcast:192.168.21.255 Mask:255.255.254.0
inet6 addr: fe80::42:abff:fe19:bf95/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4449 errors:0 dropped:0 overruns:0 frame:0
TX packets:5611 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4624642 (4.4 MiB) TX bytes:7529616 (7.1 MiB)
# dig baidu.com
; <<>> DiG 9.16.11 <<>> baidu.com
;; global options: +cmd
;; connection timed out; no servers could be reached
# ping baidu.com -c 2
ping: bad address 'baidu.com'
在bridge模式下,连在同一网桥上的容器可以相互通信(若出于安全考虑,也可以禁止它们之间通信,方法是在DOCKER_OPTsS变量中设置–icc=false,这样只有使用–link才能使两个容器通信)。
Docker可以开启容器间通信(意味着默认配置--icc=true),也就是说,宿主机上的所有容器可以不受任何限制地相互通信,这可能导致拒绝服务攻击。进一步地,Docker可以通过--ip_forward和--iptables两个选项控制容器间、容器和外部世界的通信。
容器也可以与外部通信,我们看一下主机上的Iptable规则,可以看到这么一条
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
这条规则会将源地址为172.17.0.0/16的包(也就是从Docker容器产生的包),并且不是从docker0网卡发出的,进行源地址转换,转换成主机网卡的地址。这么说可能不太好理解,举一个例子说明一下。假设主机有一块网卡为eth0,IP地址为192.168.0.136/24,网关为192.168.0.254。从主机上一个IP为172.17.0.1/16的容器中ping百度(180.76.3.151)。IP包首先从容器发往自己的默认网关docker0,包到达docker0后,也就到达了主机上。然后会查询主机的路由表,发现包应该从主机的eth0发往主机的网关10.10.105.254/24。接着包会转发给eth0,并从eth0发出去(主机的ip_forward转发应该已经打开)。这时候,上面的Iptable规则就会起作用,对包做SNAT转换,将源地址换为eth0的地址。这样,在外界看来,这个包就是从192.168.0.136上发出来的,Docker容器对外是不可见的。
那么,外面的机器是如何访问Docker容器的服务呢?我们首先用下面命令创建一个含有web应用的容器,将容器的80端口映射到主机的80端口。
docker run --name web1 -d -p 80:80 nginx
docker run --name web2 -d -p 81:80 nginx
然后查看Iptable规则的变化,发现多了这样一条规则
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.3:80
上面内容来自 https://www.cnblogs.com/wangxu01/articles/11316447.html
下面是楼主机器上的
此图文本链接:https://paste.ubuntu.com/p/jS8QCM4nvx/
感觉明明知道是 iptables 防火墙问题但不懂怎么解决 sigh
1
wunsch0106 2021-04-12 08:59:19 +08:00
修改下 dns
|
2
AllenHua OP |
3
cpstar 2021-04-12 09:08:10 +08:00
你那个 echo 相当于本地解析,所以 archive.ubuntu.com 肯定成功
判断的方法很简单,关掉防火墙,如果立马正常,那就是防火墙的问题。 加一条 udp53 的端口放行。但是定义了 wan 和 lan,默认 lan->wan 不拦截。 |
4
codehz 2021-04-12 09:09:15 +08:00 via Android
你用 nslookup/dig 测试 dns,别用 ping 测试域名,根本不是一个用途的
|
5
cpstar 2021-04-12 09:12:58 +08:00
原帖说的网络结构比本贴复杂啊
先找个外网的 IP,测试路由是否通顺,别 docker 里的数据包路由上就不带转发的。 然后网络结构略复杂,一层 NAT 就是一层损耗,想办法缩减一下结构吧。 |
6
AllenHua OP @codehz #4 # ping 10.10.10.1 -c 2
PING 10.10.10.1 (10.10.10.1): 56 data bytes 64 bytes from 10.10.10.1: seq=0 ttl=64 time=0.458 ms 64 bytes from 10.10.10.1: seq=1 ttl=64 time=0.256 ms --- 10.10.10.1 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.256/0.357/0.458 ms / # ping 8.8.8.8 -c 2 PING 8.8.8.8 (8.8.8.8): 56 data bytes 64 bytes from 8.8.8.8: seq=0 ttl=46 time=8.660 ms 64 bytes from 8.8.8.8: seq=1 ttl=46 time=8.481 ms --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 8.481/8.570/8.660 ms / # cat /etc/resolv.conf search lan nameserver 8.8.8.8 nameserver 8.8.4.4 / # dig baidu.com ; <<>> DiG 9.16.11 <<>> baidu.com ;; global options: +cmd ;; connection timed out; no servers could be reached / # ping baidu.com -c 2 ping: bad address 'baidu.com' 我的宿主机 是 10.10.10.1 docker 的 dns 指定了 8.8.8.8 和 8.8.4.4 能 ping 通 8.8.8.8 但是 ping 不通 baidu.com dig 也是超时,没有能到达的服务器 @cpstar #3 @cpstar #5 |
7
AllenHua OP @cpstar #5 房东的路由器 我也没法拆 只能这样了吧,我自己还要在路由上搭建服务 于是只能 docker 内部 192.168.20.x -> 到我的路由器 10.10.10.1 再到房东的 192.168.1.1 然后出去
|
8
AllenHua OP @cpstar #3 昨晚尝试 关掉了防火墙 /etc/init.d/firewall stop 整个网络都不行了 /捂脸
|
10
AllenHua OP |
11
oluoluo 2021-04-12 09:34:16 +08:00
`iptables -A INPUT -p udp --dport 53 -j ACCEPT` 加个这个访问规则可不可以呢
|
13
xuanbg 2021-04-12 09:58:10 +08:00
没有复杂网络需求的,容器一律使用宿主机网络,也就是 host 。
|
14
codehz 2021-04-12 09:58:11 +08:00 via Android
看起来是 udp 53 连接被阻止了,试试+tcp 的选项(附加到后面,另外多测试几种 dns 服务器,难说是抽风了)
应该就是防火墙的配置问题((( |
15
AllenHua OP @xuanbg #13 好的 谢谢
@codehz #14 感觉是 iptables 配置的问题 `iptables -t nat -vnL` 执行这一句 输出没有 docker0 这个接口的相关内容(防火墙小白阵亡…… https://www.cnblogs.com/wangxu01/articles/11316447.html 参考这个 感觉复杂 头大🤦🏻♂️ |
16
Jirajine 2021-04-12 10:17:16 +08:00 via Android
docker 的网络模式命名非常迷惑人,这个“bridge”模式在其他虚拟机等类似情况下都叫“nat 模式”,而对应传统虚拟机的 bridge 模式在 docker 里是 macvlan (类似但不同),而真正的 bridge 模式 docker 并不支持。
|
17
cpstar 2021-04-12 10:50:47 +08:00
哈,firewall 不能直接关,我好像忘了这茬事了。因为 iptables 上是不是带着路由转发呢,哎,不对啊,路由和 iptables 应当是两码事。
从 6#的情况看,肯定 UDP53 被拦截了。你定义一下 firewall 的区域。 然后我没整明白那个 10.10.10.x 是个什么存在,也就是 192.168.1.1-10.10.10.1-192.168.20.x ?有点怪。。。 |
18
AllenHua OP @cpstar #17
@codehz #14 @oluoluo #11 ![20210412110547.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210412110547.png) ``` ACCEPT tcp -- anywhere anywhere tcp dpt:domain /* !fw3: tcpudp53 */ ACCEPT udp -- anywhere anywhere udp dpt:domain /* !fw3: tcpudp53 */ ``` 放行了 dns 查询的 53 端口 tcp+udp 容器内还是 ping 不通域名 |
19
bowser1701 2021-04-12 11:07:56 +08:00
|
20
zhangsanfeng2012 2021-04-12 11:10:24 +08:00
你的路由器是 openwrt,那你 openwrt 中能 ping 通域名吗?你的 docker 装在 openwrt 的机子里面?
|
21
AllenHua OP @bowser1701 #19
@zhangsanfeng2012 #20 # ping z.cn -c 4 PING z.cn (54.222.60.252): 56 data bytes 64 bytes from 54.222.60.252: seq=0 ttl=229 time=30.494 ms 64 bytes from 54.222.60.252: seq=1 ttl=229 time=30.804 ms 64 bytes from 54.222.60.252: seq=2 ttl=229 time=30.618 ms 64 bytes from 54.222.60.252: seq=3 ttl=229 time=30.987 ms --- z.cn ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 30.494/30.725/30.987 ms # dig z.cn ; <<>> DiG 9.17.11 <<>> z.cn ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21711 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;z.cn. IN A ;; ANSWER SECTION: z.cn. 599 IN A 54.222.60.252 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP) ;; WHEN: Mon Apr 12 11:19:33 CST 2021 ;; MSG SIZE rcvd: 49 本地搭建了 dnsmasq 任何局域网的 dns 请求都请求 10.10.10.1:53 @cpstar #17 不好意思 造成理解上困难了 房东的路由器(我不能乱动)是 192.168.1.1 我的路由器是 10.10.10.1 (然后我的其他设备都是 10.10.10.x ) docker 创建的虚拟网卡 是这个网段 192.168.20.0/23 docker0 自身的 ip 地址是 192.168.20.1 docker 中使用 bridge 网络的容器默认网关都是 192.168.20.1 这些容器的 ip 地址是 192.168.20.x |
22
AllenHua OP @zhangsanfeng2012 #20 是的 docker 安装在 openwrt 里。openwrt 中可以 ping 通域名的,我现在各个设备上网都是没问题的呀
|
23
mlcq 2021-04-12 11:39:48 +08:00
能 ping 通 ip,ping 不同域名,还是 dns 解析的问题
|
24
bowser1701 2021-04-12 11:40:30 +08:00
@AllenHua 你是在 container 里面 dig 的嘛,我意思是可以测试下你的容器里的 DNS server
|
25
caicaiwoshishui 2021-04-12 11:43:34 +08:00 via iPhone
|
26
cpstar 2021-04-12 11:50:12 +08:00
18# ,感觉那个接受入站,应该是接受出站。入站成了外网访问你的 53,而不是你的子网要访问外边的 53 。
然后,合并 @caicaiwoshishui 的问题,openwrt 内置了很多个 dns 有关的服务,我当时是从 53 端口(查看监听程序),一个一个往上捋,adguard 、smartdns,还有几个,一个一个挨个关闭,各种拦截广告、防止 DNS 污染的,是好事,但也挺闹心,比如某些依赖或者看似广告网址的,无故被拦截,然后导致 APP 应用功能不能用,最后关掉各种 DNS 过滤器,一下子好了。 |
27
AllenHua OP @bowser1701 #24
@mlcq #23 ![20210412115049.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210412115049.png) 无法回复文本了 提示我 “请不要在每一个回复中都包括外链,这看起来像是在 spamming” sigh |
28
zhangsanfeng2012 2021-04-12 11:57:00 +08:00 via Android
openwrt 里面抓下包看看,tcpdump -i docker0 -w /tmp/test.pcap,然后在容器里面 dig 一下
|
29
wunsch0106 2021-04-12 12:02:31 +08:00
ping localhost 试一下 还是 bad address 那肯定就是 dns 问题了, /etc/resolv.conf 配置了可能没生效把。
|
30
cpstar 2021-04-12 12:04:12 +08:00
@zhangsanfeng2012 28# 越整越高深了,LZ 吃不消。。。哈
这么说吧,ping 走的 ICMP 数据包,能 ping 通,证明 10.10.10.1 转发了 ICMP 包。 然后可以在 docker 里去 telnet 任何一台外网机器的 80,比如获取 t.cn 的 IP 之后,telnet t.cn 的 ip 80,这个能够检测 TCP 路径是否畅通,最后就是 UDP 是否畅通了,我的知识范围,还没找到一个能够检测远端 UDP 畅通的有效办法 |
31
AllenHua OP @zhangsanfeng2012 #28
抓到了这些内容 ``` `B�EN�+@�������5:��o baiducom) E�j���;�EN�+@��5:n;o baiducom) `B�EN��@T�����15:��o baiducom) E�j��@���EN��@���15:r?o baiducom) `B�ENڳ@�������5:��o baiducom) E�j���;�ENڳ@��5:n;o baiducom) `B�EN�@F�����15:��o baiducom) E�j�]@���EN�@���15:r?o baiducom) `B�EN��@�v������5:��o baiducom) E���;�EN����5:n;o baiducom) `B�EN�'@"�����15:��o baiducom) E�j�H@���EN�'@ٿ�15:r?o baiducom) ``` @wunsch0106 #29 容器内 ping locahost 或者 127.0.0.1 都是 ok 的 @cpstar #30 # telnet 10.10.10.1 88 Connected to 10.10.10.1 # telnet dl-cdn.alpinelinux.org 443 Connected to dl-cdn.alpinelinux.org 说明 TCP 是通的 |
32
lcdtyph 2021-04-12 12:53:23 +08:00
|
35
lcdtyph 2021-04-12 12:59:01 +08:00
|
36
AllenHua OP @lcdtyph #35 有安装 openclash 但还没启用,adguardhome 也没启动 所以应该不用考虑他们会带来影响
202.141.162.123 这个是 中科大电信 dns 吧 使用 53 端口不能查,但使用 5353 可以 ![20210412132941.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210412132941.png) 防火墙里加了这条 但是似乎没起作用 |
37
lcdtyph 2021-04-12 13:36:43 +08:00 via iPhone
@AllenHua
对,是中科大 dns,因为有非标准端口方便调试 找个地方把 iptables -vnL 和 iptables -t nat -vnL 和 iptables -t mangle -nvL 贴出来看看吧 |
38
AllenHua OP @lcdtyph #37 能通过 tg 沟通一下吗 🐶️ base64 encoded: aHR0cHM6Ly90Lm1lL2FsbGVuaHVh
|
39
cpstar 2021-04-12 13:48:34 +08:00
#36 是吧,一堆自带的看起来方便但是各种卸载很闹心的应用,反而使使用变得麻烦。不用就卸载吧,一个一个全卸载干净。
看一下 UDP53 谁监听了,netstat -unlp,然后看配置做了什么上游 DNS,然后顺藤摸瓜。 |
40
AllenHua OP @cpstar #39 有时候 这些应用的确挺有用 但是排查起来问题 需要有足够的知识和耐心,不然真的是很闹心的
@lcdtyph #37 root@dkRouter:~# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 804 packets, 114K bytes) pkts bytes target prot opt in out source destination 888 120K prerouting_rule all -- * * 0.0.0.0/0 0.0.0.0/0 /* !fw3: Custom prerouting rule chain */ 836 116K zone_lan_prerouting all -- br-lan * 0.0.0.0/0 0.0.0.0/0 /* !fw3 */ 11 888 zone_wan_prerouting all -- eth4 * 0.0.0.0/0 0.0.0.0/0 /* !fw3 */ 84 5940 REDIRECT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 redir ports 53 0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 redir ports 53 完整的在 https://paste.ubuntu.com/p/MbhNMXPdTc/ 是不是转发 dns 请求的目的地址是所有地址导致的? 应该指定一下 10.10.10.1:53 ? 对于 iptables 的 四表五链不是很懂(啊 摔! |
41
AllenHua OP @cpstar #39 dnsmasq 和 avahi-daemon 前者监听 53 后者监听了 5353
# netstat -unlp |grep 53 udp 0 0 127.0.0.1:53 0.0.0.0:* 9303/dnsmasq udp 0 0 10.10.10.1:53 0.0.0.0:* 9303/dnsmasq udp 0 0 0.0.0.0:5353 0.0.0.0:* 6347/avahi-daemon: udp 0 0 :::5353 :::* 6347/avahi-daemon: |
42
zhangsanfeng2012 2021-04-12 14:07:55 +08:00
iptables -D PREROUTING -t nat -p udp --dport 53 -j REDIRECT --to-ports 53 试一下删掉 53 端口转发
然后贴一下 iptables-save -t nat |
43
joyhub2140 2021-04-12 14:35:18 +08:00
我貌似遇到这个问题,容器内 DNS 解析的问题,都是和防火墙有关的,因为 docker 的 iptable 规则是独立于管理者自己设置的规则的,不能被 admin 统筹管理端口开放规则,建议防火墙的前端不要采用 nftables,直接采用 iptables,这样子就可以使用了,另外关于 docker 的防火墙规则,建议还要依靠外部的防火墙实施端口隔离吧,搞本季内部的防火墙很容易导致冲突。
|
44
joyhub2140 2021-04-12 14:38:31 +08:00
docker run -it --net=host --rm alpine /bin/ash
这个是有比较大风险的,相当于无视 docker 容器的网络隔离特性,一下子把那个容器的网络提升至最高,理论上它可以访问任何运行中的容器。 |
45
magua 2021-04-12 15:29:01 +08:00
有试过修改容器内的 dns 服务器的 ip 吗?我之前在 k8s 的 pod 中也遇到过类似的问题,修改容器内的 dns 好了。
|
46
OldCarMan 2021-04-12 17:30:57 +08:00
|
47
AllenHua OP @zhangsanfeng2012 #42 实在是没辙了
用 wireshark 抓包 发现问题 应该还是 iptables 的配置问题 @joyhub2140 #43 谢谢分享! @joyhub2140 #44 是这样 本来使用容器的主要目的就是将容器与宿主机隔离开来 容器共享主机 ip 不是一个明智之举 谢谢指出 @magua #45 没搞好了 后面重新刷了一个固件 可以了 @OldCarMan #46 这个就是正文中提到的这个吧 ``` firewall-cmd --zone=public --add-masquerade --permanent firewall-cmd --reload systemctl restart docker ``` |
48
zhangsanfeng2012 2021-04-12 19:14:08 +08:00
@AllenHua 删掉 53 重定向也不行吗
|
49
AllenHua OP @zhangsanfeng2012 #48 当时是把那两条规则删掉了 不行 我新增了附言 层主有兴趣 我们可以 tg 私聊
|