请教个 docker 或是 iptables 防火墙问题:容器内能 ping 通 ip 但 ping 不通域名,提示“bad address”

2021-04-12 08:54:50 +08:00
 AllenHua

原帖发在了恩山,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
7614 次点击
所在节点    Linux
50 条回复
AllenHua
2021-04-12 11:23:48 +08:00
@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
AllenHua
2021-04-12 11:24:44 +08:00
@zhangsanfeng2012 #20 是的 docker 安装在 openwrt 里。openwrt 中可以 ping 通域名的,我现在各个设备上网都是没问题的呀
mlcq
2021-04-12 11:39:48 +08:00
能 ping 通 ip,ping 不同域名,还是 dns 解析的问题
bowser1701
2021-04-12 11:40:30 +08:00
@AllenHua 你是在 container 里面 dig 的嘛,我意思是可以测试下你的容器里的 DNS server
caicaiwoshishui
2021-04-12 11:43:34 +08:00
我的 openwrt 不能访问国内,全局就能访问,ping
不同 baidu.com ,不知道怎么处理,哪里有问题。
Openwrt 用了 adgurd home 但是注释了防火墙转 53 的规则。
cpstar
2021-04-12 11:50:12 +08:00
18# ,感觉那个接受入站,应该是接受出站。入站成了外网访问你的 53,而不是你的子网要访问外边的 53 。

然后,合并 @caicaiwoshishui 的问题,openwrt 内置了很多个 dns 有关的服务,我当时是从 53 端口(查看监听程序),一个一个往上捋,adguard 、smartdns,还有几个,一个一个挨个关闭,各种拦截广告、防止 DNS 污染的,是好事,但也挺闹心,比如某些依赖或者看似广告网址的,无故被拦截,然后导致 APP 应用功能不能用,最后关掉各种 DNS 过滤器,一下子好了。
AllenHua
2021-04-12 11:51:54 +08:00
@bowser1701 #24

@mlcq #23

![20210412115049.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210412115049.png)

无法回复文本了 提示我 “请不要在每一个回复中都包括外链,这看起来像是在 spamming” sigh
zhangsanfeng2012
2021-04-12 11:57:00 +08:00
openwrt 里面抓下包看看,tcpdump -i docker0 -w /tmp/test.pcap,然后在容器里面 dig 一下
wunsch0106
2021-04-12 12:02:31 +08:00
ping localhost 试一下 还是 bad address 那肯定就是 dns 问题了, /etc/resolv.conf 配置了可能没生效把。
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 畅通的有效办法
AllenHua
2021-04-12 12:51:37 +08:00
@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 是通的
lcdtyph
2021-04-12 12:53:23 +08:00
排除一下 53 端口的问题
dig www.baidu.com @202.141.162.123 -p5353
能正常查询么
AllenHua
2021-04-12 12:55:06 +08:00
@lcdtyph #32 能!大佬🐂️ 能继续分析一下吗
AllenHua
2021-04-12 12:55:33 +08:00
@lcdtyph #32 udp 53 端口 被防火墙阻断了吗
lcdtyph
2021-04-12 12:59:01 +08:00
@AllenHua #34
看上去是的了,openwrt 上有安装 clash 类的工具么?

在此之前先看一下换个 dns 能不能返回结果吧,8888 有的地方直接封了
dig <domain> @202.141.162.123
AllenHua
2021-04-12 13:33:08 +08:00
@lcdtyph #35 有安装 openclash 但还没启用,adguardhome 也没启动 所以应该不用考虑他们会带来影响

202.141.162.123 这个是 中科大电信 dns 吧 使用 53 端口不能查,但使用 5353 可以

![20210412132941.png]( https://cdn.jsdelivr.net/gh/hellodk34/image@main/img/20210412132941.png)

防火墙里加了这条 但是似乎没起作用
lcdtyph
2021-04-12 13:36:43 +08:00
@AllenHua
对,是中科大 dns,因为有非标准端口方便调试
找个地方把 iptables -vnL 和 iptables -t nat -vnL 和 iptables -t mangle -nvL 贴出来看看吧
AllenHua
2021-04-12 13:45:54 +08:00
@lcdtyph #37 能通过 tg 沟通一下吗 🐶️ base64 encoded: aHR0cHM6Ly90Lm1lL2FsbGVuaHVh
cpstar
2021-04-12 13:48:34 +08:00
#36 是吧,一堆自带的看起来方便但是各种卸载很闹心的应用,反而使使用变得麻烦。不用就卸载吧,一个一个全卸载干净。

看一下 UDP53 谁监听了,netstat -unlp,然后看配置做了什么上游 DNS,然后顺藤摸瓜。
AllenHua
2021-04-12 13:54:23 +08:00
@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 的 四表五链不是很懂(啊 摔!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/769968

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX