眾所周知,在我朝局域網當中想要獲取國外 DNS 資訊,必定會遭到關鍵字污染。為此,有人想到了使用異常埠,比如5353而不使用 DNS 專用埠53——因為目前 女朋友牆 只污染53;也有人想到了使用 TCP 連線要求,因為 DNS 的應答機制(參考 DHCP)決定了它會接受第一個返回的回應,後邊的會被丟棄,而使用 TCP 則強制接受選定的資料包;甚至有人想到了把那些發污染包的 IP 位址收集起來,然後在用戶端處過濾——加入黑名單,這樣最終就會收到正確的回應包。
總之,這些都不是什麼長久之計,使用 OpenDNS 出品的 dnscrypt 是一個不錯的選擇,它在 DNS 的基礎之上增加了加密的選項,讓你的 DNS 請求能夠像使用 SSL 一樣加密地請求伺服器,這樣便從根本上杜絕了 DNS 污染問題。
那麼問題來了,就算你是用了 dnscrypt,可是伺服器 IP 被認證了呢? 答案是——這就是最近 dnscrypt 越來越不給力的原因。另外,OpenDNS 雖然搗鼓出了這麼個給力的玩意兒,但是他們卻沒有公開服務端——也就是說你必須使用那有限的幾個國外的伺服器,速度絕對快不到哪裡去。
所以,我朝有大神根據 dnscrypt 的用戶端寫出了牛逼閃閃的服務端——dnscrypt-包裝!
我們現在可以自己在境外伺服器搭建一個 dnscrypt 伺服器,本地來連接就好了——你可以選擇一個速度比較快的 vps。
教程開始
作為演示,我這裡的伺服器是 Ubuntu的 14.04.
編譯安裝依賴庫檔
dnscrypt-包裝 依賴 libsodium 和 libevent2;前者一般源裡沒有,後者一般預設版本不是2而是比較舊的1,我們得先來手動編譯這兩個庫。
我們從這裡下載 libsodium 的最新版本 ,截止到本文完成時,最新版本為1.0.2 1.0.10:
1 2 3 4 5 6 7 8 |
cd ~ wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.10.tar.gz tar xf libsodium-1.0.10.tar.gz cd libsodium-1.0.10 CFLAGS="-O3 -fPIC" ./configure make make install ldconfig |
然後我們從這裡下載 libevent2 ,這裡我們選擇 2.0.22 穩定版:
1 2 3 4 5 6 7 8 9 |
cd ~ wget https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz tar xf libevent-2.0.22-stable.tar.gz cd libevent-2.0.22-stable ./configure --prefix=/usr make make install echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf ldconfig |
編譯 dnscrypt-wrapper
搞定兩個依賴庫之後,就可以開始編譯 dnscrypt-包裝 啦:
1 2 3 4 5 6 7 |
apt-get update && apt-get upgrade apt-get install git cd ~ git clone --recursive git://github.com/Cofyc/dnscrypt-wrapper.git cd dnscrypt-wrapper make configure ./configure |
如果你在 make configure 這一步出錯,你可能需要先安裝 autoconfig:
1 |
apt-get install autoconfig |
如果沒什麼問題,那麼就可以開始編譯安裝了:
1 2 3 4 5 6 7 |
make make install //安装完成会出现如下提示: # make install install -d -m 755 ‘/usr/local/bin’ install -p dnscrypt-wrapper ‘/usr/local/bin’ |
至此編譯完成。
dnscrypt-wrapper 的配置和使用
1 2 3 4 5 6 |
cd ~ mkdir dnskey //新建一个目录来存放证书 cd dnskey dnscrypt-wrapper --gen-provider-keypair //生成提供商密钥对 |
這裡系統會回饋一個指紋資訊,這個資訊就是用戶端配置時候需要的「provider_public_key”! 所以一定要保存好。
類似這個樣子:
1 |
4298:5F65:C295:DFAE:2BFB:20AD:5C47:F565:78EB:2404:EF83:198C:85DB:68F1:3E33:E952 |
然後,我們使用命令生成有時限的加密金鑰對以及生成預簽章憑證:
1 2 |
dnscrypt-wrapper --gen-crypt-keypair --crypt-secretkey-file=1.key dnscrypt-wrapper --gen-cert-file --crypt-secretkey-file=1.key --provider-cert-file=1.cert |
這樣,dnscrypt-包裝 就已經準備好了。
使用命令來運行 dnscrypt-wrapper,用「-VV」來顯示比較詳細的 debug 資訊:
1 2 3 4 |
cd ~/dnskey dnscrypt-wrapper --resolver-address=114.114.114.114:53 --listen-address=0.0.0.0:443 \ --provider-name=2.dnscrypt-cert.logcg.com \ --crypt-secretkey-file=1.key --provider-cert-file=1.cert -VV |
其中的 --provider-name= 並不必要,可以隨便填寫,但注意必須是以 2.dnscrypt-證書. 開頭:)
然後去國內 vps 安裝用戶端:
1 2 3 4 5 |
apt-get install python-software-properties add-apt-repository ppa:anton+/dnscrypt //安装 dnscrypt 客户端的 ppa apt-get update apt-get install dnscrypt-proxy |
安裝好後配置一下:
1 2 3 4 5 6 7 8 9 |
vi /etc/default/dnscrypt-proxy #要修改的就只有如下几处,其他注释和配置已略去。 local-address=127.0.0.1:5301 #本地监听地址和端口 resolver-address=128.199.131.196:5353 #远端的服务器地址和端口 provider-name=2.dnscrypt-cert.logcg.com provider-key=4298:5F65:C295:DFAE:2BFB:20AD:5C47:F565:78EB:2404:EF83:198C:85DB:68F1:3E33:E952 #先前使用dnscrypt-wrapper --gen-provider-keypair命令时候生成的指纹信息。 |
保存後使用如下命令重啟用戶端服務,如果你的埠沒有被防火牆擼掉,那伺服器那邊就應該能夠看到 debug 資訊,表示已經有用戶端接入。
1 |
service dnscrypt-proxy restart |
使用命令來測試一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
root@MyServer:~# dig -p 5301 twitter.com @127.0.0.1 ; <<>> DiG 9.8.1-P1 <<>> -p 5301 twitter.com @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45379 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;twitter.com. IN A ;; ANSWER SECTION: twitter.com. 5 IN A 199.16.158.179 twitter.com. 5 IN A 199.16.158.168 ;; Query time: 273 msec ;; SERVER: 127.0.0.1#5301(127.0.0.1) ;; WHEN: Wed May 6 19:51:42 2015 ;; MSG SIZE rcvd: 72 |
多次重複命令,發現獲取到的 IP 均相同且為真正的正確 IP 位址,服務生效。
創建腳本
每次直接運行命令多少有些不方便,即使使用「-d」來後臺執行,一樣讓人感到不適,我們使用 shell 來創建一個啟動 dnscrypt-wrapper 的腳本。
1 2 3 4 5 6 7 8 9 10 11 |
cd ~/dnskey vi start-dnscrypt-wrapper.sh #加入以下内容 #!/bin/bash dnscrypt-wrapper --resolver-address=127.0.0.1:5333 --listen-address=0.0.0.0:5355 \ --provider-name=2.dnscrypt-cert.logcg.com \ --crypt-secretkey-file=1.key --provider-cert-file=1.cert -d \ --logfile=/var/log/dnscrypt-wraper.log |
以後則只需要使用 sh start-dnscrypt-wrapper.sh 就可以啟動了。
——至於關閉嘛,使用命令「killall dnscrypt-wrapper“。
延伸閱讀:
HTTPS://github.com/Cofyc/dnscrypt-wrapper
HTTP://03k.org/dnscrypt-wrapper-usage.html
本文由 落格博客 原創撰寫:落格博客 » 編譯安裝 dnscrypt-wrapper 搭建防污染 DNS 服務器
轉載請保留出處和原文鏈接:https://www.logcg.com/archives/981.html
“去國內 vps 安裝客戶端”是什麼意思?難道還需要一個國內vps 嗎?客戶端不是安裝在本地機器上的嗎
確實需要一台國內的vps來作為 DNS 53 端口服務器,我這裡主要是為了給任意設備使用(尤其是移動端),如果你僅在自己一台電腦上使用,那麼就在本地起客戶端然後設置DNS地址為回環即可。實際上你可參考我最新的文章,DoT DoH 除了 DNSCrypt,你還可以了解一下更好的 DNS 加密方案 這些都是不錯的 DNS 解決方案,都可以按照本文架構實現任意設備使用DNS(或者根據你的需要,在本地計算機直接起客戶端,方便快捷~)