AdGuard Home 架設教學:私人 DNS 過濾與按域名分流上游

AdGuard Home 架設教學:私人 DNS 過濾與按域名分流上游

Marcus Reid
2026年10月14日· 7 分鐘讀完

穩妥的 AdGuard Home 架設做法,是把解析服務放在一部區域網絡主機上,只回應你列明的裝置;指定域名交由各自的上游 DNS 處理,其餘查詢一律經一個加密的預設上游。先以一部裝置試用,確認過濾有效、沒有洩漏,並保留已驗證的還原方法。

關鍵要點:

  • 固定一個發行版本並核對雜湊值,改動前先記錄主機原有的解析設定。
  • 以可撤回的方式,讓 systemd-resolved 的 stub 監聽騰出 53 端口。
  • 防火牆規則與允許客戶端清單共同決定誰能得到回應,兩者都要設定。
  • 按域名指定上游,把本地名稱和公司域名交給各自的伺服器。
  • 先還原裝置設定,再解除安裝服務並恢復解析設定。

AdGuard Home 架設前要準備甚麼?

準備一部家中區域網絡內的原生 Ubuntu 24.04 LTS x64 主機,或一部只能經私人網絡連接的 VPS,另加一部由你控制的測試裝置。本文以 AdGuard Home v0.107.79 為準,該版本於 2026 年 8 月 18 日發布。[1] 本文依據下列官方來源整理,未完成完整端到端實測。

AdGuard 官方說明了壓縮檔安裝、服務指令和端口:首次執行的設定精靈使用 TCP 3000,網頁介面預設使用 TCP 80,DNS 則用 UDP 53。[2] GitHub 上的舊 Wiki 已標示過時並指向 Knowledge Base,指令有出入時以 Knowledge Base 為準。[3]

長期運作的解析器代表持續維護,可先參考自行架設服務的維護責任總覽評估。本文有別於 Pi-hole 單一裝置試用,也不同於自行架設 Unbound 遞迴解析器:AdGuard Home 負責轉發查詢,並容許你按域名揀選上游。域名封鎖本身亦有任何解析器都無法消除的限制,可參閱 DNS 廣告封鎖的實際運作方式。

如主機屬於共用的正式環境、由他人管理,或 53 端口可從互聯網連入,請停止操作。切勿把這個解析器公開到互聯網。

哪些名稱應交給哪個上游?

AdGuard Home 可使用一般 DNS、DNS-over-TLS(tls://)、DNS-over-HTTPS(https://)、DNS-over-QUIC(quic://)及 DNS stamps 作為上游。以 [/example.local/] 加伺服器位址寫成的一行,會把該域名及其子域名送往該伺服器;# 則代表「使用預設上游」。[4]

查詢類型建議上游原因
公共域名一個加密的預設上游網絡供應商不再看到明文查詢
路由器本地名稱,例如 .lan路由器的區域網絡位址只有路由器知道這些名稱
公司或實驗室域名該網絡的內部解析器公共解析器無法回應
私人位址的反向查詢Private reverse DNS servers 欄位AdGuard 要求私人網段寫在這裏

步驟 1:記錄基線並下載固定版本

先保存現時的解析狀態,方便日後原樣還原:

readlink -f /etc/resolv.conf
resolvectl status
sudo ss -lntup

在 Ubuntu 上,systemd-resolved 於 127.0.0.53 和 127.0.0.54 執行 stub 監聽,而 /etc/resolv.conf 通常指向 stub 檔案。[5] 記下區域網絡介面、主機的區域網絡位址、測試裝置位址和管理裝置位址。

趁主機 DNS 仍然正常時下載發行檔,並以官方公布的校驗檔核對:

cd "$(mktemp -d)"
VER='v0.107.79'
BASE="https://github.com/AdguardTeam/AdGuardHome/releases/download/$VER"
curl -fLO "$BASE/AdGuardHome_linux_amd64.tar.gz"
curl -fLO "$BASE/checksums.txt"
sha256sum -c --ignore-missing checksums.txt
tar -xzf AdGuardHome_linux_amd64.tar.gz
sudo mv AdGuardHome /opt/AdGuardHome

校驗結果顯示 OK 才繼續。若 /opt/AdGuardHome 已經存在,先停下查明是誰安裝的。

步驟 2:首次啟動前先收緊防火牆

首次執行時程式監聽 0.0.0.0:3000,區域網絡內任何裝置都能開啟設定精靈。[2] 在已經覆核、預設拒絕入站的 UFW 政策下,只放行今次試用所需的流量;請替換介面名稱及位址:[6]

LAN_IF='enp1s0'
TEST_V4='192.168.1.25'
ADMIN_V4='192.168.1.10'
sudo ufw allow in on "$LAN_IF" from "$TEST_V4" to any port 53 proto udp
sudo ufw allow in on "$LAN_IF" from "$TEST_V4" to any port 53 proto tcp
sudo ufw allow in on "$LAN_IF" from "$ADMIN_V4" to any port 3000 proto tcp
sudo ufw status numbered

保留 SSH 規則和本機主控台。若 UFW 尚未啟用,應先建立預設拒絕政策,而不是略過這一步。

步驟 3:處理 AdGuard Home 53 端口衝突

DNSStubListener=no 會關閉 stub 監聽,而 /etc/systemd/resolved.conf.d/ 內的片段檔會覆蓋主設定檔。[7] AdGuard 的 FAQ 提供以下手動修正方法,並指明 DNS=127.0.0.1 這一行不可缺少:[8]

sudo mkdir -p /etc/systemd/resolved.conf.d
printf '[Resolve]\nDNS=127.0.0.1\nDNSStubListener=no\n' | sudo tee /etc/systemd/resolved.conf.d/adguardhome.conf
sudo mv /etc/resolv.conf /etc/resolv.conf.backup
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl reload-or-restart systemd-resolved
sudo ss -lntup | grep ':53 '

最後一個指令在 53 端口上應該沒有輸出。此後主機本身的域名查詢會失敗,直至 AdGuard Home 在 127.0.0.1 上回應,所以下載要放在前面。設定精靈也有針對這個衝突的 Fix 按鈕;手動做法會留下一個日後可直接刪除的檔案。[8]

步驟 4:安裝服務並完成設定精靈

cd /opt/AdGuardHome
sudo ./AdGuardHome -s install
sudo ./AdGuardHome -s status

在管理裝置開啟 http://HOST_LAN_IP:3000。在設定精靈中,把管理網頁介面綁定到主機區域網絡位址的 3000 端口,把 DNS 伺服器綁定到區域網絡位址的 53 端口,並建立一個使用長而獨特密碼的管理員帳戶。[2]

步驟 5:收窄監聽位址、客戶端及日誌

只可在服務停止時編輯設定檔,因為運作中的程式會覆寫檔案改動。[9] 只修改現有分節內的以下鍵值:

sudo /opt/AdGuardHome/AdGuardHome -s stop
sudoedit /opt/AdGuardHome/AdGuardHome.yaml
http:
  address: 192.168.1.53:3000
dns:
  bind_hosts:
    - 127.0.0.1
    - 192.168.1.53
  port: 53
  allowed_clients:
    - 127.0.0.1
    - 192.168.1.25
querylog:
  enabled: true
  interval: 24h
statistics:
  interval: 24h

bind_hosts 限定在哪些位址提供 DNS;allowed_clients 清單不是空的時候,只有清單內的位址能得到回應。[9] 保留回送位址,是因為主機本身現時經 127.0.0.1 解析。查詢日誌輪替可設為 1h 至 8760h,試用期間保留一天已足夠。若不需要按客戶端記錄,可在 dns 下設定 anonymize_client_ip: true。[9]

sudo /opt/AdGuardHome/AdGuardHome --check-config --config /opt/AdGuardHome/AdGuardHome.yaml
sudo /opt/AdGuardHome/AdGuardHome -s start
getent hosts example.com

客戶端數目已知時,AdGuard 建議使用 Settings → DNS settings → Access settings 內的 Allowed clients 欄位,並提醒開放式解析器容易被濫用。[10]

步驟 6:只更改一部裝置並確認查詢到達

在測試裝置上把 DNS 手動設為主機的區域網絡位址,只填這一項。不要保留公共後備解析器,並在測試用的瀏覽器設定檔中關閉安全 DNS,確保查詢真正到達 AdGuard Home。然後在該裝置執行:

nslookup example.com 192.168.1.53
nslookup example.com

兩次查詢都應連同測試裝置位址出現在 Query log。如只看到明確指定伺服器的那一次,代表裝置仍在使用其他解析器。

步驟 7:按域名設定 AdGuard Home 上游 DNS

在 Settings → DNS settings → Upstream DNS servers 每行填寫一個上游;請替換路由器和公司的位址:

https://unfiltered.adguard-dns.com/dns-query
[/lan/]192.168.1.1
[/corp.example/]10.20.0.53
[/public.corp.example/]#

第一行是 AdGuard DNS 不作過濾的 DNS-over-HTTPS 位址,過濾只在你自己的實例進行。[11] DoH 上游以域名表示,所以要在 bootstrap DNS 欄位(bootstrap_dns)保留一個一般解析器,例如 94.140.14.140。[9][11] 最後一行把一個子域名交回預設上游;若寫成 [/*.corp.example/],只會配對子域名,並不包括 corp.example 本身。[4]

把路由器位址填入 Private reverse DNS servers,因為 AdGuard 只會把私人網段的反向查詢送往那裏。[4] 重複步驟 6 的查詢,再查詢一個 .lan 名稱,並在日誌中核對上游一欄。

步驟 8:驗證過濾、單項例外及洩漏

在 Filters → Custom filtering rules 加入 ||example.org^,即可封鎖該域名及其子域名。再加入 @@||example.org^ 解除封鎖;以 ! 或 # 開頭的行屬註解。[12]

檢查方法預期現象失敗時處理
只有封鎖規則時執行 nslookup example.org日誌標示為已封鎖確認裝置使用該主機且規則已儲存
加入例外後重複同一查詢日誌重新標示為允許刪除凌駕例外的 $important 規則
查詢一個 .lan 名稱由路由器回應檢查 [/lan/] 一行及路由器位址
以一部未列入清單的自家裝置查詢沒有回應修正 allowed_clients 或防火牆
在測試裝置做 DNS 洩漏測試只出現預設上游的解析器排查後備解析器、IPv6 DNS 或瀏覽器 DNS

最後一項可按這套 DNS 洩漏檢查方法進行。IPv6 DNS 是另一條路徑:要麼設定並限制 IPv6 監聽,要麼把今次試用清楚標明為只限 IPv4。完成檢查後刪除兩條測試規則。

步驟 9:還原裝置改動並解除安裝

先還原測試裝置原有的 DNS 設定,確認新的查詢可正常返回,才處理主機。AdGuard 提醒先把裝置改用其他 DNS,再執行解除安裝指令並刪除目錄。[8]

sudo /opt/AdGuardHome/AdGuardHome -s uninstall
sudo rm /etc/systemd/resolved.conf.d/adguardhome.conf
sudo rm /etc/resolv.conf
sudo mv /etc/resolv.conf.backup /etc/resolv.conf
sudo systemctl restart systemd-resolved
getent hosts example.com

把 readlink -f /etc/resolv.conf 和 resolvectl status 的結果與步驟 1 對照。按編號只刪除今次試用加入的 UFW 規則。如日後可能再用,先私下保存一份 AdGuardHome.yaml,再刪除 /opt/AdGuardHome。

總結

  • 固定並核對發行版本,改動前記錄解析設定。
  • 以可刪除的片段檔騰出 53 端口,不要貿然停用解析服務。
  • 同時以防火牆規則和 allowed_clients 限制回應對象。
  • 本地及公司域名交給各自上游,公共域名保留一個加密預設上游。
  • 先還原裝置,再解除安裝服務,並把主機恢復到原有的解析設定。

常見問題

不停用 systemd-resolved 也能執行 AdGuard Home 嗎?

可以。只需以片段檔關閉它的 stub 監聽;systemd-resolved 會繼續運作,並把主機本身的查詢轉發至 127.0.0.1。

設定精靈為何顯示 address already in use?

53 端口已被其他程式佔用,通常是 systemd-resolved 的 stub 監聽。按步驟 3 加入片段檔,或使用精靈內的 Fix 按鈕即可處理。

上游設定中的井號代表甚麼?

域名區塊後的 # 表示該域名不使用指定伺服器,而是交由預設上游處理,常用來把個別子域名排除在專用上游以外。

一定要用加密上游嗎?

並非必要,但公共域名建議使用。明文上游查詢會被網絡路徑上的設備和網絡供應商看到,加密後可減少這類暴露。

把 53 端口開放到互聯網安全嗎?

不安全。開放式解析器容易被濫用,DNS 服務應只留在區域網絡或私人網絡內,並明確列出允許的客戶端位址。

封鎖已經生效,為何仍看到部分廣告?

DNS 規則以整個域名為單位封鎖。與內容同一域名投放的廣告、快取頁面以及瀏覽器自設的 DNS,都可能繞過這些規則。

解除安裝 AdGuard Home 會自動還原我的 DNS 嗎?

不會。要先還原每部裝置的 DNS 設定,再刪除 resolved 片段檔,並把保存的 resolv.conf 連結放回原位。

免責聲明:本文步驟依據官方文件整理,並非已完成測試的紀錄。只在獲授權的主機和裝置上操作,並保留可用的復原途徑。

來源:

  1. AdGuard Home v0.107.79 release — https://github.com/AdguardTeam/AdGuardHome/releases/tag/v0.107.79
  2. AdGuard Home Getting Started — https://adguard-dns.io/kb/adguard-home/getting-started/
  3. AdGuard Home Wiki — https://github.com/AdguardTeam/AdGuardHome/wiki
  4. AdGuard Home Wiki: Configuration — https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration
  5. Ubuntu Manpage: systemd-resolved.service — https://manpages.ubuntu.com/manpages/noble/man8/systemd-resolved.service.8.html
  6. Ubuntu Firewall — https://ubuntu.com/server/docs/how-to/security/firewalls/
  7. Ubuntu Manpage: resolved.conf — https://manpages.ubuntu.com/manpages/noble/man5/resolved.conf.5.html
  8. AdGuard Home FAQ — https://adguard-dns.io/kb/adguard-home/faq/
  9. AdGuard Home Configuration — https://adguard-dns.io/kb/adguard-home/configuration/
  10. AdGuard Home Running Securely — https://adguard-dns.io/kb/adguard-home/running-securely/
  11. AdGuard DNS Known DNS Providers — https://adguard-dns.io/kb/general/dns-providers/
  12. AdGuard DNS Filtering Rules Syntax — https://adguard-dns.io/kb/general/dns-filtering-syntax/

Sources checked 2026 年 10 月 14 日。


延伸閱讀:

開啟 3 天免費試用

註冊即可免費體驗全部高級功能。

*只限新用戶;每位用戶只可獲得一次試用。

AdGuard Home 架設教學:私人 DNS 過濾與按域名分流上游 | AethoVPN