寫在前面
復(fù)雜方案看起來高大上的樣子,但有可能并沒什么用,反而引入其他插件依賴,出問題排查更麻煩,所以我更推薦簡單方案
前面介紹了 openwrt 的插件時候挖了一個多級 DNS 的坑,現(xiàn)在補(bǔ)上
文章大綱如下
方案說明
AdGuard Home 本身是不具備域名解析分流功能,如果你看到的方案只有一個 AdGuard Home 對接兩組 smartdns,那基本沒啥用
普通方案
簡單暴力,就是引入 AdGuard Home 就可以了
啟用一個 AdGuard Home:
- 提供基于 dns 攔截 AD 功能(只能攔截一部分,效果沒想象中完美)
- 上游設(shè)置運(yùn)營商提供的兩個 DNS,然后額外補(bǔ)充 1-2 個公共 DNS,如 114DNS、DNSPOD 之類
- 設(shè)置作為 dnsmasq 的上游服務(wù)器
復(fù)雜方案
方案架構(gòu)如下:
用到的組件也比較常規(guī)了:
- dnsmasq,成熟的 dns 緩存服務(wù)
- chinadns-ng,負(fù)責(zé)維護(hù) chnroute 等列表,然后通過 dnsmasq 注入配置
- AdGuard Home,提供基于 dns 攔截 AD 功能
- smartdns,優(yōu)化域名解析,防污染
接下來就是從后往前的進(jìn)行配置
smartdns 配置
該工具主要提供了以下兩個功能:
- 海外國內(nèi)解析分流
- 最優(yōu)解析延遲返回
在配置上,雖然版本有所更替,但基本的配置內(nèi)容還是兼容的,如果是遷移路由可復(fù)制配置文件
/etc/config/smartdns
復(fù)制完成后執(zhí)行 reload_config 生效,而對于全新部署的場景,這里也提供一些我的一些配置參考
基礎(chǔ)配置說明
如上面的架構(gòu)圖,smartdns 是需要分兩個組的,對應(yīng)到配置就是:
- 默認(rèn)組(default),監(jiān)聽 6053 端口
- 海外組(oversea),監(jiān)聽 7053 端口
這兩者是互相獨(dú)立了,具體使用哪個組,是由下游的 dns 緩存來決定
國內(nèi)組
對應(yīng)的就是 smartdns 的基礎(chǔ)配置
- 勾選啟用
- 本地端口設(shè)置 6053
- 不需要勾選設(shè)置 dnsmasq,因?yàn)樽罱K還是要通過 dnsmasq 來提供服務(wù)
國內(nèi)組的上游 DNS,建議設(shè)置方式是:
- 最優(yōu)先使用運(yùn)營商分配的 DNS 緩存服務(wù)器,以確保就近解析、避免跨運(yùn)營商解析
- 額外再補(bǔ)充一些國內(nèi)公共 DNS,如 114DNS、DNSPOD、USTC 等
- 全部默認(rèn)使用 udp 協(xié)議即可
運(yùn)營商分配的 DNS 緩存服務(wù)器,可通過主路由的 WAN 狀態(tài)拿到,比如
這部分目前變化的情況非常少,并且即使失效了,smartdns 也會用上其他的 dns 來解析
這里以添加第一個 DNS 為例 211.136.192.6,在 smartdns 上點(diǎn)擊添加上游服務(wù)器
- DNS服務(wù)器名稱,廣東移動 1 號 DNS,對應(yīng) GD_CMCC #1
- 類型使用 udp 即可
- 端口保留默認(rèn) default,實(shí)際上就是 53 端口
- 服務(wù)器組也是保持默認(rèn)的 default 不用修改
依次完成國內(nèi)組服務(wù)器的添加,這里除了運(yùn)營商的 DNS 緩存,我也推薦一些 DNS:
- QINGHUA #1:166.111.8.28
- USTC #1:202.141.160.95
- 114DNS #1:114.114.114.114
- DNSPOD#1:119.29.29.29
上述配置統(tǒng)一使用 udp 協(xié)議、默認(rèn)端口、默認(rèn)服務(wù)器組即可
海外組
注意,如果你請求海外域名是走特殊網(wǎng)絡(luò)環(huán)境,那么海外組配置的上游 DNS 也必須跟著一起走,不然會出現(xiàn)繞路情況導(dǎo)致最終訪問效果較差
對應(yīng)的就是 smartdns 的第二 DNS 服務(wù)器
- 勾選啟用
- 本地端口設(shè)置 7053
- 服務(wù)器組設(shè)置為 oversea
- 下面一系列都是選擇逃過,不要求能解析到多優(yōu)秀的入口,只要能解析到就行
海外組的上游 DNS,建議設(shè)置方式是:
- 盡量使用 TLS、HTTPS 協(xié)議
- 盡量使用非標(biāo)準(zhǔn)端口
- 如果有合理的網(wǎng)絡(luò)條件,才考慮設(shè)置 UDP 協(xié)議 dns
這里以 cloudflare 的 https dns 為例:
- DNS服務(wù)器名稱,CloudFlare 1 號 DNS,對應(yīng) CloudFlare #1
- IP 填寫 cloudflare 的 https 解析入口
- 類型使用 https
- 服務(wù)器組修改為 oversea
最后在額外參數(shù)那里,增加 -exclude-default-group,避免默認(rèn)組使用到該上游 DNS
海外組的 DNS 除了知名的那些大家都懂的,這里也給一些我設(shè)置的:
- Quad9 #1,https,https://dns.quad9.net/dns-query
- Quad9 #2 TLS,tls,149.112.112.112,端口 853
- OpenDNS #1,udp,208.67.222.222 端口 443
AdGuardHome 設(shè)置
之前在硬路由的 openwrt 上用的是其他方案,遷移過來軟路由才使用 AdGuardHome,所以是從 0 開始配置
路由器固件已經(jīng)默認(rèn)帶了 AdGuardHome,所以直接進(jìn)入配置即可
更新核心版本
進(jìn)入服務(wù)配置頁面后,先點(diǎn)擊 更新核心版本
然后勾選啟用,再點(diǎn)擊保存并應(yīng)用,這個時候可以看到:AdGuardHome 運(yùn)行中未重定向
此頁面上其他配置都無需調(diào)整,點(diǎn)擊中間的按鈕進(jìn)入 AdGuardHome 的配置頁面進(jìn)行配置即可
配置使用
點(diǎn)擊開始配置,接下來需要設(shè)置兩個端口:
- 網(wǎng)頁管理界面:所有接口 3000 端口
- DNS 服務(wù)器:所有接口 8053 端口
再設(shè)置用戶名密碼,后續(xù)其他的就按照默認(rèn)即可,設(shè)置完成后會跳轉(zhuǎn)到登錄頁面,輸入用戶密碼登錄:
然后再頁面上方點(diǎn)擊 設(shè)置 - DNS 設(shè)置:
- 上游服務(wù)器輸入 smartdns 的國內(nèi)分組對應(yīng)端口 127.0.0.1:6053
- 同樣,Bootstrap DNS 服務(wù)器也是填入國內(nèi)分組 127.0.0.1:6053
bootstrap dns 并不是用來解析海外 dns 的,而是用來解析一些寫了域名的 DNS 服務(wù)器
最后點(diǎn)擊測試上游服務(wù)器,確認(rèn)能正常運(yùn)行即可,最后點(diǎn)擊 **應(yīng)用 **進(jìn)行保存
DNS 服務(wù)配置:
- 速度限制調(diào)整為 0,也就是不進(jìn)行限制
- 啟用 EDNS 客戶端子網(wǎng)
- 啟用 DNSSEC
- 因?yàn)樾枰玫?ipv6 解析,所以這個沒有禁用
緩存配置全部留空,由 smartdns 來管理
至此,DNS 基礎(chǔ)配置已經(jīng)完成,其他的加密設(shè)置、客戶端設(shè)置、DHCP 設(shè)置均用不到。
目前廣告商也都是在與時俱進(jìn)的,所以別想著一個 AdGuard Home 就能解決所有問題,只能攔截掉一部分
接下來進(jìn)入過濾器配置,這里主要添加了 4 個黑名單過濾廣告
在 AdGuardHome 配置完成后,回到 openwrt 后臺,繼續(xù)設(shè)置重定向:
這里選擇:作為dnsmasq的上游服務(wù)器
踩坑分享:日志配置
在配置完某一天,電腦訪問網(wǎng)頁出現(xiàn)打不開情況
但是通過 IP 的請求可以正常訪問,因此定位是 dns 問題,在路由器上一條鏈路排查下來
- dig www.baidu.com 失敗,代表 dnsmasq 及后續(xù)鏈路異常
- dig www.baidu.com @127.0.0.1:8053 失敗,代表 AdGuard Home 及后續(xù)鏈路異常
- dig www.baidu.com @127.0.0.1:6053 成功,代表 smartdns 正常
從上面的排查可以定位就是 AdGuard Home 問題,然后查看日志發(fā)現(xiàn)是磁盤被打滿了
主要是家里設(shè)備比較多,dns 請求頻繁,因此調(diào)整日志保留天數(shù),改到 6 小時
在設(shè)置->常規(guī)設(shè)置中,下拉找到日志配置,可考慮關(guān)閉日志,或者調(diào)整日志保留時間(默認(rèn)為 90 天)
chinadns-ng 設(shè)置
關(guān)于 chinadns-ng 這部分,我不是直接單獨(dú)使用這個插件,所以一些配置不好展開來講,僅提供一個配置思路
基礎(chǔ)說明
chinadns-ng 的作用就是區(qū)分國內(nèi)域名與海外域名(或者說容易污染的域名),進(jìn)行分流分別請求不同的上游 dns
- 對于國內(nèi)域名,設(shè)置上游為 AdGuard Home 對應(yīng)的 127.0.0.1:8053,最終走到 smartdns 的國內(nèi)組
- 對于海外域名,設(shè)置上游為 smartdns 的海外組,對應(yīng) 127.0.0.1:7053
配置
這里我并不是直接使用了 chinadns-ng 插件,而是通過了 passwa** 插件自定的 chinadns-ng
在對應(yīng)插件的基本設(shè)置中,進(jìn)入 DNS 配置頁面,進(jìn)行如下調(diào)整:
- 過濾模式通過 UDP 請求 DNS
- 遠(yuǎn)程 DNS 設(shè)置為 smartdns 的海外分組 127.0.0.1:7053
- 啟用 ChinaDNS-NG 功能
在進(jìn)行如上設(shè)置后,最終會在 dnsmasq 的子配置目錄下注入新的配置
其中 127.0.0.1#7053 就是 smartdns 的 oversea 分組,也就是可信 DNS,從而能獲取到正確域名解析
Dnsmasq 配置
基礎(chǔ)設(shè)置
實(shí)際上 dnsmasq 并不需要做什么特殊配置,在 AdGuard Home 那里設(shè)置了作為dnsmasq的上游服務(wù)器
對應(yīng)的 dnsmasq 會自動進(jìn)行如上設(shè)置調(diào)整,也就是將 AdGuard Home 作為 dnsmasq 的上游
踩坑分享:無法解析內(nèi)網(wǎng)域名
之前配置了之后,出現(xiàn)一些內(nèi)網(wǎng)域名無法解析,返回為空的情況,如下圖:
- 域名請求狀態(tài)為 NOERROR,也就是沒有錯誤
- 但是 ANSWER 為 0,代表沒有返回域名解析
依次進(jìn)行排查,發(fā)現(xiàn)請求上游 AdGuard Home 是正常的,對應(yīng)就是 127.0.0.1:8053
那么可以肯定就是 dnsmasq 的問題了,最終排查到是開了重定向保護(hù)導(dǎo)致的
原因就是開啟了該參數(shù)就會過濾掉外域名解析到私有 IP 地址,私有 ip 包含
寫在后面
復(fù)雜方案確實(shí)是挺復(fù)雜
- 不弄清楚原理,很容易就配置失敗或者配置了沒啥用效果
- 并且要正確解析海外那些域名,你需要一個“良好的網(wǎng)絡(luò)環(huán)境”,也就涉及到不止 dns 插件的配置了
目前我也是出于技術(shù)學(xué)習(xí)去搭建這些東西,不過也用了有半年錯沒啥問題:
- 效果不好說,因?yàn)槲乙矝]時間去做詳細(xì)的數(shù)據(jù)對比,比如解析耗時、解析準(zhǔn)確性
- 功能算是正常,至少沒有出現(xiàn)什么解析耗時過長、解析不了的問題
但是我還是推薦,跑一個 AdGuard Home 去設(shè)置 dnsmasq 重定向就行了,簡單可靠
ok,目前軟路由 openwrt 的內(nèi)容已經(jīng)基本完結(jié)了,除了開頭兩篇,還有這兩篇。后續(xù)再看看有什么好玩的可以分享~
作者聲明本文無利益相關(guān),歡迎值友理性交流,和諧討論~
,