cam0
我想使用我选择的名称访问家庭局域网上的某些设备,而无需运行自己的名称服务器。例如,我想使用或 之类的名称访问我的 WiFi 摄像头cam0.mydomain.com
,这些名称将映射到其本地不可路由地址(例如 192.168.2.128)。
我曾经使用 Google Domains 提供的 DNS 创建指向 192.168.2.128 的 A 记录来执行此操作,但不幸的是,Google Domains DNS 最近停止返回不可路由的地址,因此这不再起作用。[@grawity 在下面指出,本地路由器更有可能丢弃响应,因此这可能是由于自动固件更新造成的。]
我的大多数设备都使用 DHCP 主机名,而我的家用路由器 (Google WiFi) 提供.lan
域名按名称查找功能。例如,我可以使用 查找我的相机dcs-930l.lan
。因此,我尝试将 DNS A 记录更改为指向 的 CNAME 记录dcs-930l.lan
。
这在我的 macOS Mojave 机器上运行良好;我可以 ping cam0.mydomain.com
。但它在我的 Debian Jessie 盒子上不起作用,即使我可以查找cam0.mydomain.com
和dcs-930l.lan
:
$ dig cam0.mydomain.com
; <<>> DiG 9.10.3-P4-Debian <<>> cam0.mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 3641
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;cam0.mydomain.com. IN A
;; ANSWER SECTION:
cam0.mydomain.com. 3291 IN CNAME dcs-930l.lan.
;; AUTHORITY SECTION:
. 86396 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2019090100 1800 900 604800 86400
;; Query time: 24 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Sun Sep 01 06:43:23 PDT 2019
;; MSG SIZE rcvd: 149
$ dig dcs-930l.lan
; <<>> DiG 9.10.3-P4-Debian <<>> dcs-930l.lan
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54112
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dcs-930l.lan. IN A
;; ANSWER SECTION:
dcs-930l.lan. 0 IN A 192.168.2.128
;; Query time: 6 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Sun Sep 01 06:43:49 PDT 2019
;; MSG SIZE rcvd: 69
$ ping cam0.mydomain.com
ping: cam0.mydomain.com: Name or service not known
cam0.mydomain.com
由于同样的原因,我无法在运行 Oreo 的 Android 手机上使用。
我的问题:
为什么此 CNAME 查找本地名称在 Mac 上有效而在 Linux 或 Android 上无效?
这是否属于 DNS 的滥用?
如何在不更改 DNS 提供商或运行我自己的名称服务器的情况下使用描述性名称进行本地设备查找?
根据评论中的要求,Linux 查找-t AAAA
:
$ dig -t AAAA cam0.mydomain.com
; <<>> DiG 9.10.3-P4-Debian <<>> -t AAAA cam0.mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 62152
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;cam0.mydomain.com. IN AAAA
;; ANSWER SECTION:
cam0.mydomain.com. 3599 IN CNAME dcs-930l.lan.
;; AUTHORITY SECTION:
. 86343 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2019090100 1800 900 604800 86400
;; Query time: 61 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Sun Sep 01 07:49:46 PDT 2019
;; MSG SIZE rcvd: 149
$ dig -t AAAA dcs-930l.lan
; <<>> DiG 9.10.3-P4-Debian <<>> -t AAAA dcs-930l.lan
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 25898
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dcs-930l.lan. IN AAAA
;; Query time: 3 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Sun Sep 01 07:51:19 PDT 2019
;; MSG SIZE rcvd: 41
OS X 的运行结果如下:
$ dig cam0.mydomain.com
; <<>> DiG 9.10.6 <<>> cam0.mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 21591
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;cam0.mydomain.com. IN A
;; ANSWER SECTION:
cam0.mydomain.com. 2871 IN CNAME dcs-930l.lan.
;; AUTHORITY SECTION:
. 86378 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2019090100 1800 900 604800 86400
;; Query time: 24 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Sun Sep 01 08:01:55 PDT 2019
;; MSG SIZE rcvd: 149
$ dig dcs-930l.lan
; <<>> DiG 9.10.6 <<>> dcs-930l.lan
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20258
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dcs-930l.lan. IN A
;; ANSWER SECTION:
dcs-930l.lan. 0 IN A 192.168.2.128
;; Query time: 3 msec
;; SERVER: 192.168.2.1#53(192.168.2.1)
;; WHEN: Sun Sep 01 08:02:07 PDT 2019
;; MSG SIZE rcvd: 69
$ ping cam0.mydomain.com
PING dcs-930l.lan (192.168.2.128): 56 data bytes
64 bytes from 192.168.2.128: icmp_seq=0 ttl=64 time=214.733 ms
64 bytes from 192.168.2.128: icmp_seq=1 ttl=64 time=9.367 ms
--- dcs-930l.lan ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 9.367/112.050/214.733/102.683 ms
答案1
为什么此 CNAME 查找本地名称在 Mac 上有效而在 Linux 或 Android 上无效?
至少一.lan
您的问题之一是您的DNS 服务器存在错误:
$ 挖 dcs-930l.lan ;; ->>HEADER<<- 操作码:QUERY,状态:NOERROR,id:54112 ;; 标志:qr aa rd ra;查询:1,答案:1,权限:0,附加:1 ;; 答案部分: dcs-930l.lan.0 在 192.168.2.128
$ dig -t AAAA dcs-930l.lan ;; ->>HEADER<<- 操作码:QUERY,状态:NXDOMAIN,id:25898 ;; 标志:qr aa rd ra;查询:1,答案:0,权限:0,附加:1
第一个查询返回此名称的一些记录,这意味着第二个查询不能返回 NXDOMAIN,因为该名称显然存在。如果无论如何都返回了 NXDOMAIN,则允许客户端缓存所有记录类型的否定响应 - 覆盖任何先前缓存的肯定响应。
因此,如果您的系统仅查询 A 记录,则一切正常。但如果系统首先查询 AAAA 记录并缓存 NXDOMAIN 响应,它甚至不会费心稍后检查 A,因为它被告知该域不存在。
(正确的响应应该是“状态:无错误”,但答案部分没有项目。)
这是否属于 DNS 的滥用?
私有 IPv4 直接在公共 DNS 域中 - 当然不是一般意义上的滥用。尽管如此,它经常被阻止,因为它是可受到攻击者的虐待。
CNAME — 可能不是;但是,即使在工作情况下,我也不确定指向内部名称的 CNAME 应该如何解析。
如何在不更改 DNS 提供商或运行我自己的名称服务器的情况下使用描述性名称进行本地设备查找?
确保问题确实出在 DNS 提供商上,而不是 DNS 解析器上。
如今,许多路由器都内置了解析器,这些解析器会故意阻止任何“私有”IP 地址出现在外部域名的响应中,以防范 DNS“重新绑定”攻击。(也就是说,Google Domains 更有可能做返回“foo.mydomain.com. A 192.168.2.128”而没有任何抱怨,但路由器的 DNS 解析器删除了该响应。)