Pi-hole 网络级去广告 DNS 部署手记

Pi-hole 网络级去广告 DNS 部署手记

_

目录

  1. Pi-hole 是什么?
  2. 它是怎么工作的?
  3. 准备工作
  4. Docker 一键部署
  5. 配置路由器指向 Pi-hole
  6. 管理面板与进阶设置
  7. 白名单:让该放的过去
  8. 常见问题

Pi-hole 是什么?

Pi-hole 是一个网络级的广告拦截器。它运行在你的路由器或一台小型服务器上,充当整个家庭网络的 DNS 服务器——任何通过你家 Wi-Fi 连网的设备(手机、电脑、电视、智能家居),广告请求在 DNS 解析阶段就会被拦截。

一句话概括:装一次,全家受益,连智能电视的广告都能干掉。

它的名字里的「Pi」来自最初推荐运行在树莓派(Raspberry Pi)上,但实际上任何 Linux 设备都能跑。


它是怎么工作的?

你的手机 → 打开一个 App → App 请求加载广告
                ↓
       查询 DNS:ad.doubleclick.net?
                ↓
        路由器 → Pi-hole DNS
                ↓
      Pi-hole 查广告黑名单:命中!
                ↓
        返回 0.0.0.0(无效 IP)
                ↓
        广告加载失败,页面干干净净

因为广告拦截发生在 DNS 层面,所以它比浏览器插件(如 AdBlock)更强:

对比 浏览器去广告插件 Pi-hole
覆盖范围 只限浏览器 所有联网设备
对 App 广告 ❌ 无能为力 ✅ 有效
对智能电视广告 ❌ 无能为力 ✅ 有效
对 IoT 设备追踪 ❌ 无能为力 ✅ 有效
性能影响 占用浏览器内存 几乎无感(延迟 < 1ms)

准备工作

条件 说明
一台 24 小时运行的设备 树莓派、NAS、软路由、云服务器、旧电脑均可
静态 IP 这台设备需要一个固定的局域网 IP
能改路由器 DNS 设置 大部分家用路由器都支持
基本 Linux 操作能力 Docker 基础即可

💡 最省钱方案:闲鱼上 50 块钱的树莓派 Zero 2 W 完全够用。或者直接用你已有的 NAS / 软路由 / 常开的 Linux 小主机。


Docker 一键部署

docker run 方式

docker run -d \
  --name pihole \
  --restart unless-stopped \
  -e TZ="Asia/Shanghai" \
  -e WEBPASSWORD="设置一个管理密码" \
  -e PIHOLE_DNS_="223.5.5.5;119.29.29.29" \
  -p 53:53/tcp \
  -p 53:53/udp \
  -p 80:80/tcp \
  -v /opt/pihole/etc-pihole:/etc/pihole \
  -v /opt/pihole/etc-dnsmasq.d:/etc/dnsmasq.d \
  pihole/pihole:latest

参数说明:

参数 含义
TZ 时区,国内填 Asia/Shanghai
WEBPASSWORD 管理面板登录密码
PIHOLE_DNS_ 上游 DNS,这里用了阿里 DNS 和腾讯 DNS
-p 53:53 DNS 端口(必须同时开放 TCP 和 UDP)
-p 80:80 Web 管理面板端口

Docker Compose 方式(推荐)

version: "3.8"

services:
  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    restart: unless-stopped
    environment:
      TZ: "Asia/Shanghai"
      WEBPASSWORD: "your-strong-password"
      PIHOLE_DNS_: "223.5.5.5;119.29.29.29"
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"
    volumes:
      - ./etc-pihole:/etc/pihole
      - ./etc-dnsmasq.d:/etc/dnsmasq.d
    cap_add:
      - NET_ADMIN
docker-compose up -d

验证是否运行成功

# 查看日志确认服务已启动
docker logs pihole | tail -20

如果你没有通过 WEBPASSWORD 环境变量设置密码,日志末尾会显示随机生成的密码。设置过的话直接用你设的密码,浏览器访问 http://你的设备IP/admin 登录管理面板。

⚠️ 端口 53 冲突问题: 有些系统的 systemd-resolved 会占用 53 端口。如果容器起不来,先执行:

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

注意:停止 systemd-resolved 后主机自身的 DNS 解析会受影响。如果你是通过 SSH 连接服务器,建议先确认有其他 DNS 可用(比如在 /etc/resolv.conf 中手动指定)。


配置路由器指向 Pi-hole

部署完 Pi-hole 后,你需要让家里的所有设备都走 Pi-hole 做 DNS 解析。有两种方式:

方式一:修改路由器 DHCP 的 DNS(推荐)

登录路由器管理后台 → 找到 DHCP 服务器设置 → 把主 DNS 服务器改为 Pi-hole 的 IP 地址。

以常见路由器为例:

  • TP-Link / 小米 / 华为路由器: 网络设置 → DHCP 服务器 → DNS 服务器填 Pi-hole 的 IP
  • OpenWrt / 软路由: 网络 → 接口 → LAN → DHCP 服务器 → 高级设置
  • 华硕路由器: 内部网络 → DHCP 服务器 → DNS 服务器

改完后,所有设备断开 Wi-Fi 重连一次,广告就没了。

方式二:手动设置单台设备

如果暂时不想改路由器,可以先在自己手机上测试效果:

  • iPhone: 设置 → Wi-Fi → 点当前网络的 ⓘ → 配置 DNS → 手动 → 添加 Pi-hole 的 IP
  • Android: 设置 → Wi-Fi → 长按当前网络 → 修改网络 → 高级选项 → DNS 1 填 Pi-hole 的 IP
  • Windows: 网络设置 → 更改适配器选项 → 右键网卡 → 属性 → IPv4 → DNS 填 Pi-hole IP

管理面板与进阶设置

Pi-hole 的管理面板非常直观,几个核心页面:

Dashboard(仪表盘)

展示总查询数、拦截数、拦截比例、客户端排行等。一个正常运行的 Pi-hole,拦截率通常在 15%-30% 之间。如果太低说明广告规则不够,太高说明可能误杀了正常网站。

Query Log(查询日志)

实时显示每一条 DNS 请求,可以按时间、客户端、域名过滤。调试白名单的好帮手。

Adlists(广告规则列表)

默认自带一个规则列表,包含约 10 万个广告域名。你可以添加更激进的列表:

# 中文广告过滤
https://raw.githubusercontent.com/AdguardTeam/AdguardFilters/master/ChineseFilter/sections/adservers.txt
https://raw.githubusercontent.com/Cats-Team/AdRules/main/dns.txt

# 更全面的拦截
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts

💡 规则不是越多越好,太多会拖慢 DNS 响应。建议 3-5 个精选列表即可。


白名单:让该放的过去

Pi-hole 偶尔会误拦正常内容(比如淘宝的营销链接、微信中的跳转链接、某些 App 的统计服务)。这时需要加白名单。

在 Pi-hole 管理面板 → Whitelist → 添加域名即可。常见需要加白的域名:

# 微信相关
mp.weixin.qq.com
res.wx.qq.com

# 淘宝 / 拼多多链接跳转
click.taobao.com
uland.taobao.com
p.pinduoduo.com

# 抖音 / 头条
lf3-cdn-tos.bytego.com

💡 不需要一次性加很多——正常使用过程中如果发现某个 App 或网页异常,去 Query Log 里找到被拦的域名,加白即可。这是一个渐进调优的过程。


常见问题

Q: 我用路由器改了 DNS,为什么还有广告?

三个可能:① 手机/电脑有 DNS 缓存,重启设备或等几分钟;② 浏览器装了 DoH(DNS-over-HTTPS),绕过了系统 DNS——去浏览器设置里关掉「安全 DNS」;③ 部分 App 用了 IP 直连而非域名,DNS 层面无法拦截。

Q: Pi-hole 会拖慢网速吗?

基本不会。DNS 查询只是在你打开网页的瞬间多走了一小步查表操作(< 1ms 延迟),之后所有数据流量都直接走你的宽带,不过 Pi-hole。你感受到的不是变慢而是变快——因为广告资源被毙掉了,页面加载更快。

Q: Pi-hole 本身挂了怎么办?全家断网?

这确实是单点故障风险。解决方案:路由器 DNS 设置里填两个 DNS——主 DNS 是 Pi-hole,备用 DNS 填 223.5.5.5(阿里 DNS)。这样 Pi-hole 挂了会自动切到阿里 DNS,只是暂时失去去广告效果。或者干脆跑两台 Pi-hole 做高可用。

Q: 和 AdGuard Home 比哪个好?

功能类似,都是 DNS 级去广告。简要对比:

维度 Pi-hole AdGuard Home
安装 简单 更简单(更轻量)
界面 经典、信息密度高 现代、更直观
上游配置 手动改文件 管理面板直接改
DoH/DoT 需额外配置 内置支持
社区生态 最老牌、资料最多 快速增长中

两者都是好选择,如果你想要零折腾,AdGuard Home 可能更适合新手。Pi-hole 胜在社区庞大,遇到问题网上几乎一定有答案。

Q: 树莓派关了,想重启 Pi-hole 服务?

docker-compose up -d

数据都在挂载的目录里,重启后一切如初。


技术博客 · 欢迎分享 · 如有疑问欢迎交流

告别第三方语音:自己动手搭建 TeamSpeak 3 服务器 2026-08-09
用 Vaultwarden 自建无限量密码管理器 2026-08-09

评论区