DNS劫持指的是“一些裝置”會攔截DNS解析請求,並將錯誤的DNS資訊返回給主機;DNS汙染指的是“一些裝置”會將錯誤的域名資訊下發至公共的DNS伺服器中(比如114),這樣使用者在進行DNS查詢的時候將會得到錯誤的IP資訊。針對這兩個問題,可通過搭建基於TCP且加密的DNS代理伺服器來解決。
1、安裝依賴包libsodium
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.10.tar.gz tar -xvzf libsodium-1.0.10.tar.gz cd libsodium-1.0.10/ CFLAGS="-O3 -fPIC" ./configure make && make install echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf sudo ldconfig
2、安裝dnscrypt-proxy
wget https://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-proxy-1.7.0.tar.gz tar -xvzf dnscrypt-proxy-1.7.0.tar.gz cd dnscrypt-proxy-1.7.0/src/libevent-modified/ CFLAGS="-O3 -fPIC" ./configure make && make install cd ../.. echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf sudo ldconfig ./configure make -j 2 && make install
3、執行並加入開機自啟動
[root@localhost ~]# /usr/local/sbin/dnscrypt-proxy -R yandex -E --local-address=0.0.0.0 -d [root@localhost ~]# vi /etc/rc.d/rc.local #新增如下一行 /usr/local/sbin/dnscrypt-proxy -R yandex -E --local-address=0.0.0.0 -d [root@localhost ~]# chmod +x /etc/rc.d/rc.local
/usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv中存放了已經支援dnscrypt查詢的公共dns,上邊表示式中的“-R yandex”代表的是這個文件中第一列的name。
4、驗證
由以下執行結果可以看到,在解析facebook.com這個網址時,本機上的dnscrypt-proxy能夠解析正確,而114和8.8解析出來的都是被牆篡改過的IP。
[root@localhost ~]# dig facebook.com +short @114.114.114.114 93.46.8.89 [root@localhost ~]# dig facebook.com +short @8.8.8.8 93.46.8.89 [root@localhost ~]# dig facebook.com +short @8.8.8.8 78.16.49.15 [root@localhost ~]# dig facebook.com +short @127.0.0.1 157.240.3.35 [root@localhost ~]# dig facebook.com +short @127.0.0.1 157.240.3.35
如果想用這個DNS代理的話,只需要將系統的DNS伺服器配置為該伺服器即可(該伺服器上需要開放 UDP:53埠)。當然,以上只解決了DNS解析的問題,“一些裝置”還有IP封鎖等等機制來過濾相應網站。