自建無汙染的 DNS 服務器

2018-03-01

Twitter 被解析到了 Facebook 的 CDN 上,提示證書錯誤

查看 openDNS 和 AliDNS 的數據,下面的 31.13.xx.xx / 67.15.xx.xx 都是 Facebook 的 CDN

對於大陸境內通過 UDP 53 端口傳輸的數據都會被檢測,又沒有任何認證機制,而且域名查詢通常基於無連接不可靠的UDP協議,查詢者只能接受最先到達的格式正確結果,並丟棄之後的結果,造成域名解析被惡意篡改。

via Wikipedia

之前 clowwindy 開源 的 chinaDNS 項目已經很久沒有更新,也不能提交 PR 了,那自建 Fork 一份改了上游 DNS 的源。


https://github.com/ky0ncheng/ChinaDNS


目前使用 TCP 去查詢上游的權威 DNS 數據,去除使用 UDP 查詢 8.8.8.8 的設定,目前採用 USTC DNS 和 openDNS 作為權威 DNS 服務器。

目前缺點是每次都是重新查詢,沒有緩存,如果需要緩存,chinaDNS 設置監聽 127.0.0.1:5353,可以再部屬一個 unbound

nano /etc/unbound/unbound.conf
num-threads: 2 # 線程數可以修改爲物理核心數
interface: 0.0.0.0 # 偵聽所有 IPv4 地址
interface: ::0 # 偵聽所有 IPv6 地址
# 如果只需要本機使用,則一個 interface: 127.0.0.1 即可
so-rcvbuf: 4m
so-sndbuf: 4m # 本機使用的話,這倆 buf 可以取消註釋
so-reuseport: yes # 如果開了多線程,就寫 yes
msg-cache-size: 64m # 本機可以設置 4m 或者更小
rrset-cache-size: 128m # 本機可以設置 4m 或者更小
cache-max-ttl: 3600 # 建議設置一個不太大的值...專治各種運營商 DNS 緩存不服
outgoing-num-tcp: 256 # 限制每個線程向上級查詢的 TCP 併發數
incoming-num-tcp: 1024 # 限制每個線程接受查詢的 TCP 併發數
# 下面這四個不需要解釋了吧,不想用那個就寫 no
do-ip4: yes
do-ip6: yes
do-udp: yes
do-tcp: yes
tcp-upstream: no # 默認是 no,隧道狀態比較穩的話也不需要寫 yes。一些情況下強制使用 tcp 連上游的話寫 yes
access-control: 0.0.0.0/0 allow # 本機用的話建議設置 127.0.0.0/8 allow,局域網用適當調整
root-hints: "/etc/unbound/root.hints" # 沒有的話在 ftp://FTP.INTERNIC.NET/domain/named.cache 下載一份
hide-identity: yes # 不返回對 id.server 和 hostname.bind 的查詢。
hide-version: yes # 不返回對 version.server 和 version.bind 的查詢。
# 不過下面有 identity 和 version 的自定義選項,不隱藏這些的話,修改下選項還可以賣個萌(´・ω・`)
harden-glue: yes # 建議打開
module-config: "iterator" # 禁用 DNSSEC 檢查,如果上游不支持 DNSSEC 就關掉。注意這個選項有可能在其他 include 的文件裏
unwanted-reply-threshold: 10000000 # 針對各種網絡不服,數值爲建議值,具體可以自己修改看看效果
do-not-query-localhost: no # 一般是爲了防止扯皮丟包開着,不過等下要用 DNSCrypt 所以關掉
prefetch: yes # 蠻好用的,開着吧
minimal-responses: yes # 省帶寬,開着吧。本機用可以關掉
# 關鍵部分來了,把默認查詢全部丟給 DNSCrypt。使用 [地址]@[端口] 指定查詢地址和端口,默認端口 53。
# 然後把國內的地址丟給國內的緩存服務器。這兩個選項的順序不能錯喲。
# 如果使用隧道查詢,把這個地址改爲隧道對端的地址,或者一個國外的 DNS 服務器都可以,例如 8.8.8.8。
# 具體看是在對端開 DNS 還是直接用國外的服務器。
forward-zone:
name: "."
forward-addr: [email protected]
Tags: dns