![DNS 记录包含 0.0.0.0 地址](https://linux22.com/image/698313/DNS%20%E8%AE%B0%E5%BD%95%E5%8C%85%E5%90%AB%200.0.0.0%20%E5%9C%B0%E5%9D%80.png)
长话短说。
dig c.cx
返回
; <<>> DiG 9.11.0-P2 <<>> c.cx
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32806
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;c.cx. IN A
;; ANSWER SECTION:
c.cx. 6903 IN A 0.0.0.0
;; Query time: 90 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Mon Feb 06 22:33:08 +03 2017
;; MSG SIZE rcvd: 49
即地址0.0.0.0
。
问题:
- 有什么特殊含义吗?
- 这是合法的吗(DNS记录可以包含的地址有什么限制吗)?
答案1
这是合法的(见RFC1035§3.4.1),但毫无用处(因为它的意思是“任何 IP”)。至于含义,请看Zoneedit 常见问题解答 (顺便说一下,这是错误的,没有强制要求域名本身必须有 A 记录,恰恰相反,所有 MTA 都可以使用 MX 记录):
- 为什么我无法删除我的域名根名称的“A”记录?
所有域名都必须具有域名根目录的“A”记录。省略此“A”记录可能会导致某些邮件服务器无法正确递送您的电子邮件。WebParking 或 WebForwarding 域名根目录就足够了,因为这两者都会创建指向我们服务器的隐藏“A”记录。如果您确实想删除此记录,请尝试将 IP 地址更改为“0.0.0.0”,其功能相同。
答案2
著名的案例是域名注册商 epik 用它来关闭 parler.com
$ dig @NS3.EPIK.COM parler.com
; <<>> DiG blah blah blah <<>> @NS3.EPIK.COM parler.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43362
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;parler.com. IN A
;; ANSWER SECTION:
parler.com. 300 IN A 0.0.0.0
结果是从本地网络服务器提供错误页面。
答案3
目前关于 0.0.0.0 有很多错误信息流传,因此请务必仔细阅读定义,寻找权威来源,并得出自己的结论。
官方含义/官方用途
IANA 拥有对 IP 地址的管理权,已保留 0.0.0.0/32因为它的定义是RFC 1122 第 3.2.1.3 节。RFC 1122 仅涉及低级协议(IP 本身)。RFC 将其描述为“此网络上的此主机”,并禁止将其用作目标地址(在线):
(a) { 0, 0 } This host on this network. MUST NOT be sent, except as a source address as part of an initialization procedure by which the host learns its own IP address.> See also Section 3.3.6 for a non-standard use of {0,0}.
RFC 5735 中也提到了这一点。
所以理论上它不应该用于其他任何用途!
非官方用途-内部操作系统(Linux)
如果 Linux 上的程序尝试连接到 0.0.0.0,它将连接到自身(本地主机)。我不确定其他操作系统是否这样做。
严格来说,作为 IANA 保留的 IP 地址,这可能不符合标准。然而,这种行为非常古老,甚至可以追溯到早期Berkly 插座于 1983 年推出 (我不知道). 它的命名似乎也与 RFC 1122 定义相对接近This host on this network
。
确切地说:
非官方用途 - DNS
最近,一些 DNS 服务器和服务器软件开始使用 0.0.0.0 作为黑洞地址。这种用法越来越普遍,但也存在一些问题,包括:
- 它直接与预订的IANA / RFC 定义。它甚至似乎没有尊重名称的原始含义,更不用说功能了。
- 当主机被告知连接到 0.0.0.0 时,似乎没有标准化的定义。因此,这依赖于未指定的行为。
- 它并不总是导致黑洞。在某些设备上,它会导致本地主机连接。实际连接到某个东西的结果可能是不理想的。
这合法吗? - 这很复杂
DNS 没有明确禁止它;不在RFC 1035或者RFC 1034无论如何。这意味着 DNS 服务器和客户端不太可能直接拒绝它。
但请注意。定义什么是有效的资源 IP 地址,什么不是有效的资源 IP 地址,并不是 DNS 标准的工作。这通常超出了 DNS RFC 的范围。DNS 仅定义如何传达名称 <--> IP 映射。仅仅因为 DNS 能够传达非法的名称 --> IP 映射,并不意味着它是合法的。
由于 0.0.0.0 是 IP 下的非法目标地址,因此很难看出它怎么可能成为存储在网络 DNS 服务器上的“合法”资源 IP 地址。
我相信,定义什么不是有效的资源 IP 的最终责任将在于 IANA 和其他网络 RFC 之间。
结论
我个人认为馊主意将任何 DNS 配置为指向 0.0.0.0。我曾见过由此导致的不良行为,如果不更改 DNS 资源记录,则很难缓解这种情况。
我个人会使用 IANA / RFC 分配的“localhost”IP 范围之一,这个范围非常少见(例如 127.253.252.251)。至少如果它实际连接到 localhost,则将其定义为 localhost,而不是 0.0.0.0。但这只是我个人的看法。
答案4
IP 地址“0.0.0.0”是一个黑洞地址,会导致查找无果。这在内部网络和外部网络共享同一域名的拆分 DNS 场景中可能非常有用。您可能有一个指向您网站的通配符 DNS 条目(似乎很合理),但您组织的一台笔记本电脑尝试连接到“fileserver.contoso.com”,并缓存主网站 IP,因为通配符返回了它。
将 fileserver.contoso.com 添加到指向 0.0.0.0 的外部 DNS 将停止缓存地址。因此,当您重新连接到 VPN(并返回内部网络)时,fileserver.contoso.com 仍然可以工作。
如果您没有指向 0.0.0.0 的外部地址,您将无法访问文件服务器,直到 TTL 过期。
我知道用例有限但是我见过这种用法!