跳至主要内容

Pi-hole + WireGuard:出門在外的全防護加密隧道 (Bifrost)

在 Homelab 的進階網路架構中,將 Pi-hole(DNS 廣告攔截伺服器) 與 Wg-Easy(WireGuard VPN) 結合,是兼顧安全性與行動上網體驗的經典組合。

當你在咖啡廳或行動網路連上 VPN 時,所有的網路封包不僅經過 WireGuard 嚴密加密傳輸回家中,DNS 解析請求也會由 Pi-hole 自動過濾掉廣告與惡意追蹤域名。


主要特色​

  1. 行動端全域廣告過濾:手機在外只需開啟 WireGuard,瀏覽網頁與 App 即自動享受家中的廣告攔截保護。
  2. 內網自訂域名解析:在外網可直接訪問 http://nas.lan 或 http://pve.lan 等內部專屬 DNS 解析。
  3. 單一 Compose 整合:將 DNS 伺服器與 VPN 閘道封裝在同一個虛擬網路中,維護容易。

部署步驟 (Docker Compose)​

在 Ubuntu Server 終端機中執行:

1. 建立目錄​

sudo mkdir -p /opt/stacks/bifrost/pihole/etc-pihole /opt/stacks/bifrost/pihole/etc-dnsmasq.d /opt/stacks/bifrost/wgeasy
cd /opt/stacks/bifrost

2. 建立 compose.yaml​

services:
# 1. DNS 廣告過濾伺服器
pihole:
image: pihole/pihole:latest
container_name: bifrost-pihole
restart: unless-stopped
ports:
- "53:53/tcp"
- "53:53/udp"
- "8085:80/tcp" # Web 管理介面
environment:
- TZ=Asia/Taipei
- WEBPASSWORD=your_secure_pihole_password
- FTLCONF_LOCAL_IPV4=10.8.0.1
volumes:
- ./pihole/etc-pihole:/etc/pihole
- ./pihole/etc-dnsmasq.d:/etc/dnsmasq.d
networks:
vpn_net:
ipv4_address: 172.28.0.2

# 2. WireGuard VPN 伺服器
wg-easy:
image: ghcr.io/wg-easy/wg-easy:latest
container_name: bifrost-wgeasy
restart: unless-stopped
environment:
- WG_HOST=your_domain_or_public_ip
- PASSWORD=your_secure_vpn_password
- WG_PORT=51820
- WG_DEFAULT_ADDRESS=10.8.0.x
# 將 VPN 客戶端的預設 DNS 指向 Pi-hole 容器
- WG_DEFAULT_DNS=172.28.0.2
- TZ=Asia/Taipei
volumes:
- ./wgeasy:/etc/wireguard
ports:
- "51820:51820/udp"
- "51821:51821/tcp"
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
networks:
vpn_net:
ipv4_address: 172.28.0.3
depends_on:
- pihole

networks:
vpn_net:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16

3. 啟動服務​

sudo docker compose up -d

驗證與使用​

  1. Pi-hole 管理後台:瀏覽器前往 http://<VM_IP>:8085/admin,輸入密碼登入確認廣告規則已載入。
  2. WireGuard 管理後台:瀏覽器前往 http://<VM_IP>:51821,新增連線裝置並用手機掃描 QR Code。
  3. 連線驗證:手機開啟 VPN 後,瀏覽一般新聞網站測試廣告是否被攔截,並在 Pi-hole 的 Query Log 中確認有出現來自 10.8.0.x 的查詢記錄。

相關連結​