Docker 无法解析 Docker 网络之外的 DNS 名称。收到“从 DNS 服务器读取失败”

Docker 无法解析 Docker 网络之外的 DNS 名称。收到“从 DNS 服务器读取失败”

我已经部署了一个 Adguard Home docker 容器,我想将其用作我的 DNS 服务器/代理。当我从本地网络上的机器(以及 docker 主机)进行 nslookup 时,DNS 解析工作正常。(成功解析本地和外部 dns 名称)

但是,当从容器内部进行 nslookup 时,会返回以下消息:

;; connection timed out; no servers could be reached

如果我查看 docker 守护进程日志(在调试模式下),我会看到此消息

Aug 13 22:56:27 host dockerd[641]: time="2020-08-13T22:56:27.646666208+02:00" level=debug msg="Name To resolve: host.local."
Aug 13 22:56:27 host dockerd[641]: time="2020-08-13T22:56:27.647142480+02:00" level=debug msg="[resolver] query host.local. (A) from 172.22.0.4:32939, forwarding to udp:192.168.178.39"
Aug 13 22:56:27 host dockerd[641]: time="2020-08-13T22:56:27.756187183+02:00" level=debug msg="[resolver] read from DNS server failed, read udp 172.24.0.2:56565->192.168.178.39:53: i/o timeout"

在 adguard home 的日志中没有发现任何明显问题。所有请求(包括与容器内请求的时间戳相匹配的请求)都得到了答复,并返回了正确的地址。

为了制作 nslookup,我使用了 busybox 容器(我可以 ping adguard 容器):

docker run --network=adguardhome_default busybox nslookup -debug -type=A host.local

我在 raspian 10 上运行 docker。Docker 版本是 19.03.12。Docker-compose 版本是 1.21.0。

到目前为止我尝试了一些方法,包括:

  • 在 /etc/docker/daemon.json 中设置 DNS
  • 使用 --DNS 选项设置 DNS
  • 在撰写文件中设置 DNS
  • 编辑容器 resolv.conf
  • 重置 docker 桥接

似乎嵌入式 docker DNS 无法理解 adguard 服务的响应,或者其行为不符合我的预期。我非常感谢您的帮助,希望我提供了足够的细节。

我尝试使用参数--dns-opt=use-vc强制使用 dns over tcp,就像建议的那样这里。使用的选项反映在容器的 resolv.conf 中,但似乎没有任何效果/不被遵守。请求仍然使用 UDP 发出。

主机的 resolv.conf:

# Generated by resolvconf
domain fritz.box
nameserver 192.168.178.39

容器的resolv.conf:

nameserver 127.0.0.11
options ndots:0

adguard 的 docker-compose 文件:

version: '3.2'
services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    restart: unless-stopped
    ports:
      - 53:53/tcp
      - 53:53/udp
        #- 67:67/udp
        #- 68:68/tcp
        #- 68:68/udp
      - 853:853/tcp
      - 3000:3000/tcp
    volumes:
      - type: volume
        source: data
        target: /opt/adguardhome/work
      - type: volume
        source: config
        target: /opt/adguardhome/conf

volumes:
  data:
  config:

adguard DNS 服务器:

192.168.178.1
tcp://192.168.178.1

答案1

我有完全相同的问题。dockerized adguard 完美适用于除托管在同一 Raspberry 上的其他 docker 之外的所有事物。

从另一个 docker,我可以 ping adguard,我可以访问端口 53。从调试中的 adguard,我看到请求进来,我没有看到错误,但没有响应返回 docker。

奇怪的是,在 Adguard 的日志中,我看到它正确处理了我的 DNS 请求,但客户端 IP 地址不是来自原始 docker,而是 adguard 本身的 IP。

最后,如果它尝试使用 google DNS 进行 nslookup,它可以完美运行。

据我了解,adguard 服务器似乎正在其自己的 IP 上而不是原始源 IP 上回答 DNS 请求。

编辑:我已经能够通过在所有 docker 上使用 macvlan 网络来解决我的问题。

相关内容