主题模式
Are you an LLM? You can read better optimized documentation at /ai/homelab/pi-hole.md for this page in Markdown format
Pi-hole 家庭网络广告拦截:DNS 污染治理与隐私保护方案
每天浏览网页、刷短视频、使用 APP,你有没有被无处不在的广告烦到?更可怕的是,这些广告背后还在收集你的隐私数据。
Pi-hole 是一款基于 DNS 的广告拦截器。它可以在路由器层面拦截广告、跟踪器和恶意网站,让你全家的所有设备(手机、电脑、电视、智能家居)都享受干净的网络环境。
🧐 为什么选择 Pi-hole?
相比浏览器广告插件(如 AdBlock),Pi-hole 的优势:
| 特性 | Pi-hole | 浏览器插件 |
|---|---|---|
| 覆盖范围 | 所有设备 | 仅当前浏览器 |
| 手机 APP | ✅ 有效 | ❌ 无效 |
| 智能电视 | ✅ 有效 | ❌ 无效 |
| 智能家居 | ✅ 有效 | ❌ 无效 |
| 系统级广告 | ✅ 有效 | ❌ 无效 |
| 隐私保护 | DNS 层面拦截 | 可能泄露浏览数据 |
| 资源占用 | 极低(树莓派即可) | 占用浏览器资源 |
🛠️ 准备工作
硬件需求
| 配置 | 最低 | 推荐 |
|---|---|---|
| CPU | 单核 | N100 / 树莓派 4 |
| 内存 | 256MB | 512MB+ |
| 硬盘 | 8GB | 16GB+ |
网络配置
- 静态 IP:为 Pi-hole 分配一个静态 IP(如
192.168.1.2) - DNS 设置:在路由器中设置 DNS 为 Pi-hole 的 IP
- DHCP 配置:可选,让 Pi-hole 作为 DHCP 服务器
🐳 Docker 部署
方案一:Docker Compose(推荐)
bash
mkdir -p /root/data/docker_data/pihole
cd /root/data/docker_data/pihole
nano docker-compose.ymlyaml
services:
pihole:
image: pihole/pihole:latest
container_name: pihole
ports:
- '53:53/tcp'
- '53:53/udp'
- '67:67/udp'
- '8082:80'
- '443:443'
environment:
TZ: 'Asia/Shanghai'
WEBPASSWORD: ${PIHOLE_PASSWORD:-your_password}
DNS1: '119.29.29.29'
DNS2: '223.5.5.5'
volumes:
- ./etc-pihole:/etc/pihole
- ./etc-dnsmasq.d:/etc/dnsmasq.d
restart: unless-stopped
cap_add:
- NET_ADMIN创建 .env 文件:
bash
PIHOLE_PASSWORD=your_admin_password启动服务:
bash
docker compose up -d方案二:一键脚本安装
bash
curl -sSL https://install.pi-hole.net | bash按照提示完成安装,设置管理员密码和上游 DNS。
🚀 初始配置
访问管理界面
打开浏览器访问 http://pi-hole-ip/admin(默认端口 80,Docker 映射为 8082)。
使用设置的管理员密码登录。
修改上游 DNS
- 进入 Settings → DNS
- Upstream DNS Servers:选择或添加上游 DNS
- 推荐配置:
| DNS | 类型 | 特点 |
|---|---|---|
| 119.29.29.29 | 腾讯云 | 国内速度快 |
| 223.5.5.5 | 阿里云 | 国内速度快 |
| 1.1.1.1 | Cloudflare | 隐私保护好 |
| 8.8.8.8 | 全球通用 |
设置 DHCP(可选)
如果让 Pi-hole 作为 DHCP 服务器:
- 进入 Settings → DHCP
- 启用 DHCP
- 设置 IP 范围(如
192.168.1.100-192.168.1.200) - 设置网关(路由器 IP,如
192.168.1.1)
注意
启用 Pi-hole DHCP 后,需要关闭路由器的 DHCP,避免冲突。
📱 客户端配置
方法一:修改路由器 DNS(推荐)
这是最简单的方法,所有设备自动生效:
- 登录路由器管理界面
- 找到 DNS 设置
- 将主 DNS 设置为 Pi-hole 的 IP(如
192.168.1.2) - 将备用 DNS 设置为空或其他 DNS
方法二:修改单个设备 DNS
如果不想影响所有设备,可以只在特定设备上设置:
Windows:
bash
# 修改网络适配器 DNS
# 控制面板 → 网络和共享中心 → 更改适配器设置
# 右键点击网络 → 属性 → IPv4 → 使用下面的 DNS 地址macOS:
bash
# 系统设置 → 网络 → 高级 → DNS → 添加 DNS 服务器iOS:
bash
# 设置 → 无线局域网 → 点击 WiFi 名称旁边的 i → 配置 DNS → 手动添加Android:
bash
# 设置 → 网络和互联网 → WiFi → 长按 WiFi 名称 → 修改网络 → 高级选项 → IP 设置为静态🎯 广告拦截效果
拦截率统计
| 类别 | 拦截率 | 说明 |
|---|---|---|
| 广告 | ~95% | 网页广告、APP 广告 |
| 跟踪器 | ~98% | Google Analytics、Facebook Pixel |
| 恶意网站 | ~99% | 钓鱼网站、恶意软件 |
| 成人网站 | ~99% | 需要额外配置黑名单 |
对比效果
| 场景 | 使用前 | 使用后 |
|---|---|---|
| 网页浏览 | 满屏广告 | 干净清爽 |
| YouTube | 前置广告 | 无广告 |
| 手机 APP | 开屏广告 | 无广告 |
| 智能电视 | 开机广告 | 无广告 |
| 加载速度 | 慢(广告多) | 快(无广告) |
🔧 进阶配置
添加自定义黑名单
- 进入 Group Management → Domains
- 在 Add a new domain 中输入域名
- 选择 Blacklist
- 点击 Add to group
添加自定义白名单
如果误拦截了正常网站:
- 进入 Group Management → Domains
- 在 Add a new domain 中输入域名
- 选择 Whitelist
- 点击 Add to group
使用更好的广告列表
- 进入 Settings → Blocklists
- 添加以下列表:
# 常用广告列表
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://raw.githubusercontent.com/ZeroDot1/CoinBlockerLists/master/hosts_browser
https://hostfiles.frogeye.fr/firstparty-trackers-hosts.txt
https://hostfiles.frogeye.fr/multiparty-trackers-hosts.txt
# 中文广告列表
https://raw.githubusercontent.com/LaoluoTech/cn-hosts/master/hosts
https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/hosts.txt家长控制
- 进入 Group Management → Groups
- 创建一个新组(如
Kids) - 进入 Group Management → Clients
- 将孩子的设备添加到
Kids组 - 进入 Settings → Schedules
- 设置特定时间段的拦截规则
启用 HTTPS
为管理界面启用 HTTPS:
bash
# 使用 Let's Encrypt 证书
cd /etc/pihole
openssl req -x509 -newkey rsa:4096 -keyout pihole.key -out pihole.crt -days 365 -nodes在设置中配置 HTTPS 证书路径。
📊 统计与监控
管理界面统计
Pi-hole 管理界面提供了详细的统计信息:
- Queries today:今日 DNS 查询数
- Blocked today:今日拦截数
- Percentage blocked:拦截率
- Top blocked domains:最常被拦截的域名
- Top clients:查询最多的设备
- Top domains:最常查询的域名
实时日志
进入 Tools → Query Log 查看实时 DNS 查询日志:
- 可以看到每个设备的查询记录
- 可以看到哪些域名被拦截
- 可以快速添加黑白名单
命令行工具
bash
# 查看统计
pihole stats
# 查看日志
pihole -t
# 启用/禁用拦截(5 分钟)
pihole enable
pihole disable 5m
# 更新广告列表
pihole -g
# 修复配置
pihole -r🔒 安全加固
禁用 DNS 转发
进入 Settings → DNS,禁用 Forward reverse lookups for local domains。
启用 DNSSEC
进入 Settings → DNS,启用 Use DNSSEC。
配置防火墙
bash
# 只允许内网访问 DNS
ufw allow from 192.168.1.0/24 to any port 53
ufw allow from 192.168.1.0/24 to any port 8082
# 允许 DHCP(如果启用)
ufw allow from 192.168.1.0/24 to any port 67
# 启用防火墙
ufw enable定期更新
bash
# 更新 Pi-hole
pihole -up
# 更新广告列表
pihole -g❓ 常见问题
Q: 某些网站打不开了?
原因:该网站被误拦截。
解决方案:
- 在管理界面的 Query Log 中查找被拦截的域名
- 将其添加到白名单
- 清除浏览器缓存
Q: 网速变慢了?
原因:上游 DNS 速度慢,或 Pi-hole 服务器性能不足。
解决方案:
- 更换更快的上游 DNS(如 119.29.29.29)
- 减少广告列表数量
- 增加 Pi-hole 服务器资源
Q: YouTube 广告没被拦截?
原因:YouTube 使用动态域名,广告域名会变化。
解决方案:
- 添加 YouTube 专用广告列表
- 使用自定义正则表达式规则
- 考虑使用 YouTube Premium
Q: 手机 APP 广告没被拦截?
原因:部分 APP 使用硬编码的 IP 地址,不通过 DNS 解析。
解决方案:
- 这是正常现象,无法通过 DNS 层面解决
- 可以使用 VPN 或代理来拦截
- 购买付费版 APP(无广告)
Q: Pi-hole 占用多少资源?
资源占用:
- CPU:< 5%(空闲时)
- 内存:< 100MB
- 硬盘:< 1GB(广告列表)
🚀 推荐搭配
| 工具 | 用途 | 推荐程度 |
|---|---|---|
| Unbound | DNS 递归解析,隐私保护 | ⭐⭐⭐⭐⭐ |
| Cloudflare WARP | 加密 DNS 查询 | ⭐⭐⭐⭐ |
| AdGuard Home | 另一个 DNS 拦截器 | ⭐⭐⭐⭐ |
| Tailscale | 安全远程访问 | ⭐⭐⭐⭐⭐ |
搭配 Unbound
yaml
services:
unbound:
image: mvance/unbound:latest
container_name: unbound
ports:
- '5335:53/tcp'
- '5335:53/udp'
volumes:
- ./unbound:/opt/unbound/etc/unbound
restart: unless-stopped
pihole:
image: pihole/pihole:latest
container_name: pihole
ports:
- '53:53/tcp'
- '53:53/udp'
- '8082:80'
environment:
DNS1: '127.0.0.1#5335'
DNS2: 'no'
depends_on:
- unbound
restart: unless-stopped📋 配置清单
| 项目 | 推荐配置 |
|---|---|
| 服务器 | N100 小主机 / 树莓派 4 |
| 静态 IP | 192.168.1.2 |
| 上游 DNS | 119.29.29.29 + 223.5.5.5 |
| 管理端口 | 8082 |
| 广告列表 | StevenBlack + 中文列表 |
🔗 相关文章
- N100 小主机搭建全攻略 - 家庭服务器硬件配置
- Nextcloud 私有化云盘 - 文件同步与共享
- Cloudflare Tunnel 实战 - 安全远程访问
- Tailscale 零信任网络 - 家庭网络安全
