Introduction

藉由某些原因,大陸地區 DNS 解析極其混亂。

DNSCrypt 協議可以驗證到 DNS 服務器之間的通訊防止欺騙,同時也可對通訊進行加密以防止被污染。

Dnsmasq 是一個輕量級的 DNS 服務器,可為小型局域網內設備提供解析服務。

Environment

  • Device: NETGEAR WNDR4300
  • OS: LEDE

配置 DNSCrypt-Proxy

DNSCrypt-Proxy 是官方參考級的客戶端,首先請確認設備的架構,下載對應的預編譯包。

端口設置

因為 Dnsmasq 必須佔用 53 端口,所以需要在 dnscrypt-proxy.toml 中修改對應端口。

# 監聽位址(如無 ipv6 則不需要 [::1])
listen_addresses = ['127.0.0.1:35353', '[::1]:35353']

配置上游服務器

DNSCrypt-Proxy 建議中採用了一種獨特的方式來配置上游,即通過由公共維護的源列表來管理,在配置中只需要列表中的別名即可,任何人都可以發布一個新的源,通過對列表進行簽名,保證了內容在傳輸過程中不會被篡改。可以配置多個源,DNSCrypt-Proxy 會自動解析最快的服務器。

DNSCrypt-Proxy 默認使用 DNSCrypt 官方維護的公共源

dnscrypt-resolvers.csv, public-servers 列出一些明文的 DNS 服務器信息。

# 上游服務器
server_names = ['scaleway-fr', 'google', 'cloudflare', 'rubyfish-ea', ]
# 後備服務器
fallback_resolver = '114.114.114.114:53'

檢查配置文件

$ dnscrypt-proxy -config /etc/config/dnscrypt-proxy.toml -check
> [2019-05-03 08:43:51] [NOTICE] Source [public-resolvers.md] loaded
[2019-05-03 08:43:51] [NOTICE] Configuration successfully checked

檢查 DNSCrypt-Proxy 解析

$ dnscrypt-proxy -resolve google.com
> Resolving [google.com]

Domain exists:  yes, 4 name servers found
Canonical name: google.com.
IP addresses:   172.217.5.14, 2607:f8b0:4009:804::200e
TXT records:    docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8= v=spf1 include:_spf.google.com ~all facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95
Resolver IP:    212.47.228.136 (scaleway-fr.dnscrypt.info.)

加入啟動項

$ echo "/etc/init.d/dnscrypt-proxy start" >> /etc/rc.local

Running!

如果一切正常的話,便可添加到啟動項並運行了。

$ chmod +x /usr/sbin/dnscrypt-proxy
$ chmod +x /etc/init.d/dnscrypt-proxy
$ /etc/init.d/dnscrypt-proxy enable
$ /etc/init.d/dnscrypt-proxy start

配置 Dnsmasq

/etc/dnsmasq.conf

# 配置文件目錄
conf-dir=/etc/dnsmasq.d
# 禁用 resolv
no-resolv
no-poll
# 解析服務器
server=127.0.0.1#35353
# 緩存(150 Default)
cache-size=1500

配置規則加速境內域名解析

因 DNS 解析還涉及到 CDN 選取,所以利用規則將境內的域名進行匹配來使用國內的 DNS 進行解析。

dnsmasq-china-list 已經整理好了,所以直接拿來就用。

將其中的accelerated-domains.china.conf, google.china.conf, apple.china.conf 放入 /etc/dnsmasq.d 中即可。

檢查監聽端口

$ netstat -anp | grep 53

確定 Dnsmasq 和 DNSCrypt 都跑在相應的端口便無誤。

設定 DNS

  • 在路由器 lan 出口配置為本地服務器
  • 在終端設備的網路設定中將 DNS 配置為本地服務器

Last Step!

在終端設備上,進行最後的檢查。

$ nslookup google.com
> Server:       192.168.1.1
Address:    192.168.1.1#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.6.110