DNS是上网的第一道入口,每次访问网站前,设备都要先通过DNS服务器把域名翻译成IP地址。大多数家庭用户默认使用运营商或公共DNS,不仅解析速度参差不齐,隐私也难以保障,还要忍受各种弹窗广告的骚扰。而一台闲置的树莓派正好可以变身为一台低功耗、24小时运行的家用DNS服务器,配合Pi-hole和Unbound这两套开源工具,就能实现全屋广告拦截和快速域名解析,功耗只有几瓦,电费几乎可以忽略不计。

一、准备工作与系统环境搭建
搭建DNS服务器对硬件要求很低,树莓派3B、4B或者Zero 2W都可以胜任,建议搭配一张质量可靠的16GB以上TF卡。如果设备数量多、查询量大,推荐树莓派4B,它的内存和网络性能更好。软件方面推荐使用官方的Raspberry Pi OS Lite版本,也就是不带桌面环境的精简版,因为DNS服务器不需要图形界面,精简系统能省下更多资源,长期运行也更稳定。
首先用官方的Raspberry Pi Imager工具把系统写入TF卡。写入前记得在Imager的设置里开启SSH、配置好用户名密码,并提前设置无线网信息,这样开机后就能远程连接,不用额外接显示器和键盘。系统启动后用SSH连上树莓派,先做一轮基础更新:
sudo apt update && sudo apt upgrade -y sudo apt install -y curl dnsutils
更新完成后,设置主机名并检查系统时间是否正确,DNS服务的日志和证书验证都依赖准确的时间:
sudo hostnamectl set-hostname pihole timedatectl status
二、配置静态IP地址
DNS服务器最忌讳IP地址漂移。如果树莓派通过DHCP获取地址,一旦租约到期地址变化,全屋设备的DNS指向就会全部失效,表现为突然集体断网。所以在安装Pi-hole之前,必须先给树莓派固定一个内网IP。
固定IP有两种思路:一种是在路由器后台把树莓派的MAC地址和某个IP绑定,俗称DHCP静态分配,这是最推荐的方式,配置简单且不易出错;另一种是直接在树莓派系统里禁用DHCP客户端,手动写死网络配置。如果选择后者,可以用nmcli命令来操作:
sudo nmcli con show # 查看当前连接名称 sudo nmcli con mod "preconfigured" ipv4.method manual \ ipv4.addresses 192.168.1.10/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 127.0.0.1 sudo nmcli con up "preconfigured"
这里假设路由器地址是192.168.1.1,我们把树莓派固定在192.168.1.10,并把本机DNS指向127.0.0.1,为后面Pi-hole的运行做好铺垫。配置完成后用ping 192.168.1.1确认网络通畅。
三、安装并配置Pi-hole
Pi-hole是整套方案的核心,它本质上是一个本地的DNS解析服务,内置了数十万条广告域名黑名单。当家里任何设备发起域名查询时,Pi-hole会先判断该域名是否在黑名单中:如果是广告域名就直接拦截,返回空结果;正常域名则转发给上游DNS获取真实IP。整个过滤过程发生在网络层,浏览器、手机App里的广告都会被大量干掉,而且不需要在每个设备上单独装广告插件。
安装过程只需一条命令:
curl -sSL https://install.pi-hole.net | sudo bash
安装向导中会有几个关键选项:上游DNS提供商可以先随便选一个,后面会换成Unbound;监听接口选择eth0或wlan0(取决于你用有线还是无线);Web管理界面建议开启,方便日常查看拦截统计。安装完成后终端会显示管理后台地址和随机生成的管理员密码,务必记下来。如果忘了密码,随时可以用下面的命令重置:
pihole -a -p 你的新密码
装好后打开浏览器访问http://192.168.1.10/admin,就能看到实时查询量、广告拦截率等仪表盘数据。此时可以手动把电脑的DNS改成192.168.1.10试一试,访问几个常去的网站,观察仪表盘里拦截列表是否在增长。
四、集成Unbound实现自主递归解析
默认情况下Pi-hole会把查询转发给谷歌、Cloudflare等公共DNS,这意味着你的访问记录仍会被这些服务商看到。如果想把隐私做到极致,可以加装Unbound,让它直接从根域名服务器开始逐级递归查询,不再依赖任何第三方DNS服务商。
安装Unbound很简单:
sudo apt install -y unbound
然后创建配置文件,关键点是监听端口要设为5335,避开Pi-hole占用的53端口,同时关闭DNSSEC验证中不必要的部分,因为Unbound本身会完成完整验证:
sudo nano /etc/unbound/unbound.conf.d/pi-hole.conf
配置内容如下:
server:
verbosity: 0
port: 5335
do-ip4: yes
do-udp: yes
do-tcp: yes
prefetch: yes
harden-glue: yes
harden-dnssec-stripped: yes
edns-buffer-size: 1232保存后重启服务并测试,如果输出结果末尾包含flags: qr rd ra以及NOERROR字样,说明递归解析工作正常:
sudo service unbound restart dig pi-hole.net @127.0.0.1 -p 5335
最后在Pi-hole后台的Settings菜单中,把上游DNS改为127.0.0.1#5335,取消勾选所有默认的公共DNS,保存即可。从此家里的每一次域名解析都由树莓派独立完成。
五、让全屋设备用上新DNS
单个设备手动改DNS显然不现实,正确做法是在路由器的DHCP设置里,把下发的DNS服务器地址改为192.168.1.10。这样所有连入家里Wi-Fi的设备会自动获得新DNS,手机、平板、智能电视、IoT设备一网打尽,无需逐台配置。各品牌路由器入口不同,一般在“DHCP设置”或“LAN设置”里都能找到DNS字段。
修改后让设备重新连接一次Wi-Fi(或重启路由器)即可生效。验证方法很简单:在任意设备上访问http://192.168.1.10/admin的查询日志页面,应该能看到来自各个内网IP的查询记录。也可以访问一些广告密集的网站,对比广告数量的变化。需要提醒的是,部分App内嵌了自己的DNS(比如某些国产App写死了HTTPDNS),这类流量Pi-hole无法拦截,属于正常现象。
此外建议开启Pi-hole的本地DNS记录功能,把常用的内网服务(比如NAS、家庭影音服务器)绑定一个好记的域名,访问体验会好很多;再配合FTLDNS的缓存机制,热门域名的二次解析几乎是毫秒级返回。
六、日常维护与故障排查
树莓派长期运行主要注意两点:一是散热,虽然DNS服务负载不高,但夏季密闭环境里加一块散热片更稳妥;二是TF卡的寿命,可以定期用pihole -g手动更新广告黑名单,同时留意磁盘空间。也可以设置定时任务每周自动更新:
sudo crontab -e # 每周日凌晨三点更新黑名单并重启DNS服务 0 3 * * 0 pihole -g >/dev/null 2>&1
如果遇到全屋设备突然无法解析域名,排查思路按照从近到远:先用ping 192.168.1.10确认树莓派是否在线;再在树莓派本机执行pihole status查看服务状态;接着用dig baidu.com @192.168.1.10测试DNS响应。若Pi-hole本身正常但解析失败,多半是Unbound配置问题,可以用sudo unbound-checkconf检查配置语法,或查看/var/log/pihole.log中的详细日志。
还有一种常见情况是某个网站被误杀导致打不开,此时在Pi-hole后台的查询日志里搜索该域名,将其加入白名单即可。白名单功能支持通配符,处理一批相关域名很方便。
总体来说,用树莓派搭建家庭DNS服务器是一次投入极小、收益持续的项目。一块几百块的板子,换来的是全屋设备的广告拦截、更快的解析速度和完全自主可控的DNS解析链路,对于家中有NAS、智能家居设备的用户,还能顺手获得内网域名解析的便利,非常值得一试。