AdGuard Home:從網頁介面到用戶端過濾
- AdGuard Home 佔用 OpenWrt 的
53連接埠;網頁介面在3000。 dnsmasq移到5353,並繼續提供 DHCP。- DHCP 用戶端取得
192.168.2.1作為 DNS。 - 自訂過濾規則會封鎖測試網域,而一般網域名稱仍可正常解析。
- 資料磁碟、AGH 設定與過濾規則在重新開機後仍然存在。
適用環境與拓樸
Section titled “適用環境與拓樸”- PVE 9.2.2 單網卡;OpenWrt 25.12.6 x86_64 VM 201(1GB RAM、2GB 資料磁碟)。
- WAN
net0接在vmbr0(DHCP);LANnet1接在隔離的vmbr2(192.168.2.0/24)。 - AGH 0.107.79,來自 OpenWrt 的
apk軟體源。 - 不要讓兩台都執行 DHCP 的 OpenWrt VM 共用同一個橋接:此測試環境中 VM 200 在
vmbr1(192.168.1.0/24),所以 VM 201 必須使用vmbr2(192.168.2.0/24)。否則用戶端可能從錯誤的子網路取得租約。
| 實體連接埠 | PVE bridge | 虛擬網路卡 | OpenWrt 介面 | 職責 |
|---|---|---|---|---|
| nic0 | vmbr0 | net0 | wan DHCP | upstream 192.168.50.1 |
| — | vmbr2 | net1 | lan 192.168.2.1 | AGH + DHCP clients |
連接埠與職責
Section titled “連接埠與職責”| 連接埠 | 元件 | 角色 |
|---|---|---|
| 53 | AdGuard Home | 用戶端 DNS、過濾、上游轉送 |
| 3000 | AdGuard Home | 網頁介面 |
| 5353 | dnsmasq | DHCP 與本地 DNS;不再使用 53 |
不要讓 AGH 與 dnsmasq 同時綁定 53。不要把 DHCP option 6 指向沒有在 53 上監聽的位址。
修改任何東西之前
Section titled “修改任何東西之前”cp /etc/config/dhcp /etc/config/dhcp.bak.$(date +%F)cp /etc/config/adguardhome /etc/config/adguardhome.bak.$(date +%F) 2>/dev/null || truecat /etc/config/dhcp請保留對 OpenWrt 的主控台或 LAN 存取。不要讓唯一的管理途徑依賴你正在修改的 DNS。
預期你可以還原 dnsmasq/AGH 的設定。

apk updateapk add adguardhome block-mount e2fsprogse2fsprogs 提供 mkfs.ext4;block-mount 提供 fstab 服務。使用本地的 OpenWrt 鏡像站也可以,但套件仍必須通過簽章檢查。
預期已安裝 adguardhome、block-mount 與 e2fsprogs。
只能在你確認為空的測試用資料磁碟上執行:
mkfs.ext4 -F /dev/sdbmkdir -p /opt/aghmount /dev/sdb /opt/aghblock info /dev/sdb使用 block info 印出的 UUID。在 LuCI 的 Mount Points 中,把該磁碟的目標設為 /opt/agh 並啟用;或從命令列找到對應的 @mount[n]:
uci show fstab# find the @mount[n] whose uuid is <your-UUID>uci set fstab.@mount[n].target='/opt/agh'uci set fstab.@mount[n].enabled='1'uci commit fstab/etc/init.d/fstab enableblock mountmount | grep /opt/agh此測試環境使用自動偵測到的 fstab.@mount[2] 作為 2GB 資料磁碟;將其目標改為 /opt/agh 並啟用後運作正常。不要照抄 [2];請以你的 UUID 為準。
預期/opt/agh 位於獨立的磁碟上,並且重新開機後仍然存在。
uci set dhcp.@dnsmasq[0].port='5353'uci commit dhcp/etc/init.d/dnsmasq restartnetstat -lnp | grep -E ':53|:5353'在 AGH 啟動之前,用戶端無法透過 53 解析網域名稱。
預期53 連接埠已釋放,且 DHCP 仍可運作。
uci set adguardhome.config.work_dir='/opt/agh/work'uci commit adguardhomemkdir -p /opt/agh/workchown -R adguardhome:adguardhome /opt/agh /etc/adguardhome/etc/init.d/adguardhome enable/etc/init.d/adguardhome startsleep 3netstat -lnp | grep -E ':3000|:53'開啟 http://192.168.2.1:3000/ 並設定:
- 網頁連接埠
3000; - DNS 連接埠
53; - 管理員使用者名稱/密碼;
- 此測試環境的上游 DNS 為
192.168.50.1; - 如果上游不做 DNSSEC 驗證,請停用 DNSSEC。
如果沒有瀏覽器,請使用 AGH 的設定 API;切勿提交管理員密碼。
預期可以在 3000 連接埠開啟網頁介面。
uci add_list dhcp.lan.dhcp_option='6,192.168.2.1'uci commit dhcp/etc/init.d/dnsmasq restartuci show dhcp.lan | grep dhcp_option只更改 dnsmasq 連接埠,可能會讓部分用戶端收不到 DNS;請明確設定 option 6。
預期用戶端取得 192.168.2.1 作為 DNS。
在 Filters → Custom filtering rules 中新增:
||blocked.example^這是保留的測試網域。實際使用時,之後再加入有人維護的過濾清單。請以 nslookup 驗證,而不是憑「網頁看起來壞了」判斷。
預期blocked.example 回傳 0.0.0.0;一般網域名稱仍可解析。

netstat -lnp | grep -E ':53|:3000|:5353'nslookup blocked.example 192.168.2.1nslookup openwrt.org 192.168.2.1預期結果:blocked.example 回傳 0.0.0.0(IPv6 也可能顯示 ::);openwrt.org 回傳真實位址。
預期AGH 監聽 53/3000;dnsmasq 監聽 5353。
ip addr showip routecat /etc/resolv.confnslookup blocked.examplenslookup openwrt.org如果用戶端的 DNS 不是 192.168.2.1,請回頭檢查 DHCP option 6 與 dnsmasq 連接埠。
預期用戶端取得 192.168.2.x 與 DNS 192.168.2.1。
reboot重新開機後:
mount | grep /opt/aghnetstat -lnp | grep -E ':53|:3000'nslookup blocked.example 192.168.2.1nslookup openwrt.org 192.168.2.1預期資料磁碟已掛載、AGH 已啟動,且規則仍然存在。
失敗分支與復原
Section titled “失敗分支與復原”AGH 無法啟動 / 53 連接埠被佔用
Section titled “AGH 無法啟動 / 53 連接埠被佔用”logread | grep -i adguard | tail -50netstat -lnp | grep ':53'/usr/bin/AdGuardHome --check-config -c /etc/adguardhome/adguardhome.yaml如果 dnsmasq 仍佔用 53,請確認 dhcp.@dnsmasq[0].port='5353'。設定檔有誤時,還原備份:
cp /etc/adguardhome/adguardhome.bak.YYYY-MM-DD /etc/adguardhome/adguardhome.yaml/etc/init.d/adguardhome restart用戶端完全無法解析
Section titled “用戶端完全無法解析”暫時把 DNS 還給 dnsmasq:
uci set dhcp.@dnsmasq[0].port='53'uci -q delete dhcp.lan.dhcp_optionuci commit dhcp/etc/init.d/dnsmasq restart/etc/init.d/adguardhome stop先恢復基本解析,再一層一層除錯 AGH。
資料磁碟未掛載
Section titled “資料磁碟未掛載”mount | grep /opt/aghblock info /dev/sdblogread | grep -i fstab檢查 fstab 的 UUID、target 與 enabled 旗標;手動掛載後,再重新啟動 AGH。
過濾沒有作用
Section titled “過濾沒有作用”
- 確認用戶端確實使用 AGH 作為 DNS。
- 確認規則位於 Custom filtering rules 下,而不是訂閱清單。
- 直接查詢 AGH:
nslookup blocked.example 192.168.2.1。 - 瀏覽器或作業系統的 DoH 可能繞過 AGH。
E2 實驗室測試(2026-10-20)
Section titled “E2 實驗室測試(2026-10-20)”- 環境:PVE 9.2.2 單網卡;OpenWrt 25.12.6 VM 201(1GB/2GB 資料磁碟);AGH 0.107.79。
- 連接埠:AGH
53+ 網頁3000;dnsmasq5353;DHCP option 6192.168.2.1。 - 用戶端:DHCP
192.168.2.166/24,DNS192.168.2.1;blocked.example→0.0.0.0,openwrt.org→64.226.122.113。 - 重新開機:
/opt/agh透過 fstab 掛載;AGH、dnsmasq 與過濾規則皆已恢復;網頁回傳 302。 - 未測試:真實瀏覽器的介面操作、外部訂閱清單、實體 LAN 用戶端、IPv6、長時間穩定性。
- 這是 E2 實驗室紀錄;尚未經過獨立審閱,也未在實體 LAN 上測試。
- 測試配方:
tests/recipes/agh-25.12-vm201.md;環境筆記:docs/agh-e2-run.md。 - 套件/版本變動時,請更新
testedVersions;不要在不同韌體版本之間複製 init 腳本。