Docker 嵌入式 DNS 在進行反向 ns 查找時傳回截斷的域名

Docker 嵌入式 DNS 在進行反向 ns 查找時傳回截斷的域名

我一直在嘗試在容器內設定網域並檢查嵌入式 Docker DNS 如何處理這些設定。但令我驚訝的是,在進行反向 ns 查找時,我只得到了一個截斷的網域。

我將 fqdn 設定為容器內的ldec<i>.n18.org 命令按預期返回我,ping按預期工作,並且 fqdn 正確解析。hostname --fqdnldec1.n18.orgping ldec1.n18.org

但是,如果我進行反向 ns 查找,例如dig -x <container_ip>,我總是會返回一個截斷的域名,例如ldec3.n18而不是ldec3.n18.org

root@ldec3:/# dig -x 172.18.0.4

; <<>> DiG 9.16.37-Debian <<>> -x 172.18.0.4 
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21081
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;4.0.18.172.in-addr.arpa.       IN      PTR

;; ANSWER SECTION:
4.0.18.172.in-addr.arpa. 600    IN      PTR     ldec3.n18.

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Mon Apr 17 18:59:38 UTC 2023
;; MSG SIZE  rcvd: 87

那為什麼 dig 回傳一個被截斷的網域呢?

建構影像

docker build --tag=debian:11-lde - <<EOF
FROM debian:11

ARG DEBIAN_FRONTEND=noninteractive 

ENV APT_CMD="apt-get install -y --no-install-recommends"
# SHELL ["/bin/bash", "-x", "-c"]

RUN echo "===> Add tools..."  \
  && apt-get update  \
  && apt-get install -y --no-install-recommends \
    iputils-ping bind9-dnsutils lsof \
    openssh-*   \
    wget curl  \
    iptables whois iproute2 net-tools \
    vim less sudo bash-completion patch \
    ca-certificates \
  && apt-get autoremove -y \
  && echo OK
EOF

在同一網路上啟動 3 個容器

docker network create --driver=bridge n18 --subnet=172.18.0.0/24 || true

for i in $(seq 1 1 3)
do
  docker rm -f "ldec${i}" || true
  declare domain="n18.org"
  docker run --interactive --tty --detach --rm --name "ldec${i}" \
            --network=n18 --hostname="ldec${i}.${domain}" \
            --dns="8.8.8.8" \
            debian:11-lde
done

答案1

為了回答我自己的問題,我使用 Podman V3 以及 dnsname 外掛程式和主機上的 dnsmasq 進行了測試,最後我得到了我所期望的結果

...
;; QUESTION SECTION:
;4.0.5.192.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
4.0.5.192.in-addr.arpa. 0       IN      PTR     ldec3.newnet.podman.
...

因此,Docker 的內部DNS 似乎有一種非常具體/固執的方式來回答反向DNS 請求,如果您需要更傳統的DNS 行為,以測試處理網路配置等的ansible 角色...,您可能最好使用Podman V3或嘗試分流 Docker 的內部 DNS 並使用 dnsmasq 或 bind9 之類的東西。

另請檢查 SO 上的相關線程,其中解釋了:如何-i-給-docker-containers-access-a-dnsmasq-local-dns-resolver-on-the-h

編輯2:Docker 的嵌入式 DNS

自訂網路內的主機上的反向 DNS 查詢是“特殊的”,而 Docker 不會讓您停用其嵌入式 DNS(可追溯至 2017 年):

因此,到 2023 年,您仍然可以使用 /etc/resolv 和 /etc/hosts 來解決問題,或修補程式碼以停用 ES。

相關內容