人在中國,用起 DNS 會碰到兩個問題,一個是 DNS 污染,另一個是 DNS 泄露。想要上網上得痛快,就必須要先解決 DNS 的問題。
什麼是 DNS 泄露
如果你現在正在開着代理看這篇文章,可以先開啓這個網站檢測一下自己的 DNS 請求是否被髮送到了國內的 DNS 伺服器上。

簡單來説,當你在使用 VPN 等代理工具時,你認為你的請求不會被除了你和 VPN 提供商以外的第三方看到,然而主機的 DNS 請求卻被髮送送給了運營商的 DNS 伺服器或者是公共 DNS 伺服器(阿里、騰訊等)進行解析,而你的真實 IP 地址和請求的域名都會被記錄下來。如果 DNS 請求解析一些敏感網站的域名(比如電報、維基解密等),就會被監管者注意到,從而被警告或者請去喝茶。1
因此,正確地配置代理工具的分流策略來避免 DNS 泄露就顯得尤為重要。
SmartDNS 的配置
防止 DNS 泄露
DNS 作為上網的指路人,排在第一位的要求就是必須要快,在這樣的要求下本地部署 SmartDNS 充當家庭網絡的 DNS 伺服器真的再合適不過了。關於 SmartDNS 的作用和配置技巧,以及其如何優選 CDN 加快網絡訪問速度,Sukka 的「我有特別的 DNS 配置和使用技巧」已經講的很好,推薦在繼續閲讀本文之前先去看看這篇文章,其中的內容我在這裏便不再贅述,我的敍述重心將會放在如何在 Luci 介面上實現這些配置。
如果你和我一樣使用 OpenWRT,SmartDNS 的 Luci App 會在每次啓動時根據面板上儲存的配置自動生成新的配置檔案,所以,不要直接修改/etc/smartdns目錄下原有的配置檔案,所有的更改都應該在 Luci App 裏操作。
基本上,SmartDNS 上游數量越多越好,因為較多的上游並不會影響 SmartDNS 的效能2,並且多個上游可以增加冗餘。為了防止 DNS 泄露,在配置上游時,應當在預設分組新增國外 DNS 上游(當然,最好是加密 DNS),並將國內的伺服器歸入一個單獨的分組(例如domestic),並加上-exclude-default-group的額外引數以將它們從預設分組中排除。

加速國內域名解析
設定好國外上游,DNS 泄露的問題就解決了,但因為我們在預設分組中排除了國內上游,訪問新的域名時需要等待國外上游返回結果,這顯然會拖慢國內網站的訪問速度,並且還會劣化 CDN。
dnsmasq-china-list 是 Felix Yan 的專案,目前支援透過 Makefile 生成 SmartDNS 格式的配置檔案,目前已經有人做好了現成的 Github Action 每天自動更新,直接下載就可以了,注意這些配置檔案只會在國內 DNS 上游分組名稱為domestic時生效。
| |
隨後在 SmartDNS 中引入這些配置檔案,將下面的內容貼上到「自定義設定」欄的末尾。
| |

這樣配置之後,國內域名的訪問速度便不再會受到影響,訪問國外域名時,也不會再有 DNS 泄露的問題了。

去廣告
DNS 層面的去廣告效果有限,重點應該放在防止誤殺上,所以不要用那臭名昭著3的號稱自己是「致力於成為中文區命中率最高的廣告過濾列表」的 Anti AD,而是使用一些別的規則。個人使用的規則是 217heidai/adblockfilters,這是一個已經整理好的聚合規則,直接拉取即可。
| |
最後引入配置檔案:
| |
自動更新規則
設定如下 Crontab 即可在每天凌晨三點自動更新所有規則。
| |
旁路由可以用嗎
除非不使用 IPv6,否則最好還是將 OpenWRT 路由器作為主路由。在作為旁路由的情況下,某些系統(説的就是你,Windows)會不遵守旁路由廣播的 IPv4 DNS,而執意使用運營商光貓廣播的 IPv6 DNS 進行解析,我嘗試修改過一些相關的登錄檔鍵值,但毫無作用。無奈只好讓運營商上門將光貓改為橋接模式,並將 OpenWRT 用作主路由。
覆寫 Clash 規則
這時如果你開着 Clash 去跑 DNS 泄露測試,大機率還是會看到你的 DNS 請求被髮到了中國的 DNS 伺服器上——幾乎所有機場的預設配置都會使用騰訊、阿里等國內大廠的加密 DNS,雖然不至於明文泄露到運營商 DNS 而導致你接到反詐中心的電話,但總讓人膈應 (強迫症犯了),更有甚者甚至完全沒有相關配置。
好在如果使用的是 Clash Verge Rev,那麼可以很方便的覆寫機場的配置,這裏分享我的覆寫配置,將其貼上到全域性擴充套件配置中即可覆寫機場的配置。
| |

配置解析
根據 Mihomo 文件4,其 DNS 請求的流程如下:
其中nameserver-policy的優先順序高於nameserver和fallback,指定geosite:cn中的網站以系統 DNS 查詢,也就是使用之前配置好的 SmartDNS 查詢,可以享受到區域網級別的響應速度和自帶測速的 CDN 選擇。而不在geosite:cn中的網站則使用nameserver/fallback查詢,使用國外加密上游就可以確保解析結果的可信並防止 DNS 泄露。
替換 geoip 和 geosite 數據庫
Mihomo 預設使用 V2Ray 官方的 geoip 和 geosite 數據庫,這個數據庫其實不太全,而且更新的頻率也很慢,所以我還是用 Loyalsoldier/v2ray-rules-dat 這個「加強版」數據庫替換了原來的數據庫,只需下載geoip.dat和geosite.dat以後丟進核心目錄即可。當然,也可以新增幾行覆寫配置以實現自動/一鍵更新:
| |
Clash Meta For Android
對於手機上的 Clash Meta For Android(以下簡稱 Clash),覆寫設定時需要更加考慮手機的實際情況。
首先手機上的 Clash 覆寫設定選項就不如桌面端的 Clash Verge Rev 這麼靈活,很多鍵值都不能覆寫。另外,手機不像電腦,需要經常切換網絡環境,這就導致系統 DNS 也會換得很頻繁,經測試,在這種情況下,每次更換網絡環境都需要開關一次 Clash 才能讓其更新system所代表的 DNS。於是我們只能退而求其次,固定一個國內加密 DNS 作為國內查詢。
進入 Clash ->「設定」->「覆寫」以下是所有覆寫設定:
- 「DNS」->「策略」:強制啓用
- 「DNS」->「Prefer h3」:已啓用
- 「DNS」->「Name Server」:新增兩個國外加密 DNS
- 「DNS」->「Name Server 策略」:在「鍵」一欄中填寫
geosite:cn,值一欄填寫https://doh.pub/dns-query
提前從 Github 上下載geoip.dat和geosite.dat,最後進入 Clash ->「設定」->「Meta Features」,分別用「匯入 GeoIP 數據庫」和「匯入 GeoSite 數據庫」功能匯入它們。
完成
最後再開啓一個 DNS 泄露測試,看一看問題是否解決,如果不再出現國內的 DNS,説明配置正確,好好享受 SmartDNS 和 Clash 帶來的網絡最佳化和防泄漏吧~

SmartDNS 在設計時就考慮到了延遲問題,具體機制可以蔘考「中場休息:SmartDNS 是如何避免因測速導致 DNS 解析過慢的」。 ↩︎
有人整理了 Anti AD 的光榮事蹟。 ↩︎

評論已停用,直到您接受功能性 Cookie。