1. 程式人生 > >DNS解析汙染原理——要麽修改包,要麽直接丟棄你的網絡包

DNS解析汙染原理——要麽修改包,要麽直接丟棄你的網絡包

mas 實現 ted pan 瀏覽器 connect sts set oca

DNS/域名解析

可以看到dns解析是最初的一步,也是最重要的一步。比如訪問親友,要知道他的正確的住址,才能正確地上門拜訪。

dns有兩種協議,一種是UDP(默認),一種是TCP。

udp 方式,先回應的數據包被當做有效數據

在linux下可以用dig來檢測dns。國內的DNS服務器通常不會返回正常的結果。
下面以google的8.8.8.8 dns服務器來做測試,並用wireshark來抓包,分析結果。

1 dig @8.8.8.8 www.youtube.com

技術分享dns-udp-youtube

從wireshark的結果,可以看到返回了三個結果,前面兩個是錯誤的,後面的是正確的

但是,對於dns客戶端來說,它只會取最快回應的的結果,後面的正確結果被丟棄掉了。因為中間被插入了汙染包,所以即使我們配置了正確的dns服務器,也解析不到正確的IP。

tcp 方式,有時有效,可能被rest

再用TCP下的DNS來測試下:

1 dig @8.8.8.8 +tcp www.youtube.com

技術分享dns-tcp-youtube-reset

從wireshark的結果,可以看出在TCP三次握手成功時,本地發出了一個查詢www.youtube.com的dns請求,結果,很快收到了一個RST回應。而RST回應是在TCP連接斷開時,才會發出的。所以可以看出,TCP通訊受到了幹擾,DNS客戶端因為收到RST回應,認為對方斷開了連接,因此也無法收到後面正確的回應數據包了。

再來看下解析twitter的結果:

1 dig @8.8.8.8 +tcp www.twitter.com

結果:

1 2 3 4 5 www.twitter.com. 590 IN CNAME twitter.com. twitter.com. 20 IN A 199.59.150.7 80 twitter.com. 20 IN A 199.59.150.7 twitter.com. 20 IN A 199.59.149.230 twitter.com. 20 IN A 199.59.150.39

這次返回的IP是正確的。但是嘗試用telnet 去連接時,會發現連接不上。

1 telnet 199.59.150.7 80

但是,在國外服務器去連接時,可以正常連接,完成一個http請求。可見一些IP的訪問被禁止了

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $ telnet 199.59.150.7 80 Trying 199.59.150.7... Connected to 199.59.150.7. Escape character is ‘^]‘. GET / HTTP/1.0 HOST:www.twitter.com HTTP/1.0 301 Moved Permanently content-length: 0 date: Sun, 08 Feb 2015 06:28:08 UTC location: https://www.twitter.com/ server: tsa_a set-cookie: guest_id=v1%3A142337688883648506; Domain=.twitter.com; Path=/; Expires=Tue, 07-Feb-2017 06:28:08 UTC x-connection-hash: 0f5eab0ea2d6309109f15447e1da6b13 x-response-time: 2

黑名單/白名單

想要獲取到正確的IP,自然的黑名單/白名單兩種思路。

下面列出一些相關的項目:

1 2 3 https://github.com/holmium/dnsforwarder https://code.google.com/p/huhamhire-hosts/ https://github.com/felixonmars/dnsmasq-china-list

本地DNS軟件

  • 修改hosts文件
    相信大家都很熟悉,也有一些工具可以自動更新hosts文件的。
  • 瀏覽器pac文件
    主流瀏覽器或者其插件,都可以配置pac文件。pac文件實際上是一個JS文件,可以通過編程的方式來控制dns解析結果。其效果類似hosts文件,不過pac文件通常都是由插件控制自動更新的。只能控制瀏覽器的dns解析。
  • 本地dns服務器,dnsmasq
    在linux下,可以自己配置一個dnsmasq服務器,然後自己管理dns。不過比較高級,也比較麻煩。

順便提一下,實際上,kubuntu的NetworkManager會自己啟動一個私有的dnsmasq進程來做dns解析。不過它偵聽的是127.0.1.1,所以並不會造成沖突。

1 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf

路由器智能DNS

基於OpenWRT/Tomoto的路由器可以在上面配置dns server,從而實現在路由器級別智能dns解析。現在國內的一些路由器是基於OpenWRT的,因此支持配置dns服務器。
參考項目:

1 https://github.com/clowwindy/ChinaDNS

DNS解析汙染原理——要麽修改包,要麽直接丟棄你的網絡包