自建 DNS 服务 Pi-Hole

大家好,今天想跟你们聊聊怎么在家用一台小机器搭建自己的 DNS 服务,也就是最近几年在极客圈里非常火的 Pi‑Hole。如果你跟我一样,受够了网页里层出不穷的广告、运营商的 DNS 劫持、或者想把局域网里的设备统一管理,那这篇文章或许能帮你打开新世界的大门。

---

1. 为什么要自建 DNS?

- 广告拦截:大多数网站的广告都是通过 DNS 返回的域名解析来加载的。Pi‑Hole 会把这些广告域名直接解析到 0.0.0.0,让它们压根进不来。

- 隐私保护:不再把查询记录交给运营商或公共 DNS(如 Google 8.8.8.8),所有请求都在本地处理,心里踏实。

- 加速访问:局域网内部直接返回 IP,省去跨境或跨运营商的路由跳转,访问速度往往会有明显提升。

- 统一管理:所有设备(手机、电脑、智能电视、IoT 设备)都可以把 DNS 指向 Pi‑Hole,一次配置,全网生效。

---

2. 准备工作

1. 硬件:树莓派、旧的 x86 小主机、NVIDIA Jetson、甚至一台常年开着的 Gen8 都可以。只要能跑 Debian/Ubuntu 系统,512 MB 内存足够。

2. 系统:推荐 Ubuntu Server 20.04 LTS 或 Raspberry Pi OS(64 位),两者对 Pi‑Hole 的兼容性都很好。

3. 网络:确保机器在局域网里有固定的 IP(可以 DHCP 预留或手动设定),并且能访问互联网(用于下载列表和更新)。

4. SSH:如果你是远程管理,最好先打开 SSH,省得每次都要接显示器。

> 小贴士:如果你用的是树莓派,建议使用 SSD(或高速 TF 卡)做系统盘,I/O 性能会更好,查询响应更快。

---

3. 一键安装 Pi‑Hole

Pi‑Hole 提供了一个官方安装脚本,几乎把所有依赖都打包好了。下面的步骤在大多数 Debian 系系统上都通用:

# 1. 切换到 root(或使用 sudo)

sudo su -

2. 下载并运行安装脚本

curl -sSL https://install.pi-hole.net | bash

脚本会弹出交互式界面,按提示选择:

- Upstream DNS:可以先选 Google(8.8.8.8)或 Cloudflare(1.1.1.1),后续可以在后台随意改。

- Block Lists:默认已经有一些公开的拦截列表,建议全部勾选,后面可以自己在后台添加更多。

- Web Interface:打开后可以在浏览器里查看统计、添加自定义域名等。

- IPv4 / IPv6:如果你只使用 IPv4,选 IPv4 即可;如果局域网里有 IPv6 设备,两个都打开。

安装完成后,脚本会给你一个管理密码(记得记下来),以及一行类似 http://<你的IP>/admin/ 的地址。打开浏览器,输入地址,用刚才的密码登录,就会看到 Pi‑Hole 的仪表盘。

---

4. 基础配置与使用

4.1 设置路由器 DNS

登录你的路由器(光猫或主路由),把 DHCP 分配的 DNS 改成 Pi‑Hole 的 IP。比如:

首选 DNS:192.168.1.100   # Pi‑Hole 的 IP

备用 DNS:8.8.8.8 # 防止 Pi‑Hole 宕机时还能上网

保存后,所有通过 DHCP 获得 IP 的设备会自动把 DNS 请求发送到 Pi‑Hole。

4.2 手动指定 DNS

如果有些设备(比如手机)不支持自动获取 DNS,你可以在对应设备的网络设置里手动填写:

DNS1: 192.168.1.100

DNS2: 8.8.8.8

4.3 查看统计

仪表盘左侧的 Query Log 会实时显示所有 DNS 查询。你可以:

- 按域名过滤,看看哪些广告域名被拦截。

- 按客户端查看哪台设备最“活跃”。

- 通过 Long‑term data 查看每日/每周的拦截趋势。

4.4 自定义白名单 / 黑名单

有时一些正常网站会被误拦截(比如某些视频站的 CDN),这时可以在 Whitelist 中添加对应域名。同样,如果你想手动屏蔽某个域名(比如某些追踪脚本),可以在 Blacklist 中加入。

---

5. 进阶玩法:广告拦截、DHCP、统计

5.1 更多拦截列表

官方自带的列表已经相当丰富,但如果你想更激进,可以在 Settings → Block Lists 中手动添加社区维护的列表,常用的有:

- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts

- https://v.firebog.net/hosts/Prigent-Ads.txt

添加后记得点 SaveUpdate,Pi‑Hole 会自动下载并合并。

5.2 用 Pi‑Hole 做 DHCP 服务器

如果你的路由器 DHCP 功能比较弱(比如只能分配 100 条),可以把 DHCP 任务交给 Pi‑Hole。步骤如下:

1. 在路由器里关闭 DHCP。

2. 在 Pi‑Hole 的 Settings → DHCP 中打开 DHCP server,设置 IP 范围(如 192.168.1.150–192.168.1.200),以及网关、DNS。

这样所有设备的 IP 分配、域名解析全部由 Pi‑Hole 一把抓,查询日志会更完整。

5.3 集成 Prometheus + Grafana

如果你想把自己的 DNS 统计做成炫酷的可视化面板,Pi‑Hole 提供了 Teleporter 接口和 FTL(the FTL engine)自带的 Prometheus exporter。只要在 FTL 配置里打开 DBIMPORT,再在 Prometheus 里抓取 pihole_* 指标,就能在 Grafana 画出拦截率、查询延迟等实时图表。

5.4 使用 DNS-over-HTTPS(DoH)

运营商有时候还是会劫持 DNS 查询,为了彻底加密,可以在 Pi‑Hole 的 Settings → DNS 中启用 DoH,把上游 DNS 换成 Cloudflare(1.1.1.1)或 Google(8.8.8.8)的 HTTPS 接口。这样即使在公司网络或公共 Wi‑Fi,也能保证查询不被窃听。

---

6. 常见问题小结

- Pi‑Hole 跑不起来怎么办?

先检查系统是否装了 dnsmasq(Pi‑Hole 自带的 FTL 本身已经实现了 dnsmasq 的功能),如果冲突需要先卸载系统的 dnsmasq。

- 某些网站被误拦截怎么办?

Whitelist 中加入对应域名,或者在 Query Log 中找到被拦截的记录,点 “Add to Whitelist”。

- 查询速度变慢?

确认 Pi‑Hole 的机器没有磁盘 I/O 瓶颈;可以把它放在 SSD 上,或者把日志级别调低(Settings → Privacy)。

- 路由器不支持自定义 DNS 怎么办?

大多数路由器都支持手动 DNS,如果真的不行,可以在每台设备上手动设置,或者用 Pi‑Hole 的 DHCP 功能直接接管。

---

结语

自建 DNS 服务其实并没有想象中那么高不可攀,只要有一台常年开着的“小主机”,装上 Pi‑Hole,几分钟就能把全网的广告拦截、隐私保护和访问加速一次性搞定。更重要的是,整个过程完全透明,你可以随时查看拦截了什么、谁在查询、甚至自己编写规则。

如果你也想让家里上网更干净、更安全,不妨动手试试。安装完成后,去仪表盘看看拦截数量,保证会让你惊喜连连。有什么问题,欢迎在评论区留言,咱们一起交流经验!祝你们玩得开心 🚀