# 如何強制所有本地流量經過 Pi-hole:OpenWRT 進階設定
> **前文提要**:你已在本機網路(Raspberry Pi 或容器)安裝好 Pi-hole。
> 本文以 **OpenWRT** 路由器為例,教你 **強制** 所有裝置 DNS 查詢 **必須** 經過 Pi-hole,杜絕繞過、廣告漏網。
---
## 為什麼要「強制」所有流量經過 Pi-hole?
| 優勢 | 說明 |
|------|------|
| **100% 廣告攔截** | 即使裝置手動設 8.8.8.8,也無法繞過 |
| **統一管理黑名單** | 所有裝置共用 Pi-hole 規則 |
| **防止 DNS 洩漏** | 避免 ISP 或第三方追蹤 |
| **家庭網路安全** | 封鎖惡意域名、釣魚網站 |
> **目標**:`scutil --dns` 顯示 Pi-hole IP,應用程式無法直連外部 DNS。
---
## 基礎設定:讓 Pi-hole 成為唯一 DNS 來源
### 1. OpenWRT DHCP 設定(最重要!)
```bash
# 登入 OpenWRT LuCI
網路 > 介面 > LAN > 編輯 > DHCP 伺服器 > 進階設定
# DHCP 選項
DNS 伺服器:192.168.1.53 # 你的 Pi-hole IP
# 若需填兩個:192.168.1.53 192.168.1.53
如果 OpenWRT 強制要求兩個 DNS?
→ 兩個都填 192.168.1.53
→ 避免備援 DNS 變成洩漏點
2. Pi-hole 本地 DNS 設定(封鎖外部 DNS 直連) #
在 Pi-hole Web 介面:
設定 > DNS > Local DNS Records
新增以下項目:
# 域名 IP 位址
1.1.1.1 0.0.0.0
8.8.8.8 0.0.0.0
8.8.4.4 0.0.0.0
9.9.9.9 0.0.0.0
dns.google 0.0.0.0
為什麼用 0.0.0.0 而不是 Pi-hole 本身 IP?
#
| 選項 | 結果 |
|---|---|
0.0.0.0 |
查詢失敗 → 裝置學會「不要再問」 |
192.168.1.53 |
無限迴圈 → Pi-hole 再問自己 → 延遲、崩潰 |
0.0.0.0= 黑洞,最安全、最有效
命令列方式(不進 Web 介面) #
# SSH 進 Pi-hole
sudo nano /etc/pihole/local.list
# 加入以下內容
0.0.0.0 1.1.1.1
0.0.0.0 8.8.8.8
0.0.0.0 8.8.4.4
0.0.0.0 9.9.9.9
0.0.0.0 dns.google
# 重新載入
pihole restartdns
進階:OpenWRT 防火牆強制所有 DNS 走 Pi-hole #
OpenWRT 使用 nftables / iptables
封鎖所有非 Pi-hole 裝置發送的 DNS(port 53)請求
防火牆規則(LuCI) #
# 網路 > 防火牆 > 流量規則
規則 1:允許 Pi-hole 發送 DNS #
名稱:Allow Pi-hole DNS
來源區域:lan
來源位址:192.168.1.53
目的區域:wan
目的端口:53
協定:tcp, udp
動作:接受
規則 2:封鎖其他裝置發送 DNS #
名稱:Block External DNS
來源區域:lan
來源位址:192.168.1.0/24
目的區域:wan
目的端口:53
協定:tcp, udp
動作:拒絕
拖動規則:允許 Pi-hole 在最上面!
命令列方式(/etc/config/firewall)
#
# SSH 進 OpenWRT
vi /etc/config/firewall
# 加入以下區塊
config rule
option name 'Allow Pi-hole DNS'
option src 'lan'
option src_ip '192.168.1.53'
option dest 'wan'
option dest_port '53'
option proto 'tcp udp'
option target 'ACCEPT'
config rule
option name 'Block External DNS'
option src 'lan'
option src_ip '192.168.1.0/24'
option dest 'wan'
option dest_port '53'
option proto 'tcp udp'
option target 'DROP'
# 重新載入
/etc/init.d/firewall restart
常見問題:列印機無法發現(Printer Error) #
原因 #
防火牆封鎖了 mDNS(port 5353 UDP) 多播流量
解決:新增 mDNS 例外規則 #
名稱:Allow mDNS
來源區域:lan
來源位址:192.168.1.0/24
目的區域:lan
目的端口:5353
協定:udp
動作:接受
目的區域必須是
lan(避免出 WAN)
目的位址留空或填224.0.0.251(若支援)
最終驗證(絕對不要用 nslookup!) #
正確指令(macOS / Linux) #
# macOS:檢查系統 DNS
scutil --dns | grep -A1 "resolver #1"
# 預期輸出
nameserver[0] : 192.168.1.53
# Linux:檢查 resolv.conf
cat /etc/resolv.conf
# 預期輸出
nameserver 192.168.1.53
# 清除 DNS 快取(macOS)
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
# 清除 DNS 快取(Linux)
sudo systemd-resolve --flush-caches
總結:你的 Pi-hole 鐵壁防線 #
| 項目 | 狀態 |
|---|---|
| OpenWRT DHCP | 僅 Pi-hole 192.168.1.53 |
| Pi-hole 本地封鎖 | 0.0.0.0 |
| 防火牆規則 | 強制 DNS 走 Pi-hole |
| mDNS 例外 | 列印機正常 |
| 驗證方式 | scutil --dns |
恭喜!
你已建成 香港最強 Pi-hole 防禦系統:
零廣告 · 零洩漏 · 列印機正常
下篇:如何在 iPhone 行動數據使用 Pi-hole 規則(無靜態 IP)
標籤:#PiHole #OpenWRT #強制DNS #防火牆 #mDNS #香港網路
作者:米先生 @micyung
---
**@micyung -- 文章已打包成 `pi-hole.md`**
**直接儲存為 `pi-hole.md` 即可用於 Hugo**
**今晚不再浪費時間,Pi-hole 鐵壁達成!**
需要我幫你加 **英文版** 或 **iPhone 行動篇**?隨時說。