![为什么即使 DNS 服务器是假的,NSlookup 也会返回 IP 地址?](https://linux22.com/image/1607568/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8D%B3%E4%BD%BF%20DNS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%98%AF%E5%81%87%E7%9A%84%EF%BC%8CNSlookup%20%E4%B9%9F%E4%BC%9A%E8%BF%94%E5%9B%9E%20IP%20%E5%9C%B0%E5%9D%80%EF%BC%9F.png)
最初在新闻组中询问,完整日志: https://groups.google.com/forum/#!topic/microsoft.public.windowsxp.general/Ll32NWComwY
快照显示 DNS 答案确实是由假服务器返回的。
答案1
没有什么“确实”的。如果您的 ISP 希望对 DNS 查询执行 MITM(中间人)攻击,它很容易将查询重定向到另一个目的地而不让您知道(至少不仅仅是基于回复的源 IP 地址)。
以下是概念验证。以下是我的 LAN 中主机的防火墙规则:
*nat
-A PREROUTING -p udp --dport 53 -m limit --limit 20/minute -j ACCEPT
-A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.1
-A POSTROUTING -p udp --dport 53 -j SNAT --to-source 192.168.1.110
COMMIT
这些规则的基本含义是,如果平均 DNS 查询数量超过一定数量,则将查询重定向到特定主机(在这种情况下,它只是一个“普通”的 DNS 转发器/服务器,因为它本身不会伪造结果);否则,接受它(即“按原样”进行“路由”)。
最后一条规则导致回复首先被路由回它(通过将源伪装成它自己),以便防火墙可以对其一直跟踪的回复源与原始目的地(以及回复目的地与原始源)执行“反向 NAT”。
下面是当我使用“中间人”主机作为不存在的 DNS 服务器的网关对 LAN 中的另一台主机进行 DNS 查询时的结果:
[tom@archlinux ~]$ ssh 192.168.1.143
Last login: Fri Oct 25 14:32:11 2019 from 192.168.1.110
[tom@alarm ~]$ ip r get 200.100.200.100
200.100.200.100 via 192.168.1.110 dev eth0 src 192.168.1.143 uid 1000
cache
[tom@alarm ~]$ while true; do timeout 1 nslookup www.google.com 200.100.200.100; if [ $? -eq 0 ]; then sleep 5; else echo "timeout!"; fi; done
timeout!
timeout!
timeout!
timeout!
timeout!
timeout!
timeout!
Server: 200.100.200.100
Address: 200.100.200.100#53
Non-authoritative answer:
Name: www.google.com
Address: 172.217.26.132
Name: www.google.com
Address: 2404:6800:4005:805::2004
timeout!
timeout!
Server: 200.100.200.100
Address: 200.100.200.100#53
Non-authoritative answer:
Name: www.google.com
Address: 172.217.26.132
Name: www.google.com
Address: 2404:6800:4005:805::2004
timeout!
timeout!
timeout!
Server: 200.100.200.100
Address: 200.100.200.100#53
Non-authoritative answer:
Name: www.google.com
Address: 172.217.26.132
Name: www.google.com
Address: 2404:6800:4005:805::2004
^C