8.8.8.8 的另一端是什么?
Source: Hacker News
测试 8.8.8.8
为了观察 8.8.8.8 如何查询权威名称服务器,我使用了自己的通配符 DNS 服务 — nip.io 与 sslip.io。通过向 8.8.8.8 发送一系列唯一标记的查询,解析器会把它们转发到我们的名称服务器。
for i in $(seq 0 255); do
dig +short 8-8-8-8.test-$i.sslip.io @8.8.8.8
done
连接到名称服务器以检查日志:
ssh ns-ovh.sslip.io
日志
DNS 服务器以 systemd 服务的方式运行,因此可以使用 journalctl 导出日志:
sudo journalctl -u sslip.io-dns -S yesterday > /tmp/sslip.io.log
筛选出特制的查询记录:
grep -i 8-8-8-8.test /tmp/sslip.io.log
示例输出(已截断):
172.253.244.145.46402 TypeA 8-8-8-8.TesT-158.SsLIp.io. ? 8.8.8.8
172.253.244.144.45355 TypeA 8-8-8-8.test-158.sslip.io. ? 8.8.8.8
172.253.0.21.41598 TypeA 8-8-8-8.teSt-161.SSlIP.iO. ? 8.8.8.8
172.253.2.29.34349 TypeA 8-8-8-8.tEst-163.ssliP.iO. ? 8.8.8.8
172.253.244.145.48298 TypeA 8-8-8-8.test-163.sslip.io. ? 8.8.8.8
2607:f8b0:4004:1001::12b.39475 TypeA 8-8-8-8.TesT-164.Sslip.Io. ? 8.8.8.8
74.125.181.155.54746 TypeA 8-8-8-8.TEST-173.ssLip.iO. ? 8.8.8.8
172.253.2.23.49071 TypeA 8-8-8-8.TeSt-177.sSlIP.iO. ? 8.8.8.8
字段含义
| 字段 | 描述 |
|---|---|
172.253.244.145 | DNS 查询的源 IP 地址(IPv4)。 |
46402 | 源 UDP/TCP 端口。 |
TypeA | 查询类型(A 记录)。 |
8-8-8-8.test-158.sslip.io. | 被查询的域名(注意随机的大小写)。 |
? | 表示一次 DNS 查询。 |
8.8.8.8 | 我们返回的地址。 |
观察结果
- 在 256 次查询中只有 8 次(≈ 3 %)到达了我们位于华沙的服务器,而该服务器通常处理约 66 % 的流量。
- 源地址从不是
8.8.8.8;每次查询都来自不同的 Google 拥有的 IP。 - Google 的解析器会对查询的域名进行随机大小写处理,以减轻DNS 缓存投毒的风险。
验证源 IP 的所有权
使用 ARIN 的 REST API 与 jq:
curl -s -H "Accept: application/json" \
"https://whois.arin.net/rest/ip/172.253.244.145" |
jq '.net.orgRef."@name", .net.netBlocks.netBlock.cidrLength."$"'
输出:
"Google LLC"
"16"
/16 网段表明 Google 拥有整个 172.253.0.0/16 区段,覆盖了大多数看到的 IPv4 地址。
对于 IPv6 地址:
curl -s -H "Accept: application/json" \
"https://whois.arin.net/rest/ip/2607:f8b0:4004:1001::12b" |
jq '.net.orgRef."@name", .net.netBlocks.netBlock.cidrLength."$"'
输出:
"Google LLC"
"32"
因此 Google 也拥有 2607:f8b0::/32 IPv6 网段。(剩余的 IPv4 地址 74.125.181.155 同样位于 Google 拥有的范围内。)
结论
当公共解析器 8.8.8.8 将查询转发到上游权威服务器时,这些查询并不是从 IP 地址 8.8.8.8 发出的,而是来自 Google 拥有的多个 IPv4 与 IPv6 地址池,且源端口各不相同。Google 还会随机化查询域名的大小写,以进一步防御 DNS 缓存投毒。