无法解析本地域的 CNAME

无法解析本地域的 CNAME

我的局域网上有一个服务器,我想使用公共域名访问它,但它只能在我的本地网络内访问。

为此,我在我的域名 ( example.org) 上添加了一个 CNAME 记录来myserver.example.org指向myserver.fritz.box

在我的主机上,这可以完美运行,但是在主机上运行的docker容器内,我无法解析CNAME。

在我的主机上解析:

host# dig myserver.example.org 

; <<>> DiG 9.16.1-Ubuntu <<>> myserver.example.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49974
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;myserver.example.org.      IN  A

;; ANSWER SECTION:
myserver.example.org.   0   IN  CNAME   myserver.fritz.box.
myserver.fritz.box. 9   IN  A   192.168.178.155

;; Query time: 20 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sa Jul 01 16:54:58 CEST 2023
;; MSG SIZE  rcvd: 116

在容器内解析。我尝试了一个空白的 ubuntu 和 debian 基础映像,但在这两个映像中,我都只收到了响应NXDOMAIN

container# dig myserver.example.org 

; <<>> DiG 9.18.16 <<>> myserver.example.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 177
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;myserver.example.org.      IN  A

;; ANSWER SECTION:
myserver.example.org.   0   IN  CNAME   myserver.fritz.box.

;; AUTHORITY SECTION:
box.            1823    IN  SOA ns0.centralnic.net. hostmaster.centralnic.net. 1688220651 900 1800 6048000 3600

;; Query time: 4 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Sat Jul 01 14:57:46 UTC 2023
;; MSG SIZE  rcvd: 149

这也导致我无法从容器内部 ping 服务器:

container# ping myserver.example.org
ping: bad address 'myserver.example.org'

请注意,在容器内部手动对本地域名进行另一个查询也可以正常工作。

container# dig myserver.fritz.box

; <<>> DiG 9.18.16 <<>> myserver.fritz.box
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2636
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 3

;; QUESTION SECTION:
;myserver.fritz.box.        IN  A

;; ANSWER SECTION:
myserver.fritz.box. 9   IN  A   192.168.178.155

;; AUTHORITY SECTION:
myserver.fritz.box. 9   IN  NS  fritz.box.

;; ADDITIONAL SECTION:
fritz.box.      9   IN  A   192.168.178.1
fritz.box.      9   IN  AAAA    fd00::cece:1eff:fef4:c4db
fritz.box.      9   IN  AAAA    2a01:c22:d145:6900:cece:1eff:fef4:c4db

;; Query time: 252 msec
;; SERVER: 127.0.0.11#53(127.0.0.11) (UDP)
;; WHEN: Sat Jul 01 14:58:27 UTC 2023
;; MSG SIZE  rcvd: 158

为什么会有这种差异?

docker 的 DNS 服务器难道不应该127.0.0.11简单地将请求转发到127.0.0.53主机上,让一切正常吗?


可能相关

我发现,如果我明确使用路由器的 DNS 服务器,而不是使用 resolvectl,我的主机上也会出现同样的问题127.0.0.53。我也不明白为什么会发生这种情况。

host# dig @fritz.box myserver.example.org 

; <<>> DiG 9.16.1-Ubuntu <<>> @fritz.box myserver.example.org
; (3 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 13570
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;myserver.example.org.      IN  A

;; ANSWER SECTION:
myserver.example.org.   0   IN  CNAME   myserver.fritz.box.

;; AUTHORITY SECTION:
box.            1641    IN  SOA ns0.centralnic.net. hostmaster.centralnic.net. 1688220651 900 1800 6048000 3600

;; Query time: 8 msec
;; SERVER: 2a01:c22:d145:6900:cece:1eff:fef4:c4db#53(2a01:c22:d145:6900:cece:1eff:fef4:c4db)
;; WHEN: Sa Jul 01 17:00:48 CEST 2023
;; MSG SIZE  rcvd: 149

答案1

fritzbox 使用 fritz.box 作为本地域。

如果你询问你的 fritzbox 的解析器,你会得到这样的答案:

;; AUTHORITY SECTION:
myserver.fritz.box. 9   IN  NS  fritz.box.

这意味着 fritzbox 认为自己拥有 .box 域名的权威。

但正如我们从其他解析器的答案中看到的那样,如果我们真的与互联网上的公共 DNS 对话,我们会得到这样的响应:

;; AUTHORITY SECTION:
box.            1641    IN  SOA ns0.centralnic.net. hostmaster.centralnic.net. 1688220651 900 1800 6048000 3600

那是因为。盒子是一个有效的顶级域名!

使用# dig myserver.example.org询问您的本地解析器。通常,如今本地解析器位于systemd-resolved较新的 Linux 上。它是一个缓存解析器,您可以使用 检查它resolvectl statistics,并可以使用 清空缓存resolvectl flush-caches。我的第一个猜测是缓存答案,但它实际上适用于空缓存。这意味着它在遇到它后会再次单独请求myserver.fritz.box,否则它不会解析。它得到答案是因为它向 fritzbox 询问 .box 域。

可以看到,resolvectl status有一个DNS Domain: fritz.box设置。它可能通过 DHCP 获得该设置,但可以通过编辑/etc/systemd/resolved.conf或在命令行上手动设置。请参阅man resolvectlman systemd.network。还有docker 的设置。通常,该搜索域设置意味着将该域放在缺少域部分的空白主机名上。可能systemd-resolved其配置的搜索域的行为方式很特殊。

直接使用dig @fritz.box myserver.example.org询问名称服务器@fritz.box,绕过本地缓存和为本地操作系统解析器配置的设置。显然,fritzbox DNS 解析器只询问互联网上的 DNS,而不会在第二步解析其本地域。

我得出这个结论是因为的输出@fritz.box与例如@1.1.1.1或任何其他公共 DNS 服务器的输出相同。

一旦涉及真实 DNS 服务器,它们就会尝试myserver.fritz.box在公共 DNS 中解析并失败。

由于无法在 Web 界面中配置 fritzbox 的 DNS 名称,因此唯一真正的解决方案是:

  • 要向 AVM 提交错误报告,他们应该使用不存在的顶级域名,.local这是有原因的吗?

  • 或使用另一个允许配置详细信息的局域网 DNS 设备。

相关内容