寫在前面

復(fù)雜方案看起來高大上的樣子,但有可能并沒什么用,反而引入其他插件依賴,出問題排查更麻煩,所以我更推薦簡單方案

前面介紹了 openwrt 的插件時候挖了一個多級 DNS 的坑,現(xiàn)在補(bǔ)上

文章大綱如下

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

方案說明

AdGuard Home 本身是不具備域名解析分流功能,如果你看到的方案只有一個 AdGuard Home 對接兩組 smartdns,那基本沒啥用

普通方案

簡單暴力,就是引入 AdGuard Home 就可以了

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

啟用一個 AdGuard Home:

  • 提供基于 dns 攔截 AD 功能(只能攔截一部分,效果沒想象中完美)
  • 上游設(shè)置運(yùn)營商提供的兩個 DNS,然后額外補(bǔ)充 1-2 個公共 DNS,如 114DNS、DNSPOD 之類
  • 設(shè)置作為 dnsmasq 的上游服務(wù)器

復(fù)雜方案

方案架構(gòu)如下:

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

用到的組件也比較常規(guī)了:

  • dnsmasq,成熟的 dns 緩存服務(wù)
  • chinadns-ng,負(fù)責(zé)維護(hù) chnroute 等列表,然后通過 dnsmasq 注入配置
  • AdGuard Home,提供基于 dns 攔截 AD 功能
  • smartdns,優(yōu)化域名解析,防污染

接下來就是從后往前的進(jìn)行配置

smartdns 配置

該工具主要提供了以下兩個功能:

  1. 海外國內(nèi)解析分流
  2. 最優(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ù)

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

國內(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)拿到,比如

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

這部分目前變化的情況非常少,并且即使失效了,smartdns 也會用上其他的 dns 來解析

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

這里以添加第一個 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)秀的入口,只要能解析到就行

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

海外組的上游 DNS,建議設(shè)置方式是:

  • 盡量使用 TLS、HTTPS 協(xié)議
  • 盡量使用非標(biāo)準(zhǔn)端口
  • 如果有合理的網(wǎng)絡(luò)條件,才考慮設(shè)置 UDP 協(xié)議 dns

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

這里以 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

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

海外組的 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)擊 更新核心版本

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

然后勾選啟用,再點(diǎn)擊保存并應(yīng)用,這個時候可以看到:AdGuardHome 運(yùn)行中未重定向

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

此頁面上其他配置都無需調(diào)整,點(diǎn)擊中間的按鈕進(jìn)入 AdGuardHome 的配置頁面進(jìn)行配置即可

配置使用

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

點(diǎn)擊開始配置,接下來需要設(shè)置兩個端口:

  • 網(wǎng)頁管理界面:所有接口 3000 端口
  • DNS 服務(wù)器:所有接口 8053 端口

再設(shè)置用戶名密碼,后續(xù)其他的就按照默認(rèn)即可,設(shè)置完成后會跳轉(zhuǎn)到登錄頁面,輸入用戶密碼登錄:

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

然后再頁面上方點(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)行保存

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

DNS 服務(wù)配置:

  • 速度限制調(diào)整為 0,也就是不進(jìn)行限制
  • 啟用 EDNS 客戶端子網(wǎng)
  • 啟用 DNSSEC
  • 因?yàn)樾枰玫?ipv6 解析,所以這個沒有禁用

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

緩存配置全部留空,由 smartdns 來管理

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

至此,DNS 基礎(chǔ)配置已經(jīng)完成,其他的加密設(shè)置、客戶端設(shè)置、DHCP 設(shè)置均用不到。

目前廣告商也都是在與時俱進(jìn)的,所以別想著一個 AdGuard Home 就能解決所有問題,只能攔截掉一部分

接下來進(jìn)入過濾器配置,這里主要添加了 4 個黑名單過濾廣告

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

在 AdGuardHome 配置完成后,回到 openwrt 后臺,繼續(xù)設(shè)置重定向:

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

這里選擇:作為dnsmasq的上游服務(wù)器

踩坑分享:日志配置

在配置完某一天,電腦訪問網(wǎng)頁出現(xiàn)打不開情況

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

但是通過 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)是磁盤被打滿了

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

主要是家里設(shè)備比較多,dns 請求頻繁,因此調(diào)整日志保留天數(shù),改到 6 小時

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

設(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

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

在對應(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 的子配置目錄下注入新的配置

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

其中 127.0.0.1#7053 就是 smartdns 的 oversea 分組,也就是可信 DNS,從而能獲取到正確域名解析

Dnsmasq 配置

基礎(chǔ)設(shè)置

實(shí)際上 dnsmasq 并不需要做什么特殊配置,在 AdGuard Home 那里設(shè)置了作為dnsmasq的上游服務(wù)器

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

對應(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,代表沒有返回域名解析

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

依次進(jìn)行排查,發(fā)現(xiàn)請求上游 AdGuard Home 是正常的,對應(yīng)就是 127.0.0.1:8053

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

那么可以肯定就是 dnsmasq 的問題了,最終排查到是開了重定向保護(hù)導(dǎo)致的

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

原因就是開啟了該參數(shù)就會過濾掉外域名解析到私有 IP 地址,私有 ip 包含

openwrt 軟路由多級 DNS 配置學(xué)習(xí)分享

寫在后面

復(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),歡迎值友理性交流,和諧討論~

,

聲明:本站所有文章,如無特殊說明或標(biāo)注,均為本站原創(chuàng)發(fā)布。任何個人或組織,在未征得本站同意時,禁止復(fù)制、盜用、采集、發(fā)布本站內(nèi)容到任何網(wǎng)站、書籍等各類媒體平臺。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。