Skip to content

設定 DNS,並確認路由器、用戶端與瀏覽器各自使用的 DNS

你可以分別回答三個問題:

  • 路由器使用哪一個上游 DNS 伺服器?
  • 用戶端從 OpenWrt 取得哪一個 DNS 伺服器?
  • 瀏覽器是否透過 DoH 繞過系統解析器?

並且在變更失敗後,能夠回到可解析的狀態。

  • OpenWrt 25.12.6,預設為 dnsmasq + odhcpd;25.12 使用 apk,24.10 使用 opkg。
  • 檢查指令不需要額外安裝套件。若裝置執行 unbound 或 https-dns-proxy,請先確認是否由它們佔用 53 連接埠。
  • 24.10 的選單名稱與設定鍵相近,但套件指令不同;請勿把 apk 指令複製到 24.10。
位置 預設負責者 檢查項目
WAN 上游 DHCP/PPPoE 用戶端 cat /tmp/resolv.conf.d/resolv.conf.auto
路由器解析器 dnsmasq nslookup openwrt.org 127.0.0.1
LAN 通告 dnsmasq DHCP option 6 / odhcpd RDNSS 用戶端上顯示的 DNS
瀏覽器 系統解析器或瀏覽器 DoH 瀏覽器的安全 DNS 設定

更換 DNS 伺服器之前,請先判斷問題出在哪一層。

路由器 Shell備份 DHCP/DNS 設定
Terminal window
cp /etc/config/dhcp /etc/config/dhcp.bak.$(date +%F)
uci export dhcp > /tmp/dhcp.before
uci show dhcp | grep -E 'dns|resolv|server|option'

請保留一條連到 LuCI/SSH 的有線 LAN 路徑。不要讓唯一的管理路徑依賴你正在變更的 DNS。

預期已有備份,且你知道如何還原。

路由器 Shell讀取上游 DNS 與 dnsmasq 設定
Terminal window
cat /tmp/resolv.conf.d/resolv.conf.auto
uci show dhcp.@dnsmasq[0]
uci show network.wan | grep -E 'peerdns|dns'

/tmp/resolv.conf.d/resolv.conf.auto 由 WAN 用戶端寫入。請檢查實際的 dhcp.@dnsmasq[0].resolvfile 值。若 noresolv='1',dnsmasq 會忽略該檔案,改用它的 server 清單。

預期你能說出目前的 resolvfile、server 與 noresolv 值。

LuCI在 WAN 上設定自訂 DNS(最安全的第一個變更)

開啟 網路 → 介面 → WAN → 進階設定:

  1. 取消勾選「使用對端通告的 DNS 伺服器」(peerdns 變為 0)。
  2. 在「使用自訂 DNS 伺服器」下新增你信任的 DNS 伺服器,例如 1.1.1.1 與 9.9.9.9。
  3. 儲存並套用,必要時重新連線 WAN。

這會短暫中斷 WAN,但 LAN 的 DHCP/DNS 結構維持不變,因此較容易回復。

預期重新連線 WAN 後,上游解析器是你設定的值。

路由器 Shell確認 dnsmasq 正在監聽並已載入新的上游
Terminal window
netstat -lnp | grep ':53'
/etc/init.d/dnsmasq restart
logread -e dnsmasq | tail -20

若 dnsmasq 無法啟動,請停止修改 DHCP 選項,並依錯誤訊息找出語法錯誤或連接埠衝突。

預期53 連接埠正在監聽,記錄中沒有設定錯誤。

LuCI檢查通告給用戶端的 DNS

開啟 網路 → DHCP與DNS → DHCP 伺服器 → 進階設定,檢查「DHCP 選項」。沒有 option 6 時,用戶端通常以路由器的 LAN 位址作為 DNS;有 option 6 時,用戶端會直接取得該位址。

請勿讓用戶端指向沒有在 53 連接埠監聽的位址。

預期用戶端取得 OpenWrt 的 LAN 位址,或你刻意設定的 option 6。

路由器 ShellCLI 對應做法(選用)
Terminal window
uci set network.wan.peerdns='0'
uci -q delete network.wan.dns
uci add_list network.wan.dns='1.1.1.1'
uci commit network
ifup wan
cat /tmp/resolv.conf.d/resolv.conf.auto

變更後,使用 logread -e dnsmasq 確認新的上游。若用戶端仍取得舊的 DNS,請重新啟動 dnsmasq 或檢查 DHCP option 6。

預期resolv.auto 顯示 1.1.1.1,且查詢成功。

路由器 Shell在路由器上檢查 A 與 AAAA
Terminal window
nslookup openwrt.org 127.0.0.1
nslookup -type=AAAA openwrt.org 127.0.0.1

預期兩種查詢都有回應,沒有逾時。

電腦檢查用戶端實際取得的 DNS

Linux:

Terminal window
resolvectl status
cat /etc/resolv.conf
nslookup openwrt.org

Windows:

Terminal window
ipconfig /all
nslookup openwrt.org

macOS:

Terminal window
scutil --dns
nslookup openwrt.org

預期用戶端的 DNS 與 DHCP/靜態設定相符,且能解析名稱。

電腦檢查瀏覽器是否繞過路由器

Chrome/Edge:chrome://settings/security,或「隱私權和安全性 → 安全性 → 使用安全 DNS」。Firefox:設定 → 隱私權與安全性 → DNS over HTTPS。若 DoH 已開啟,系統解析器可能完全沒有被使用;這看起來就像「路由器 DNS 沒有生效」。

預期測試期間 DoH 已關閉,或你清楚知道它指向哪裡。

電腦檢查 IPv6 解析與 RA/RDNSS
Terminal window
nslookup -type=AAAA openwrt.org
ip -6 route

當上游沒有 IPv6 前綴時,不要從 IPv4 的結果推論 IPv6 DNS 正常。

預期有 IPv6 上游時 AAAA 可解析;否則記錄缺少的條件。

先懷疑 DNS:

  1. 檢查用戶端解析器:resolvectl status、ipconfig /all 或 scutil --dns。
  2. 在路由器上檢查 53 連接埠與 dnsmasq 記錄:netstat -lnp | grep ':53'、logread -e dnsmasq。
  3. 檢查瀏覽器 DoH,並暫時停用。
  4. 檢查 DHCP option 6 是否有錯誤的位址。

停止變更 DNS。將有線用戶端接上 LAN,為它設定同一子網路的靜態位址,並確認閘道是 OpenWrt 的 LAN 位址。再從主控台或 SSH 還原:

Terminal window
cp /etc/config/dhcp.bak.YYYY-MM-DD /etc/config/dhcp
uci commit dhcp
/etc/init.d/dnsmasq restart

若你修改了 WAN DNS,請還原為自動取得的上游 DNS:

Terminal window
uci set network.wan.peerdns='1'
uci -q delete network.wan.dns
uci commit network
ifup wan

已變更 WAN DNS,但用戶端仍使用舊的解析器

Section titled “已變更 WAN DNS,但用戶端仍使用舊的解析器”

先檢查 resolv.auto 是否改變,再檢查 dnsmasq 是否載入了新的上游:

Terminal window
cat /tmp/resolv.conf.d/resolv.conf.auto
logread -e dnsmasq | tail -20
/etc/init.d/dnsmasq restart

若 resolv.auto 沒有改變,請檢查 network.wan.dns 與 peerdns。若用戶端仍取得舊的 DNS,請檢查 DHCP option 6 與瀏覽器 DoH。

請閱讀錯誤訊息,不要反覆重新啟動:

Terminal window
logread -e dnsmasq | tail -50
dnsmasq --test

常見原因是其他解析器佔用 53 連接埠、語法錯誤,或上游無法連線。請先還原備份,再逐項重新加入自訂設定。

  • 環境:PVE 9.2.2 單網卡;OpenWrt 25.12.6 VM 200;WAN 192.168.50.77/24,LAN 192.168.1.1/24。
  • 基準:resolv.auto 為 nameserver 192.168.50.1;nslookup openwrt.org 127.0.0.1 回傳 A/AAAA。
  • 自訂:peerdns=0 + network.wan.dns=1.1.1.1;resolv.auto 變為 nameserver 1.1.1.1;查詢仍然成功。
  • 失敗情境:將 dnsmasq 上游設為無法連線的 192.0.2.1;隨機的 .example.com 查詢回傳 connection timed out; no servers could be reached;刪除 noresolv/server 並還原 peerdns=1 後,解析恢復。
  • 用戶端:netns DHCP 取得 192.168.1.116/24,DNS 為 192.168.1.1;dig @192.168.1.1 openwrt.org 成功;ping 192.168.50.1 成功。
  • 未測試:瀏覽器 DoH、IPv6 上游/RA/RDNSS、實體 LAN 用戶端、長時間穩定性。
  • 本頁有 E2 實驗室重現;瀏覽器 DoH 與 IPv6 上游仍未測試,不可描述為已驗證。
  • 證據:docs/dns-e2-run.md 與 tests/recipes/dns-25.12-x86.md。
  • 選單或版本改變時,請更新 testedVersions 與 lastVerifiedAt;不要把 24.10 的 opkg 指令放進 25.12 的流程。

來源

Router.Homes

獨立的 OpenWrt 實作筆記。每頁都寫明韌體、裝置、套件管理員與復原途徑。

圖示:Solar by 480 Design, CC BY 4.0