1. 程式人生 > >一分鐘快速搭建Windows防汙染DNS伺服器——Pcap_DNSProxy

一分鐘快速搭建Windows防汙染DNS伺服器——Pcap_DNSProxy

最近在G+上無意發現一個一個好東西——Pcap_DNSProxy,這是一個執行在Windows上的DNS服務程式,主要功能是防止DNS汙染。以前我都是在linux系統上使用Pdnsd搭建防汙染的DNS伺服器,現在家用的Windows電腦單也可以輕鬆實現了,而且比Pdnsd搭建更為方便(Pdnsd搭建的方式可以看我的上一篇部落格《Ubuntu16.04用Pdnsd替換dnsmasq防止DNS汙染》)更酷炫的是,該程式還可以設定HTTP代理或者Socks5代理,使用代理伺服器解析DNS請求,更進一步的提高了解析結果的可靠性,通過代理,即使ISP將所有境外伺服器都攔截,也可以通過加密代理進行解析,十分適合在天朝境內使用。

Pcap_DNSProxy 是國人寫的專案,並在github上開源,其說明文件和下載頁面均為中文。安裝和部署方式非常簡單,配置檔案的說明也全是中文(以前看dnsmasq的wiki看的我頭大)。實在是居家旅行科學上網必備工具。

官方介紹這是一個基於WinPcap的DNS服務程式,使用DNS加密和TCP協議防止DNS汙染,並且支援DNS快取,可以自定義快取時間和快取佇列長度等引數,使用起來很像pdnsd,可以設定多個DNS伺服器鏈,並且可以實現國內域名國內解析,國外域名國外解析的效果,加速國內外網站的訪問。

下面簡單的介紹一下最快速的部署過程,如果你成功部署過一次之後,第二次去別的計算機部署僅需1分鐘不到就可以搞定

2、然後從上面我寫的github地址上下載最新的Pcap_DNSProxy壓縮包,下載完成之後解壓到本地磁碟上

3、找到\Pcap_DNSProxy-0.4.7.6-bin\Windows資料夾,右擊ServiceControl.bat,選擇“以管理員身份執行”

4、在彈出的命令列中輸入1,回車

注:在這個過程中,可能會彈出360提示你程式試圖修改xxx,或者windows防火牆的彈出視窗,一律選擇允許就可以了

檢查DNS服務是否啟動成功,可以進入命令列使用netstat -an檢視是否有程式監聽127.0.0.1:53埠

5、將系統預設的DNS伺服器換成127.0.0.1,如下圖,首先開啟“網路和共享中心”,找到當前連線的有線或者無線連線

點選相應的連線,修改DNS伺服器設定

這樣就搭建了一個本地的DNS伺服器(自帶防汙染和DNS快取功能)並且將系統全部的DNS請求均交由該伺服器進行解析

上面只介紹了最簡單的一種部署方法,這種配置有時候還是會解析不到向www.facebook.com,www.twitter.com這樣的地址,需要我們修改配置檔案中的解析策略

我個人總結配置檔案一共改三四行就夠行了

1、修改解析協議從UDP協議轉為TCP協議

2、修改DNS快取時間為1天以上

3、將53埠開放讓區域網使用者可以把你的機器當成DNS伺服器

修改後的Config.ini檔案如下,注意#後面為註釋,實際使用時請刪掉所有註釋內容

[Base]
Version = 0.4
File Refresh Time = 15
Additional Path = 
Hosts File Name = Hosts.ini|Hosts.conf|Hosts|Hosts.txt|Hosts.csv|WhiteList.txt|White_List.txt
IPFilter File Name = IPFilter.ini|IPFilter.conf|IPFilter.dat|IPFilter.csv|IPFilter|Guarding.p2p|Guarding|Routing.txt|chnrouting.txt|chnroute.txt

[Log]
Print Log Level = 3
Log Maximum Size = 8MB

[Listen]
Pcap Capture = 1
Pcap Devices Blacklist = AnyConnect|Host|Hyper|ISATAP|IKE|L2TP|Only|Oracle|PPTP|Pseudo|Teredo|Tunnel|Virtual|VMNet|VMware|VPN|any|lo
Pcap Reading Timeout = 250
Listen Protocol = IPv6 + IPv4 + TCP + UDP
Listen Port = 53
Operation Mode = Server # 這裡要從Private改成server,這樣區域網的其他裝置才能把你的電腦當成DNS伺服器
IPFilter Type = Deny
IPFilter Level < 0
Accept Type = 

[DNS]
Protocol = IPv4 + TCP # 注意這裡要把UDP改成TCP,否則有可能解析不了某些網站
Direct Request = 0
Cache Type = Timer # 推薦按照時間快取,Timer是時間快取,還有一種是按照數量快取
Cache Parameter = 86400 # 這個是DNS結果快取的時間,推薦一天以上,單位為秒
Default TTL = 86400

[Addresses]
IPv4 Listen Address = 
IPv4 EDNS Client Subnet Address = 
IPv4 Main DNS Address = 8.8.4.4:53
IPv4 Alternate DNS Address = 1.0.0.1:53|9.9.9.9:53|208.67.220.220:5353
IPv4 Local Main DNS Address = 114.114.115.115:53
IPv4 Local Alternate DNS Address = 223.6.6.6:53
IPv6 Listen Address = 
IPv6 EDNS Client Subnet Address = 
IPv6 Main DNS Address = [2001:4860:4860::8844]:53
IPv6 Alternate DNS Address = [2606:4700:4700::1001]:53|[2620:FE::FE]:53|[2620:0:CCD::2]:5353
IPv6 Local Main DNS Address = [240C::6644]:53
IPv6 Local Alternate DNS Address = [240C::6666]:53

省略官方配置檔案Demo中剩下的內容,基本都不需要改

其中IPv4 Main DNS Address是主要上游DNS伺服器的地址,關係到你本地DNS的速度。還有幾個引數如下

  • IPv4 Alternate DNS Address - IPv4 備用 DNS 伺服器地址:需要輸入一個帶埠格式的地址,預設為 8.8.8.8:53|208.67.220.220:53|208.67.222.222:53
    • 本引數支援同時請求多伺服器的功能,開啟後將同時向列表中的伺服器請求解析域名,並採用最快回應的伺服器的結果
    • 使用同時請求多伺服器格式為 “地址 A:埠|地址 B:埠|地址 C:埠”(不含引號),同時請求多伺服器啟用後將自動啟用 Alternate Multi Request 引數(參見下文)
    • 指定埠時可使用服務名稱代替,參見上表
  • IPv4 Local DNS Address - IPv4 主要境內 DNS 伺服器地址,用於境內域名解析:需要輸入一個帶埠格式的地址,預設為 114.114.115.115:53
    • 指定埠時可使用服務名稱代替,參見上表
  • IPv4 Local Alternate DNS Address - IPv4 備用境內 DNS 伺服器地址,用於境內域名解析:需要輸入一個帶埠格式的地址,預設為 114.114.114.114:53
    • 指定埠時可使用服務名稱代替,參見上表
  • IPv6 Listen Address - IPv6 本地監聽地址:預設為空

遠端代理解析DNS

如果上面的方法不好用,或者你的地區封鎖了全部的國外DNS伺服器,那麼就需要使用代理來遠端解析DNS了,Pcap_DNSProxy支援HTTP代理和Socks5代理,也就是說支援像藍燈,Shadowsocks,SSH這樣的代理。下面以Shadowsocks為例修改配置檔案Config.ini

[Proxy]
SOCKS Proxy = 1
SOCKS Version = 5
SOCKS Protocol = IPv4 + TCP
SOCKS Reliable Socket Timeout = 6000
SOCKS Unreliable Socket Timeout = 3000
SOCKS UDP No Handshake = 1
SOCKS Proxy Only = 0
SOCKS IPv4 Address = 127.0.0.1:1080
SOCKS IPv6 Address = [::1]:1080
SOCKS Target Server = 8.8.4.4:53
SOCKS Username = 
SOCKS Password = 
HTTP Proxy = 0
HTTP Protocol = IPv4
HTTP Socket Timeout = 3000
HTTP Proxy Only = 0
HTTP IPv4 Address = 127.0.0.1:1080
HTTP IPv6 Address = [::1]:1080
HTTP Target Server = 8.8.4.4:53
HTTP Version = 1.1
HTTP Header Field = Content-Length: 0
HTTP Header Field = User-Agent: Pcap_DNSProxy/0.4
HTTP Header Field = Accept: */*
HTTP Header Field = Cache-Control: no-cache
HTTP Header Field = Pragma: no-cache
HTTP Proxy Authorization = 


這樣就實現了使用Shadowsocks客戶端將IP解析請求通過代理髮送到8.8.4.4伺服器,防止本地8.8.4.4被牆,同理可以修改上面的127.0.0.1:1080為你本地的Shadowsocks或者SSH監聽地址,靈活配置

IPv6 DNS免流:

對於某些教育網IPv4+IPv6使用者,使用IPv4流量是收費的,而IPv6流量是免費的,但是瀏覽器會預設使用IPv4流量,強迫瀏覽器走IPv6的方法就是設定IPv6的DNS,讓瀏覽器只會訪問IPv6的站點。根據這個原理,我們可以讓pcap_DNSproxy只返回IPv6的解析結果,遮蔽IPv4的解析結果,實現非常容易,修改“Config.ini”

[Listen]
Pcap Capture = 1
Pcap Devices Blacklist = AnyConnect|Host|Hyper|ISATAP|IKE|L2TP|Only|Oracle|PPTP|Pseudo|Teredo|Tunnel|Virtual|VMNet|VMware|VPN|any|lo
Pcap Reading Timeout = 250
Listen Protocol = IPv6 + IPv4 + TCP + UDP
Listen Port = 53
Operation Mode = Server
IPFilter Type = Deny
IPFilter Level < 0
Accept Type = Permit:AAAA


重點是修改最後一行Accept Type,Permit:AAAA意味著僅允許返回IPv6的解析結果,這樣就可以過濾掉IPv4的地址,強制瀏覽器走IPv6流量

想要了解更多的使用方法可以參考我上面貼出的文件地址,全中文很詳細。

後記:如果你想單純的一鍵搭建一個防汙染的Windows DNS伺服器,那麼還有一個很好的選擇就是dnsforwarder,並且不需要WinPcap,只需要一個exe,一個配置檔案即可完成,同時支援win/linux平臺,抗汙染能力非常強,美中不足的是不能像本文的Pcap_DNSProxy那樣支援socks或者http代理。我有一篇文章專門介紹《pdnsd的優秀替代方案——dnsforwarder