V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
AllenHua
V2EX  ›  Linux

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

  •  1
     
  •   AllenHua · 2021-04-12 08:54:50 +08:00 · 7603 次点击
    这是一个创建于 1340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原帖发在了恩山,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
    
    第 1 条附言  ·  2021-04-12 09:50:14 +08:00

    docker 默认提供三种网络模式

    1. host
    2. bridge
    3. none

    楼主测试的都是使用的 bridge 桥接网络,宿主机创建了 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)

    使用默认的网络模式 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 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通域名,容器内访问外网正常了

    第 2 条附言  ·  2021-04-12 09:52:54 +08:00

    且这三种网络模式 不可删除

    刚刚格式出了点问题,重新发下

    宿主机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'
    
    第 3 条附言  ·  2021-04-12 10:42:46 +08:00

    在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

    下面是楼主机器上的

    20210412104152.png

    此图文本链接:https://paste.ubuntu.com/p/jS8QCM4nvx/

    感觉明明知道是 iptables 防火墙问题但不懂怎么解决 sigh

    第 4 条附言  ·  2021-04-12 19:15:56 +08:00
    十分感谢各位热心大佬的回复,特别感谢 32 楼兄弟跟我追踪问题

    楼主来更新一下进展:后面通过 wireshark 抓包,分析 dns icmp,发现可能是容器内部发起的 ping 请求 icmp 包一开始就被 docker 劫持了,导致后面 port unreachable

    这个固态硬盘暂时搁置 系统还在里面 以后有空再研究

    后面重新刷了一个 openwrt 固件(另外一块 ssd 上):sirpdboy 的固件,就没有这个问题,一进入容器即可 ping 通外网域名和 ip,根本不需要配置 防火墙……
    但这个固件的 /etc/init.d/dockerd 启动脚本有问题 start 都 start 不了,改了一些 shell 代码后 可以 启动了 但是自启(/etc/init.d/dockerd enable )始终不行

    谢谢大家
    50 条回复    2021-04-12 21:56:03 +08:00
    wunsch0106
        1
    wunsch0106  
       2021-04-12 08:59:19 +08:00
    修改下 dns
    AllenHua
        2
    AllenHua  
    OP
       2021-04-12 09:04:46 +08:00
    @wunsch0106 #1 改成了 223.5.5.5 180.76.76.76 8.8.8.8 这种公共 dns 都没成功

    感觉是防火墙问题
    cpstar
        3
    cpstar  
       2021-04-12 09:08:10 +08:00
    你那个 echo 相当于本地解析,所以 archive.ubuntu.com 肯定成功
    判断的方法很简单,关掉防火墙,如果立马正常,那就是防火墙的问题。
    加一条 udp53 的端口放行。但是定义了 wan 和 lan,默认 lan->wan 不拦截。
    codehz
        4
    codehz  
       2021-04-12 09:09:15 +08:00 via Android
    你用 nslookup/dig 测试 dns,别用 ping 测试域名,根本不是一个用途的
    cpstar
        5
    cpstar  
       2021-04-12 09:12:58 +08:00
    原帖说的网络结构比本贴复杂啊
    先找个外网的 IP,测试路由是否通顺,别 docker 里的数据包路由上就不带转发的。
    然后网络结构略复杂,一层 NAT 就是一层损耗,想办法缩减一下结构吧。
    AllenHua
        6
    AllenHua  
    OP
       2021-04-12 09:22:17 +08:00
    @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
        7
    AllenHua  
    OP
       2021-04-12 09:23:37 +08:00
    @cpstar #5 房东的路由器 我也没法拆 只能这样了吧,我自己还要在路由上搭建服务 于是只能 docker 内部 192.168.20.x -> 到我的路由器 10.10.10.1 再到房东的 192.168.1.1 然后出去
    AllenHua
        8
    AllenHua  
    OP
       2021-04-12 09:24:32 +08:00
    @cpstar #3 昨晚尝试 关掉了防火墙 /etc/init.d/firewall stop 整个网络都不行了 /捂脸
    codehz
        9
    codehz  
       2021-04-12 09:26:14 +08:00 via Android
    dig 强制指定一个 dns 试试看
    dig @8.8.8.8 g.cn +trace
    AllenHua
        10
    AllenHua  
    OP
       2021-04-12 09:33:13 +08:00
    @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
        11
    oluoluo  
       2021-04-12 09:34:16 +08:00
    `iptables -A INPUT -p udp --dport 53 -j ACCEPT` 加个这个访问规则可不可以呢
    AllenHua
        12
    AllenHua  
    OP
       2021-04-12 09:44:18 +08:00
    @oluoluo #11 还是不可以 感谢。我附言一下最新“进展”
    xuanbg
        13
    xuanbg  
       2021-04-12 09:58:10 +08:00
    没有复杂网络需求的,容器一律使用宿主机网络,也就是 host 。
    codehz
        14
    codehz  
       2021-04-12 09:58:11 +08:00 via Android
    看起来是 udp 53 连接被阻止了,试试+tcp 的选项(附加到后面,另外多测试几种 dns 服务器,难说是抽风了)
    应该就是防火墙的配置问题(((
    AllenHua
        15
    AllenHua  
    OP
       2021-04-12 10:08:48 +08:00
    @xuanbg #13 好的 谢谢
    @codehz #14 感觉是 iptables 配置的问题

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

    https://www.cnblogs.com/wangxu01/articles/11316447.html 参考这个 感觉复杂 头大🤦🏻‍♂️
    Jirajine
        16
    Jirajine  
       2021-04-12 10:17:16 +08:00 via Android
    docker 的网络模式命名非常迷惑人,这个“bridge”模式在其他虚拟机等类似情况下都叫“nat 模式”,而对应传统虚拟机的 bridge 模式在 docker 里是 macvlan (类似但不同),而真正的 bridge 模式 docker 并不支持。
    cpstar
        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 ?有点怪。。。
    AllenHua
        18
    AllenHua  
    OP
       2021-04-12 11:07:38 +08:00
    @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 不通域名
    bowser1701
        19
    bowser1701  
       2021-04-12 11:07:56 +08:00
    试试 `dig @119.29.29.29 baidu.com` 和 `dig baidu.com` 比较一下看看是不是本地的 DNS server 出问题了。
    zhangsanfeng2012
        20
    zhangsanfeng2012  
       2021-04-12 11:10:24 +08:00
    你的路由器是 openwrt,那你 openwrt 中能 ping 通域名吗?你的 docker 装在 openwrt 的机子里面?
    AllenHua
        21
    AllenHua  
    OP
       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
        22
    AllenHua  
    OP
       2021-04-12 11:24:44 +08:00
    @zhangsanfeng2012 #20 是的 docker 安装在 openwrt 里。openwrt 中可以 ping 通域名的,我现在各个设备上网都是没问题的呀
    mlcq
        23
    mlcq  
       2021-04-12 11:39:48 +08:00
    能 ping 通 ip,ping 不同域名,还是 dns 解析的问题
    bowser1701
        24
    bowser1701  
       2021-04-12 11:40:30 +08:00
    @AllenHua 你是在 container 里面 dig 的嘛,我意思是可以测试下你的容器里的 DNS server
    caicaiwoshishui
        25
    caicaiwoshishui  
       2021-04-12 11:43:34 +08:00 via iPhone
    我的 openwrt 不能访问国内,全局就能访问,ping
    不同 baidu.com ,不知道怎么处理,哪里有问题。
    Openwrt 用了 adgurd home 但是注释了防火墙转 53 的规则。
    cpstar
        26
    cpstar  
       2021-04-12 11:50:12 +08:00
    18# ,感觉那个接受入站,应该是接受出站。入站成了外网访问你的 53,而不是你的子网要访问外边的 53 。

    然后,合并 @caicaiwoshishui 的问题,openwrt 内置了很多个 dns 有关的服务,我当时是从 53 端口(查看监听程序),一个一个往上捋,adguard 、smartdns,还有几个,一个一个挨个关闭,各种拦截广告、防止 DNS 污染的,是好事,但也挺闹心,比如某些依赖或者看似广告网址的,无故被拦截,然后导致 APP 应用功能不能用,最后关掉各种 DNS 过滤器,一下子好了。
    AllenHua
        27
    AllenHua  
    OP
       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
        28
    zhangsanfeng2012  
       2021-04-12 11:57:00 +08:00 via Android
    openwrt 里面抓下包看看,tcpdump -i docker0 -w /tmp/test.pcap,然后在容器里面 dig 一下
    wunsch0106
        29
    wunsch0106  
       2021-04-12 12:02:31 +08:00
    ping localhost 试一下 还是 bad address 那肯定就是 dns 问题了, /etc/resolv.conf 配置了可能没生效把。
    cpstar
        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 畅通的有效办法
    AllenHua
        31
    AllenHua  
    OP
       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
        32
    lcdtyph  
       2021-04-12 12:53:23 +08:00
    排除一下 53 端口的问题
    dig www.baidu.com @202.141.162.123 -p5353
    能正常查询么
    AllenHua
        33
    AllenHua  
    OP
       2021-04-12 12:55:06 +08:00
    @lcdtyph #32 能!大佬🐂️ 能继续分析一下吗
    AllenHua
        34
    AllenHua  
    OP
       2021-04-12 12:55:33 +08:00
    @lcdtyph #32 udp 53 端口 被防火墙阻断了吗
    lcdtyph
        35
    lcdtyph  
       2021-04-12 12:59:01 +08:00
    @AllenHua #34
    看上去是的了,openwrt 上有安装 clash 类的工具么?

    在此之前先看一下换个 dns 能不能返回结果吧,8888 有的地方直接封了
    dig <domain> @202.141.162.123
    AllenHua
        36
    AllenHua  
    OP
       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
        37
    lcdtyph  
       2021-04-12 13:36:43 +08:00 via iPhone
    @AllenHua
    对,是中科大 dns,因为有非标准端口方便调试
    找个地方把 iptables -vnL 和 iptables -t nat -vnL 和 iptables -t mangle -nvL 贴出来看看吧
    AllenHua
        38
    AllenHua  
    OP
       2021-04-12 13:45:54 +08:00
    @lcdtyph #37 能通过 tg 沟通一下吗 🐶️ base64 encoded: aHR0cHM6Ly90Lm1lL2FsbGVuaHVh
    cpstar
        39
    cpstar  
       2021-04-12 13:48:34 +08:00
    #36 是吧,一堆自带的看起来方便但是各种卸载很闹心的应用,反而使使用变得麻烦。不用就卸载吧,一个一个全卸载干净。

    看一下 UDP53 谁监听了,netstat -unlp,然后看配置做了什么上游 DNS,然后顺藤摸瓜。
    AllenHua
        40
    AllenHua  
    OP
       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 的 四表五链不是很懂(啊 摔!
    AllenHua
        41
    AllenHua  
    OP
       2021-04-12 13:59:53 +08:00
    @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
        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
    joyhub2140
        43
    joyhub2140  
       2021-04-12 14:35:18 +08:00
    我貌似遇到这个问题,容器内 DNS 解析的问题,都是和防火墙有关的,因为 docker 的 iptable 规则是独立于管理者自己设置的规则的,不能被 admin 统筹管理端口开放规则,建议防火墙的前端不要采用 nftables,直接采用 iptables,这样子就可以使用了,另外关于 docker 的防火墙规则,建议还要依靠外部的防火墙实施端口隔离吧,搞本季内部的防火墙很容易导致冲突。
    joyhub2140
        44
    joyhub2140  
       2021-04-12 14:38:31 +08:00
    docker run -it --net=host --rm alpine /bin/ash

    这个是有比较大风险的,相当于无视 docker 容器的网络隔离特性,一下子把那个容器的网络提升至最高,理论上它可以访问任何运行中的容器。
    magua
        45
    magua  
       2021-04-12 15:29:01 +08:00
    有试过修改容器内的 dns 服务器的 ip 吗?我之前在 k8s 的 pod 中也遇到过类似的问题,修改容器内的 dns 好了。
    OldCarMan
        46
    OldCarMan  
       2021-04-12 17:30:57 +08:00
    AllenHua
        47
    AllenHua  
    OP
       2021-04-12 19:08:35 +08:00
    @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
        48
    zhangsanfeng2012  
       2021-04-12 19:14:08 +08:00
    @AllenHua 删掉 53 重定向也不行吗
    AllenHua
        49
    AllenHua  
    OP
       2021-04-12 19:17:27 +08:00
    @zhangsanfeng2012 #48 当时是把那两条规则删掉了 不行 我新增了附言 层主有兴趣 我们可以 tg 私聊
    OldCarMan
        50
    OldCarMan  
       2021-04-12 21:56:03 +08:00
    @AllenHua 你估计没看全,只是第一项允许防火墙转发 NAT 跟你正文中提到的一样,后面还有两项配置(开启 IPv4 转发和允许数据包通过 docker bridge network )你可以设置一下,看看结果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5509 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 02:44 · PVG 10:44 · LAX 18:44 · JFK 21:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.