你的 HTTPS 流量是加密的,但 DNS 查詢不是。
每次你的裝置要連到某個網站,它必須先查詢 DNS 把網域名稱解析成 IP 位址。這個查詢預設走 UDP port 53,完全明文,路徑上的每個路由器、你的 ISP、乃至公共 Wi-Fi 的管理者,都能看到你在查哪些網域。對一般瀏覽者來說是隱私問題,對企業和開發者來說還有資安風險。
DNS-over-HTTPS(DoH)和 DNS-over-TLS(DoT)就是為了解決這個問題而設計的。兩者都把 DNS 查詢包在加密連線裡,讓中間節點看不到內容。
DoH 和 DoT 的差異
兩個協定都解決同一個問題,但方式不同:
DoT(DNS-over-TLS) 在 TCP port 853 上跑,把 DNS 查詢包在 TLS 連線裡。優點是明確可識別——防火牆可以直接針對 port 853 做管理策略,不會跟其他流量混在一起。缺點也一樣,防火牆也可以直接封鎖 853 就把 DoT 擋掉。
DoH(DNS-over-HTTPS) 把 DNS 查詢包在標準的 HTTPS 請求裡,走 port 443,從外部看起來跟普通的 HTTPS 流量沒有區別。穿透能力更強,幾乎不可能被選擇性封鎖。代價是對中間設備的可控性較低。
對個人和小團隊的自架場景,兩者效果相近。如果你的網路環境會封鎖非標準 port,選 DoH。如果需要在網路設備層面做清晰的流量分類,選 DoT。
為什麼 Pi-hole + cloudflared 的組合已經過時
過去常見的做法是 Pi-hole + cloudflared,讓 Pi-hole 的上游 DNS 查詢走 DoH。但 Cloudflare 已在 2025 年 11 月宣布棄用 cloudflared 的 proxy-dns 功能,2026 年 2 月起更新後即失效。這條路徑已正式走入歷史。
AdGuard Home 原生支援 DoH、DoT 和 DoQ(DNS-over-QUIC),不需要任何額外的 proxy daemon,設定比以前的組合乾淨許多。
在 VPS 上部署 AdGuard Home
用 Docker Compose 是最好維護的方式:
1 | # /opt/adguard/compose.yaml |
1 | cd /opt/adguard |
第一次啟動後,瀏覽 http://你的IP:3000 進行初始設定 wizard:設定管理員帳號密碼、選擇 DNS 監聽介面。完成後管理介面在 port 80(或你設定的 HTTPS port)。
一定要釘定版本號,不要用 latest。AdGuard Home 更新快,偶爾有 breaking change,生產環境用 adguard/adguardhome:v0.107.x。
設定加密上游 DNS
在管理介面的「設定 → DNS 設定 → 上游 DNS 伺服器」,把 ISP 的 DNS 改成加密的:
1 | # Cloudflare DoH |
可以同時填多個,AdGuard Home 會平行查詢,取最快回應。臺灣用戶用 Cloudflare(1.1.1.1 的 DoH/DoT)通常延遲最低。
「Bootstrap DNS 伺服器」是用來解析上游 DoH 伺服器的網域名稱本身(因為要先知道 dns.cloudflare.com 的 IP 才能建立 DoH 連線),填 1.1.1.1 或 8.8.8.8 即可,這個查詢還是明文,但只有一次。
讓 AdGuard Home 自己處理 HTTPS 憑證
要讓 DoH 和 DoT 正常運作,需要有效的 TLS 憑證。在「設定 → 加密設定」裡填入:
- 伺服器名稱:你的 DNS 伺服器網域(例如
dns.yourdomain.com) - 憑證路徑和私鑰路徑
搭配 Certbot 或 Caddy 取得 Let’s Encrypt 憑證。如果用 Nginx 反代,把 AdGuard Home 的 HTTPS port 改到非 443,讓 Nginx 處理 TLS termination:
1 | # /etc/nginx/sites-available/dns |
這樣 DoH 的 /dns-query 路徑對外開放,管理介面只有特定 IP 能存取,兩者不衝突。
在裝置上啟用加密 DNS
iOS / macOS:設定 → Wi-Fi → DNS → 設定為 DoH 或 DoT(需要從 iOS 14 / macOS 11 起)。或在「一般 → VPN 與裝置管理」安裝設定描述檔。
Android(9+):設定 → 網路 → 進階 → 私密 DNS → 填入 dns.yourdomain.com(這走的是 DoT)。
Windows 11:設定 → 網路 → 乙太網路 / Wi-Fi → DNS 伺服器 → 手動設定 → 填入 DoH 伺服器位址 → 加密選擇「僅限加密」。
Linux(systemd-resolved):
1 | # /etc/systemd/resolved.conf |
廣告攔截與 DNS 過濾是附加功能
AdGuard Home 本質上是一個 DNS 解析器,廣告攔截是透過維護一份「已知廣告和追蹤器網域」的封鎖清單來實現的。在「過濾器」裡可以訂閱社群維護的清單:
- AdGuard DNS filter:官方預設,涵蓋廣告和追蹤器
- OISD Blocklist:高品質、誤封少,推薦作為補充
- HaGeZi Multi Pro:較積極,誤封率稍高但覆蓋更廣
注意:這種方式只能封鎖「已知的廣告網域」,YouTube 廣告因為跟影片內容走同一個網域,DNS 層無法封鎖。不要對這個功能期望過高。
確認 DNS 確實走加密通道
在 dnsleak.com 或 1.1.1.1/help 確認你看到的 DNS 伺服器是你自己的 VPS,而不是 ISP 的 DNS。
用 dig 直接測試 DoH:
1 | dig @https://dns.yourdomain.com/dns-query example.com |
或用 kdig(KNOT DNS 工具集,支援 DoT):
1 | kdig -d @dns.yourdomain.com +tls-ca example.com |
NCSE Network 提供臺灣本地機房的 VPS,IP Transit 服務從 10M 到 100G,適合自架需要低延遲 DNS 服務的基礎設施需求。詳情見 ncse.tw。