问题发现
最近在研究 DNS 解析,学习了 nslookup 命令和 dig 命令。在我尝试查询 DNS 解析结果时,发现了一个问题:当我查询未被墙的域名时,每次查询到的结果都是一样的(无论有几个 A 记录);但是当我查询已被墙的域名时,每次的结果都不一样,且都是错误的 IP。
最开始,我对这个结果并不意外,因为当我输入 nslookup twitter.com
时,默认使用的是墙内的 DNS 服务器,它自然会给我一个错误的 IP,毕竟这是 G/F/W 的手段之一。但是当我在命令中加上特定的 DNS 服务器时,比如 nslookup twitter.com 8.8.8.8
,被墙域名的查询结果依然是每次不一样的错误 IP,如图所示:
这就让我陷入了困惑,难道命令中的 8.8.8.8(Google DNS)不起作用?又或者是 Google DNS 仍然返回给我错误的 IP?更加奇怪的是,我输入一个不存在的 DNS 服务器,我依然会得到查询结果?????
抓包分析
于是我用 Wireshark 抓包分析,果然发现了问题。我的一次 DNS 查询,竟然会得到 3 个返回结果!前两个经过验证均为错误的,只有最后一个是正确的:
如果是向不存在的 DNS 服务器(5.5.5.5)查询,那么得到的全是错误的结果:
这说明我得到的 DNS 查询结果被做了手脚,网络上搜索一番后,我知道了这叫作 DNS 抢答(可以参考 这篇文章),我的 DNS 查询被抢答了错误的答案!
在云服务器上测试
我在一台香港的 VPS 上做了同样的测试,结果查询结果均为正确的(以 facebook.com 为例),不会出现被抢答的情况。G/F/W,可真有你的!关于具体细节见 维基百科。