我的局域网上有一个服务器,我想使用公共域名访问它,但它只能在我的本地网络内访问。
为此,我在我的域名 ( 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 resolvectl
和man 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 设备。