跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 请教个 docker 或是 iptables 防火墙问题:容器内能 ping 通 ip 但 ping 不通域名,提示“bad address”
未分類
2 4 月 2021

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

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

資深大佬 : AllenHua 5

原帖发在了恩山,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 该怎么解决,救救孩子

大佬有話說 (50)

  • 資深大佬 : wunsch0106

    修改下 dns

  • 主 資深大佬 : AllenHua

    @wunsch0106 #1 改成了 223.5.5.5 180.76.76.76 8.8.8.8 这种公共 dns 都没成功

    感觉是防火墙问题

  • 資深大佬 : cpstar

    你那个 echo 相当于本地解析,所以 archive.ubuntu.com 肯定成功
    判断的方法很简单,关掉防火墙,如果立马正常,那就是防火墙的问题。
    加一条 udp53 的端口放行。但是定义了 wan 和 lan,默认 lan->wan 不拦截。

  • 資深大佬 : codehz

    你用 nslookup/dig 测试 dns,别用 ping 测试域名,根本不是一个用途的

  • 資深大佬 : cpstar

    原帖说的网络结构比本贴复杂啊
    先找个外网的 IP,测试路由是否通顺,别 docker 里的数据包路由上就不带转发的。
    然后网络结构略复杂,一层 NAT 就是一层损耗,想办法缩减一下结构吧。

  • 主 資深大佬 : AllenHua

    @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

  • 主 資深大佬 : AllenHua

    @cpstar #5 房东的路由器 我也没法拆 只能这样了吧,我自己还要在路由上搭建服务 于是只能 docker 内部 192.168.20.x -> 到我的路由器 10.10.10.1 再到房东的 192.168.1.1 然后出去

  • 主 資深大佬 : AllenHua

    @cpstar #3 昨晚尝试 关掉了防火墙 /etc/init.d/firewall stop 整个网络都不行了 /捂脸

  • 資深大佬 : codehz

    dig 强制指定一个 dns 试试看
    dig @8.8.8.8 g.cn +trace

  • 主 資深大佬 : AllenHua

    @codehz #9 谢谢,下面是输出

    # dig @8.8.8.8 g.cn +trace

    ; <<>> DiG 9.16.11 <<>> @8.8.8.8 g.cn +trace
    ; (1 server found)
    ;; global options: +cmd
    ;; connection timed out; no servers could be reached

  • 資深大佬 : oluoluo

    `iptables -A INPUT -p udp –dport 53 -j ACCEPT` 加个这个访问规则可不可以呢

  • 主 資深大佬 : AllenHua

    @oluoluo #11 还是不可以 感谢。我附言一下最新“进展”

  • 資深大佬 : xuanbg

    没有复杂网络需求的,容器一律使用宿主机网络,也就是 host 。

  • 資深大佬 : codehz

    看起来是 udp 53 连接被阻止了,试试+tcp 的选项(附加到后面,另外多测试几种 dns 服务器,难说是抽风了)
    应该就是防火墙的配置问题(((

  • 主 資深大佬 : AllenHua

    @xuanbg #13 好的 谢谢
    @codehz #14 感觉是 iptables 配置的问题

    `iptables -t nat -vnL` 执行这一句 输出没有 docker0 这个接口的相关内容(防火墙小白阵亡……

    https://www.cnblogs.com/wangxu01/articles/11316447.html 参考这个 感觉复杂 头大

  • 資深大佬 : Jirajine

    docker 的网络模式命名非常迷惑人,这个“bridge”模式在其他虚拟机等类似情况下都叫“nat 模式”,而对应传统虚拟机的 bridge 模式在 docker 里是 macvlan (类似但不同),而真正的 bridge 模式 docker 并不支持。

  • 資深大佬 : cpstar

    哈,firewall 不能直接关,我好像忘了这茬事了。因为 iptables 上是不是带着路由转发呢,哎,不对啊,路由和 iptables 应当是两码事。

    从 6#的情况看,肯定 UDP53 被拦截了。你定义一下 firewall 的区域。

    然后我没整明白那个 10.10.10.x 是个什么存在,也就是 192.168.1.1-10.10.10.1-192.168.20.x ?有点怪。。。

  • 主 資深大佬 : AllenHua

    @cpstar #17
    @codehz #14
    @oluoluo #11
    ![20210412110547.png]( https://cdn.jsdelivr.net/gh/hellodk34/[email protected]/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 不通域名

  • 資深大佬 : bowser1701

    试试 `dig @119.29.29.29 baidu.com` 和 `dig baidu.com` 比较一下看看是不是本地的 DNS server 出问题了。

  • 資深大佬 : zhangsanfeng2012

    你的路由器是 openwrt,那你 openwrt 中能 ping 通域名吗?你的 docker 装在 openwrt 的机子里面?

  • 主 資深大佬 : AllenHua

    @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

    @zhangsanfeng2012 #20 是的 docker 安装在 openwrt 里。openwrt 中可以 ping 通域名的,我现在各个设备上网都是没问题的呀

  • 資深大佬 : mlcq

    能 ping 通 ip,ping 不同域名,还是 dns 解析的问题

  • 資深大佬 : bowser1701

    @AllenHua 你是在 container 里面 dig 的嘛,我意思是可以测试下你的容器里的 DNS server

  • 資深大佬 : caicaiwoshishui

    我的 openwrt 不能访问国内,全局就能访问,ping
    不同 baidu.com ,不知道怎么处理,哪里有问题。
    Openwrt 用了 adgurd home 但是注释了防火墙转 53 的规则。

  • 資深大佬 : cpstar

    18# ,感觉那个接受入站,应该是接受出站。入站成了外网访问你的 53,而不是你的子网要访问外边的 53 。

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

  • 主 資深大佬 : AllenHua

    @bowser1701 #24

    @mlcq #23

    ![20210412115049.png]( https://cdn.jsdelivr.net/gh/hellodk34/[email protected]/img/20210412115049.png)

    无法回复文本了 提示我 “请不要在每一个回复中都包括外链,这看起来像是在 spamming” sigh

  • 資深大佬 : zhangsanfeng2012

    openwrt 里面抓下包看看,tcpdump -i docker0 -w /tmp/test.pcap,然后在容器里面 dig 一下

  • 資深大佬 : wunsch0106

    ping localhost 试一下 还是 bad address 那肯定就是 dns 问题了, /etc/resolv.conf 配置了可能没生效把。

  • 資深大佬 : cpstar

    @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

    @zhangsanfeng2012 #28
    抓到了这些内容

    “`
    `B�EN�[email protected]�������5:��o baiducom)

    E�j���;�EN�[email protected]��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�[email protected]���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

    排除一下 53 端口的问题
    dig www.baidu.com @202.141.162.123 -p5353
    能正常查询么

  • 主 資深大佬 : AllenHua

    @lcdtyph #32 能!大佬

  • 主 資深大佬 : AllenHua

    @lcdtyph #32 udp 53 端口 被防火墙阻断了吗

  • 資深大佬 : lcdtyph

    @AllenHua #34
    看上去是的了,openwrt 上有安装 clash 类的工具么?

    在此之前先看一下换个 dns 能不能返回结果吧,8888 有的地方直接封了
    dig <domain> @202.141.162.123

  • 主 資深大佬 : AllenHua

    @lcdtyph #35 有安装 openclash 但还没启用,adguardhome 也没启动 所以应该不用考虑他们会带来影响

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

    ![20210412132941.png]( https://cdn.jsdelivr.net/gh/hellodk34/[email protected]/img/20210412132941.png)

    防火墙里加了这条 但是似乎没起作用

  • 資深大佬 : lcdtyph

    @AllenHua
    对,是中科大 dns,因为有非标准端口方便调试
    找个地方把 iptables -vnL 和 iptables -t nat -vnL 和 iptables -t mangle -nvL 贴出来看看吧

  • 主 資深大佬 : AllenHua

    @lcdtyph #37 能通过 tg 沟通一下吗

  • 資深大佬 : cpstar

    #36 是吧,一堆自带的看起来方便但是各种卸载很闹心的应用,反而使使用变得麻烦。不用就卸载吧,一个一个全卸载干净。

    看一下 UDP53 谁监听了,netstat -unlp,然后看配置做了什么上游 DNS,然后顺藤摸瓜。

  • 主 資深大佬 : AllenHua

    @cpstar #39 有时候 这些应用的确挺有用 但是排查起来问题 需要有足够的知识和耐心,不然真的是很闹心的
    @lcdtyph #37

    [email protected]:~# 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 的 四表五链不是很懂(啊 摔!

  • 主 資深大佬 : AllenHua

    @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:

  • 資深大佬 : zhangsanfeng2012

    iptables -D PREROUTING -t nat -p udp –dport 53 -j REDIRECT –to-ports 53 试一下删掉 53 端口转发

    然后贴一下 iptables-save -t nat

  • 資深大佬 : joyhub2140

    我貌似遇到这个问题,容器内 DNS 解析的问题,都是和防火墙有关的,因为 docker 的 iptable 规则是独立于管理者自己设置的规则的,不能被 admin 统筹管理端口开放规则,建议防火墙的前端不要采用 nftables,直接采用 iptables,这样子就可以使用了,另外关于 docker 的防火墙规则,建议还要依靠外部的防火墙实施端口隔离吧,搞本季内部的防火墙很容易导致冲突。

  • 資深大佬 : joyhub2140

    docker run -it –net=host –rm alpine /bin/ash

    这个是有比较大风险的,相当于无视 docker 容器的网络隔离特性,一下子把那个容器的网络提升至最高,理论上它可以访问任何运行中的容器。

  • 資深大佬 : magua

    有试过修改容器内的 dns 服务器的 ip 吗?我之前在 k8s 的 pod 中也遇到过类似的问题,修改容器内的 dns 好了。

  • 資深大佬 : OldCarMan

    如果 dns 确定没有问题,可以试一下这个: https://stackoverflow.com/questions/64973164/why-does-a-web-app-container-access-mysql-container-within-the-same-docker-repor

  • 主 資深大佬 : AllenHua

    @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
    “`

  • 資深大佬 : zhangsanfeng2012

    @AllenHua 删掉 53 重定向也不行吗

  • 主 資深大佬 : AllenHua

    @zhangsanfeng2012 #48 当时是把那两条规则删掉了 不行 我新增了附言 层主有兴趣 我们可以 tg 私聊

  • 資深大佬 : OldCarMan

    @AllenHua 你估计没看全,只是第一项允许防火墙转发 NAT 跟你正文中提到的一样,后面还有两项配置(开启 IPv4 转发和允许数据包通过 docker bridge network )你可以设置一下,看看结果。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具