如何在 Ubuntu Server 24.04 上設定 Pi-hole DNS-over-HTTPS

對於執行在 Ubuntu Server 24.04 上的 Pi-hole,請將其上游請求路由dnscrypt-proxy到本機監聽器,並將 Pi-hole 指向該監聽器127.0.0.1#5053。這樣,您的伺服器與選定的上游解析器之間的 DNS 流量將透過 DNS-over-HTTPS (DoH) 進行加密,而 Pi-hole 仍可繼續回應您的區域網路用戶端並套用其黑名單。預設情況下,Pi-hole 本身不提供到上游的 DoH 傳輸;本地代理提供加密連線。

首先需要了解一個目前版本細節:Cloudflarecloudflared proxy-dns已於 2026 年 2 月 2 日起從新版本移除該指令。因此,先前安裝該命令的教學可能無法在新cloudflared版本中正常運作。以下步驟dnscrypt-proxy遵循 Pi-hole 目前的 DoH 指南。此設定適用於 Pi-hole 和代理程式運行在同一台 Ubuntu 主機上的情況。 Docker 或多主機設定需要不同的監聽器位址和防火牆規則。

這種設定能做什麼,不能做什麼

普通的 DNS 服務通常會將查詢從解析器傳送到上游 DNS 供應商,而不會進行傳輸加密。 DoH 則使用 HTTPS 協定傳輸 DNS 請求,這使得位於 Pi-hole 伺服器和解析器之間的網路觀察者更難讀取或篡改這些請求。 Pi-hole 仍然是向本地網路設備廣播的 DNS 伺服器;只有其上游路徑發生了變化。

DoH 並不會使您選擇的解析器無法存取 DNS 活動。上游提供者仍然會收到來自您伺服器的查詢,而 Pi-hole 可能會根據其隱私和日誌記錄設定保留用戶端查詢歷史記錄。 HTTPS 也不會加密無關的網路流量。如果您希望使用特定的解析器,請查看其隱私權政策,並從支援的解析器清單中選擇其 DoH 條目。

開始之前

  • 確認 Pi-hole 已安裝在 Ubuntu Server 24.04 上並正常運作。本教學將配置現有的 Pi-hole,而不是安裝新的 Pi-hole。
  • 請確保伺服器擁有穩定的區域網路位址。如果位址發生變化,路由器的 DHCP 用戶端可能會遺失其 DNS 伺服器。
  • 擁有管理員權限,並且能夠在 DNS 暫時停止工作時能夠聯繫到 Pi-hole 伺服器。避免透過依賴相同 Pi-hole 伺服器進行網域解析的連線進行遠端變更。
  • 記錄目前 Pi-hole 上游設置,以便在回滾期間可以恢復它們。

代理伺服器只會綁定到回環連接埠 5053,而將連接埠 53 留給 Pi-hole 使用。這樣可以避免與 Pi-hole 的 DNS 服務和 Ubuntu 的本機解析器發生衝突。不要systemd-resolved為了實現這種設計而停用 Pi-hole;代理伺服器的獨立回環連接埠可以避免這種衝突。

1. 從Ubuntu的軟體包倉庫安裝dnscrypt-proxy

dnscrypt-proxy 專案文件介紹了一種 Ubuntu 軟體包的安裝方法。安裝前,請檢查您配置的 Ubuntu 軟體倉庫中是否有合適的軟體包:

sudo apt update
apt-cache policy dnscrypt-proxy

如果輸出結果顯示有候選版本,請安裝它:

sudo apt install dnscrypt-proxy

如果沒有顯示任何候選軟體來源,請勿為了繼續而添加無關的第三方軟體來源。請使用 dnscrypt-proxy 專案官方 Linux 指南中提供的安裝方法,驗證版本和架構,並根據該安裝調整服務配置。以下 systemd 套接字單元和設定路徑適用於 Pi-hole 文件中記錄的 Ubuntu 軟體包設定。

2. 將代理監聽器移至本機主機連接埠 5053

Pi-hole 已經使用了標準的 DNS 連接埠 53。配置代理程式的套接字,使其監聽 TCP 和 UDP 協議127.0.0.1:5053,並且只能從同一台主機存取。建立一個 systemd 插件:

sudo systemctl edit dnscrypt-proxy.socket

在編輯器中輸入以下內容並儲存:

[Socket]
ListenStream=
ListenDatagram=
ListenStream=127.0.0.1:5053
ListenDatagram=127.0.0.1:5053

空白行ListenStream=和ListenDatagram=`--except` 行用於在設定替換位址之前清除軟體包的預設值。請勿省略這些行:否則 systemd 可能會在保留自訂監聽器連接埠的同時,也保留預設連接埠。

3. 選擇一個 DoH 解析器

開啟軟體包設定檔:

sudoedit /etc/dnscrypt-proxy/dnscrypt-proxy.toml

對於 systemd 套接字激活,請在代理程式配置中使用空的監聽器清單。從目前已簽署的公共解析器清單中選擇一個解析器名稱。例如,以下配置選擇標準的 Cloudflare 解析器;Pi-hole 指南也提供了cloudflare-security一個範例,說明如何在上游解析器上進行惡意軟體過濾:

listen_addresses = []
server_names = ['cloudflare']

保持軟體包其餘配置不變。其中的名稱server_names是註冊表標識符,而非任意主機名稱或 URL 路徑。如果您選擇其他提供者,請驗證其目前解析器項目是否支援 DoH,並複製其確切名稱。過濾惡意軟體或其他類別的解析器與未過濾的解析器可能會產生不同的結果。

4. 將 Pi-hole 指向本地代理

將 Pi-hole 的上游 DNS 位址設定為本機監聽器:

sudo pihole-FTL --config dns.upstreams '["127.0.0.1#5053"]'

後綴#5053是 Pi-hole 對非標準 DNS 連接埠的表示方法。您也可以在 Pi-hole 管理介面的「設定」>「DNS」中查看。清除預設的公共上游伺服器選項,並將自訂伺服器保留127.0.0.1#5053為上游伺服器。如果將公共解析器保留為額外的上游伺服器,則查詢可能會繞過加密代理,因此如果您需要所有 Pi-hole 上游查詢都使用 DoH,請刪除這些項目。

5. 重新啟動服務並驗證問題是否解決

重啟套接字、代理服務和 Pi-hole FTL 守護進程,以便它們載入新配置:

sudo systemctl restart dnscrypt-proxy.socket
sudo systemctl restart dnscrypt-proxy.service
sudo systemctl restart pihole-FTL.service

查看服務狀態:

sudo systemctl status dnscrypt-proxy.socket
sudo systemctl status dnscrypt-proxy.service
sudo systemctl status pihole-FTL.service

每個代理伺服器都應該處於活動狀態,且無綁定錯誤或解析器啟動失敗。直接透過其本機 DNS 監聽器測試代理伺服器:

dig @127.0.0.1 -p 5053 example.com

DNS 回應表示本機代理伺服器正在回應。接下來,測試 53 連接埠上的 Pi-hole:

dig @127.0.0.1 example.com

檢查 Pi-hole 查詢日誌或控制面板,確認請求是否已到達 Pi-hole;如果測試失敗,請查看代理的日誌:

sudo journalctl -u dnscrypt-proxy.service -b --no-pager

為了進一步檢查,請查看代理程式啟動日誌或日誌輸出,確認所選解析器和 DoH 協定的狀態。dig僅憑 DoH 協定狀態為「成功」可以證明 DNS 解析正常,但並不能證明請求使用了 HTTPS。

常見問題及安全恢復

  • 「位址已被佔用」:可能是另一個進程已佔用連接埠 5053,或套接字覆蓋未載入。請使用 `check listeners` 指令檢查監聽器sudo ss -lntup,使用 `check drop-in` 指令查看systemctl cat dnscrypt-proxy.socket設定文件,並確認空的重置行位於 5053 條目之前。
  • 代理程式已啟用,但查詢逾時:請檢查出站 HTTPS 存取、解析器名稱和代理程式日誌。某些網路會阻止 DNS over HTTPS 連線或限制 TCP 連接埠 443。
  • 代理測試成功,但 Pi-hole 沒有收到上游回應​​:請確認 Pi-hole 的設定完全正確127.0.0.1#5053,然後重新啟動pihole-FTL。確保預設的上游路由複選框沒有預設提供備用路由。
  • 更改後,Ubuntu 本身無法解析名稱:此設定更改的是 Pi-hole 的上游配置,而不是主機配置/etc/resolv.conf。請避免替換該文件或將其systemd-resolved作為故障排除的快捷方式。

若要回滾,請恢復您在 Pi-hole 中記錄的上游 DNS 設定並重新啟動pihole-FTL。一旦 Pi-hole 不再指向代理,您就可以dnscrypt-proxy使用軟體套件管理器停用或移除該代理。如果此伺服器也透過 Pi-hole 解析自身的 DNS,請在變更服務之前準備好本機復原路徑。

哪種方案適合您的網路?

如果您希望在 Pi-hole 中實現集中式 DNS 過濾,並對 Pi-hole 到指定解析器的流量進行加密,請使用此單主機代理程式方案。由於代理只有一個本地地址和端口,因此檢查起來相對容易。如果您在 Docker 容器、其他伺服器或跨多個網路執行 Pi-hole,則可能需要使用容器網路位址而不是環回位址,並且必須限制代理監聽器,使其不暴露為開放解析器。如果您需要基於政策的過濾、裝置身份驗證或為家庭外的漫遊設備加密 DNS,請單獨設定這些用戶端或託管網關;Pi-hole 的上游 DoH 連線不會自動加密每個用戶端到 Pi-hole 的路徑。

最後,請記住,如果路由器或用戶端廣播了第二個 DNS 伺服器,則它們可以繞過 Pi-hole。若要實現全網過濾,請僅透過 DHCP 為用戶端指派 Pi-hole 位址,並同時考慮 IPv6 和 IPv4 DNS 廣播。變更路由器設定後,請使用多台裝置進行驗證,因為即使伺服器上的代理設定正確,也無法阻止客戶端直接使用其他解析器。

官方參考資料

留下評論

如何在 Ubuntu Server 24.04 上設定 Pi-hole DNS-over-HTTPS

如何在 Ubuntu Server 24.04 上設定 Pi-hole DNS-over-HTTPS

在 Ubuntu Server 24.04 上設定 Pi-hole,使其使用 dnscrypt-proxy 進行 DNS-over-HTTPS 連接,然後驗證本地上游伺服器,避免常見的 DNS 衝突。

如何修復 YaST GUI 無法透過 SSH X11 轉送啟動的問題

如何修復 YaST GUI 無法透過 SSH X11 轉送啟動的問題

排查 YaST GUI 透過 SSH X11 轉送導致的故障。測試 DISPLAY,修復已記錄的 Qt XIO 錯誤,檢查 SSH 設置,並在必要時切換到 ncurses。

如何設定本地 SUSE RMT 伺服器(SMT 替代方案)

如何設定本地 SUSE RMT 伺服器(SMT 替代方案)

在 SLES 15 上設定 SUSE RMT,同步 SCC 元數據,鏡像選定的儲存庫,透過 HTTPS 註冊客戶端,並了解從 SMT 遷移的限制。

修正 Pardus Linux 23 上無法偵測到音效卡驅動程式的問題

修正 Pardus Linux 23 上無法偵測到音效卡驅動程式的問題

追蹤 Pardus Linux 23 上缺少的音效卡問題。安全地檢查 ALSA 檢測、核心模組、音訊服務、輸出設定檔、韌體和更新。

修正 Pardus KVM 虛擬機器中顯示解析度卡在 1024x768 的問題

修正 Pardus KVM 虛擬機器中顯示解析度卡在 1024x768 的問題

修正 Pardus KVM 虛擬機器卡在 1024x768 解析度的問題,檢查虛擬 GPU、SPICE 代理、X11 或 Wayland 會話,並正確驗證更高的顯示模式。

如何在 Debian 系統中開機時自動掛載遠端 SSHFS 目錄

如何在 Debian 系統中開機時自動掛載遠端 SSHFS 目錄

使用基於金鑰的 SSH、/etc/fstab、systemd 網路選項、自動掛載和驗證步驟,在 Debian 啟動時自動掛載遠端 SSHFS 目錄。

修正 SLES 系統升級期間出現的「無法分配記憶體」錯誤

修正 SLES 系統升級期間出現的「無法分配記憶體」錯誤

排查 SLES 升級過程中出現的「無法分配記憶體」問題。檢查 RAM、交換空間、OOM 日誌和進程限制,然後在不中斷軟體包事務的情況下進行復原。

修復 Harmonica OS 平板電腦的觸控螢幕校準問題:選擇合適的 Linux 修復方案

修復 Harmonica OS 平板電腦的觸控螢幕校準問題:選擇合適的 Linux 修復方案

追蹤 Harmonica OS (HamoniKR) 平板電腦的觸控偏移、旋轉和顯示對映問題。比較 X.Org 和 libinput 的修復方案,安全地進行測試,並了解何時校準無效。

如何在現有的 Debian 12 系統上設定加密的交換分割區

如何在現有的 Debian 12 系統上設定加密的交換分割區

使用 dm-crypt 對現有的 Debian 12 交換分割區進行加密,每次啟動時使用新的隨機金鑰,並設定 /etc/crypttab、/etc/fstab 和安全驗證步驟。

如何透過電子郵件警報監控Ubuntu上的SMART硬碟健康狀況

如何透過電子郵件警報監控Ubuntu上的SMART硬碟健康狀況

在 Ubuntu 系統上安裝 smartmontools,用於監控硬碟健康狀況並發送 SMART 郵件警報。檢查設備支援狀況、設定郵件發送、測試通知功能並檢查故障。