我拥有一个域名(以下称为example.com
),它是在 OVH 注册的。它有几个A
和MX
记录,所有记录都由 OVH 的 DNS 服务器正确提供。
我现在想委托home.example.com
给 上的主服务器 (PiHole) 192.168.10.2
。此 DNS 服务器处于活动状态并可正确提供许多记录。
为了委派子域名,我在example.com
DNS 区域添加了以下内容:
home IN NS ns-home.example.com.
ns-home IN A 192.168.10.2
OVH 会自动增加区域序列号。为了确保正确,我检查了它:
root@srv ~# dig @1.1.1.1 example.com SOA
example.com. 3600 IN SOA dns102.ovh.net. tech.ovh.net. 2024122001 86400 3600 3600000 60
2024122001
这是我在 OVH 上的 DNS 区域中看到的。因此,区域的新版本已部署。
问题:A
记录返回正确,但是NS
不是:
root@srv ~# dig @1.1.1.1 ns-home.example.com A
ns-home.example.com. 3600 IN A 192.168.10.2
dig @1.1.1.1 home.example.com NS
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; EDE: 22 (No Reachable Authority): (at delegation home.example.com.)
;; QUESTION SECTION:
;home.example.com. IN NS
这个答案是什么意思?还应该做什么来委托子域名?
我最终将NS
使用粘合记录将记录移动到本地名称服务器,现在我希望它在这个更简单的场景中工作
您所做的查询
NS
是递归1;这意味着响应不会来自 OVH 的委派记录 - 事实上,它会一直跟随委派并从您的 PiHole 返回区域内的 NS 记录。但是委托 NS 记录指向私有 IP 地址 192.168.10.2,而 CloudFlare 的 1.1.1.1 解析器无法访问该地址 - 因此它永远无法解析该委托背后的任何内容,其他任何公共解析器也无法解析。这就是第二个答案的意思;它意味着“1.1.1.1 无法联系 192.168.10.2 上的‘ns-home.example.com’”(ns-home 是“权威”)。
请记住:您指定使用的服务器
@
不仅仅是的“起点”dig
;它是为您完成所有委派追踪的服务器,而 dig 本身除了等待响应之外什么都不做 - 这也是您的操作系统处理 DNS 查询的方式。因此,对于委托人来说,仅拥有从客户端角度可访问的 A/AAAA 记录是不够的,还必须从解析器角度可访问。
因此,如果您完全确定解析器位于您自己的网络内部(例如,如果您的所有 PC 都查询您本地的 PiHole,并且 PiHole 运行 Unbound 或 BIND9 以在本地追踪委派而不依赖任何上游)–那么当然,您当前的设置可以工作,但您应该使用
dig @<pihole_ip>
而不是 来测试它dig @<random_public_resolver>
。但是,如果您希望使用任何公共服务器解析委派的子域(及其子子域),则必须将委派指向可公开访问的 IP 地址。您必须检查 PiHole 正在运行的 DNS 软件,它是否适合暴露在互联网上(即安全评估),从主 LAN 网关到 PiHole(对于 IPv4)设置 TCP/53 和 UDP/53 的“端口转发”,最后将
ns-home
A/AAAA 更改为指向您的公共IPv4 地址(和/或 PiHole 的公共 IPv6)。1查询已设置“所需递归”选项,这是 dig 的默认选项,也是您从 1.1.1.1 或其他解析器获取响应的唯一方法。
+norecurse
可以使用或关闭此选项+nordflag
,但必须直接针对权威服务器(即本身已拥有您域的 DNS 数据的服务器)进行非递归查询。如果您告诉“dig”在权威服务器上查询……那么指定+norecurse
就变得有点多余。因此,如果您想专门测试 OVH 是否正确发布了您的 NS 记录,您必须执行以下操作:
另外,可以遵循委派路径的工具:
dnstracer -s . home.example.com
delv [-i] +ns home.example.com
(
-i
抑制 DNSSEC 验证以获得更简约的输出)dig +trace home.example.com
(可能不太准确)