公共 DNS 服务器如何返回不良结果?

信息安全 dns 欺骗 dns 欺骗
2021-08-18 19:06:11

我生活在一个受到许多制裁的国家。内部制裁(政府对人民)和外部制裁(美国对我们人民)。

在我们国家,YouTube、Twitter、Facebook 和许多其他网站默认被屏蔽,我们只能通过 VPN 访问它们。

但是有一件事应该起作用:DNS。如果我将我的 DNS 设置为8.8.8.8,理论上它应该返回正确的 IP 地址,www.youtube.com并且该 IP 地址应该被 ISP 阻止。

但事实并非如此。看起来我们的政府正在操纵 DNS 服务器,甚至是公共服务器。

我有 Ubuntu 18.04 (Bionic Beaver),并且我禁用了Network Manager DNS我已禁用resolvconfand systemd-resolve,我的意思是我自己系统中的任何实体都无法更改该文件/etc/resolv.conf

我将内容更改/etc/resolv.conf为:

nameserver 8.8.8.8

并且只有这个名称服务器。所以现在每个应用程序都默认使用这个服务器,他们应该向这个服务器查询网站的 IP 地址,但不幸的是他们没有这样做!

kasra@ubuntu:~$ nslookup google.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   google.com
Address: 216.58.214.110
Name:   google.com
Address: 2a00:1450:4001:812::200e

kasra@ubuntu:~$ nslookup youtube.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   youtube.com
Address: 10.10.34.35
Name:   youtube.com
Address: 10.10.34.35

kasra@ubuntu:~$ nslookup twitter.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   twitter.com
Address: 10.10.34.35
Name:   twitter.com
Address: 10.10.34.35

kasra@ubuntu:~$ █

10.10.34.35 是过滤权限的内网IP地址。

ISP 是如何做到这一点的?他们真的是在窃取和MITM-ing的流量8.8.8.8吗?是某种BGP劫持吗?

如果没有 VPN,我该如何解决这个问题?

4个回答

他们(ISP)是如何做到这一点的,他们真的在窃取和 MITM 8.8.8.8 的流量吗?

他们可能只是简单地将目标端口为 53(即 DNS)的所有数据包重定向到他们自己的服务器并自己回答查询。这并不难做到。

如果没有 VPN,我该如何解决这个问题?

正确配置的 VPN(即没有 DNS 泄漏)可以解决这个问题(除非它们也阻止 VPN)。此外,使用 HTTP 代理或 SOCKS 代理可以帮助(确保为最后一个配置外部名称解析)HTTP 和 HTTPS 流量。dnscurve、dnscrypt、DNS over TLS 和 DNS over HTTPS(Firefox 已经支持)等 DNS 隐私技术也会有所帮助。

不幸的是,他们没有这样做!

他们正在这样做,您的打字稿显示它正在发生,nslookup查询该 IP 地址并从中获取答案。

您的困惑部分源于对 8.8.8.8 是什么的误解。它是一个任播IP 地址。发送到它的流量被路由到世界各地多台机器的网络接口,由谷歌在各种数据中心运行。该路由是由它发送到的每个节点完成的,包括在它离开自己的网络后立即的自己的 ISP 。

首先,谷歌本身可以让这些机器在不同的国家表现不同。它可以使一个国家的机器对其他国家的机器做出不同的回答,如果它决定这样做,或者如果该国当局要求这样做。

其次,谷歌公共 DNS 从其后端查询的内容 DNS 服务器可以对不同的谷歌机器做出不同的响应。它们的后端 IP 地址以及它们对应的国家/地区作为 Google 公共 DNS 文档的一部分发布。内容 DNS 服务器根据其源 IP 地址向不同的客户端(这里的客户端是解析代理 DNS 服务器的后端)给出不同的答案是几个 DNS 服务器软件中的一个功能。

第三,受特定国家管辖的 ISP 可以被告知简单地将任播路由到Google 以外的其他人控制的其他机器。就像2014年在土耳其发生的那样。据称台湾也有类似的计划。

伊朗比土耳其早一年就已经这样做了。伊朗 ISP 拦截通过它们路由的所有 DNS/UDP 流量,并从伊朗控制下的机器对其进行响应。有趣的是,这似乎做得不太好,因为虚拟 TCP(原文如此!)数据包仍然通过原始机器。

(Cloudflare 的 1.1.1.1 服务也是如此,但较少出于政治和审查的原因,而更多是因为人类的懒惰和愚蠢。长期以来,人们编程将其滥用为测试 IP 地址或非官方的额外私有 IP 地址范围路由器等。)

当然,如果有人安排 DNS 流量通过 VPN离开自己的机器,而不是直接流向自己的 ISP,那么这三者都会改变。流量通过 VPN 到达不同国家/地区的另一台 Google 机器,该机器从不同的源 IP 地址发送后端查询,并且不会被一个 ISP 路由到 8.8.8.8。

正如澳大利亚人早在 2010 年使用 Google 公共 DNS 所发现的那样,使用DNS 服务看起来好像在另一个国家/地区的不利之处在于似乎在另一个国家/地区。CDN 将一个定向到更远且非本地的内容 HTTP 服务器。低成本或免费但仅限于本国的服务突然转而来自昂贵的内容 HTTP 服务器。

进一步阅读

简而言之,您正在接受 MITMed。您面临的审查员正在对指向 8.8.8.8 的 DNS 请求做一些事情,以便您得到非真实的响应。有很多方法可以实现这一点,不同的实体通过不同的方式执行这种审查。要仔细查看,请使用您最喜欢的数据包捕获工具(Wireshark 或tcpdump)。

作为演示,我截取了我在 8.8.8.8 处向 Google 的 DNS 服务器查询“www.google.com”的地址。

nslookup 截图

Wireshark 截图

从 Wireshark 屏幕截图中可以看出,我的计算机向 DNS 服务器发送了两个 DNS 查询,一个用于 A 记录(IPv4 地址),一个用于 AAAA 记录(IPv6 地址)。对于每个请求,收到 3 个响应。前两个响应包含虚假地址,有趣的是,AAAA 查询的前两个响应在答案中包含 A 记录 - 显然是格式错误的响应。每个请求的第三个也是最后一个响应包含 www.google.com 的真实 IP 地址。nslookup工具不知何故接受了每个请求的第一个响应并显示了这些地址。

这暗示了我的国家审查员正在做什么。显然,它们并没有完全阻止到 8.8.8.8 的网络流量。相反,他们监控此类流量,当发现针对被阻止域的 DNS 请求时,审查员会注入虚假响应。审查员不会费心去创建正确的 AAAA 响应,因此会出现格式错误的响应。来自真实 DNS 服务器的真实响应也不会被丢弃。但是,早期的虚假响应足以欺骗发出 DNS 请求的客户端接受虚假地址。

您的审查员可能正在做类似的事情,或者他们可能正在做完全不同的事情。采取一些数据包捕获,我们也许可以告诉更多。

至于如何解决这个问题,实际的答案可能是本地加密的 DNS 代理,例如DNSCrypt ProxyStubby这些工具在您的计算机上运行 DNS 服务器,针对它们的 DNS 请求将被加密并发送到理解加密协议的 DNS 服务器。这样,审查员就无法知道请求是针对哪个域的,也无法伪造响应。不过,审查员仍然可以直接阻止这些服务器。

(如果您想规避国家审查机构,仅仅击败 DNS 中毒可能还不够。您可能需要针对不同的场合使用不同的工具。)

由于您正在运行 Linux,因此无需完整的 VPN 即可轻松解决此问题,即 SSH 调谐。如果您可以在中立的、未过滤的位置的服务器上设置或获取帐户,则只需几个命令,您就可以使用 SSH 通过该位置隧道传输您的流量。您可以将 53 端口上的 dns 流量和通过远程计算机的 Web 流量都隧道化。

你可以使用亚马逊网络服务或谷歌计算引擎实例,或者只是一个普通的远程 vps。

https://www.ssh.com/ssh/tunneling/example#sec-What-Is-SSH-Port-Forwarding-aka-SSH-Tunneling

https://serverfault.com/questions/78351/can-i-create-ssh-to-tunnel-http-through-server-like-it-was-proxy