前言
一直想建立一个家庭内部的DNS服务器,今天想了想也终于是建立了起来。
正文
1. 上游DNS
这里我们这里要把树莓派当作家庭DNS服务器,所以上游DNS肯定得有的,不然怎么连接?
1.1 国内可用的公共DNS
以下几个在大陆一般是可用的:
114 DNS:
114.114.114.114
和114.114.115.115
(中国电信背景,最常用,稳定性好)阿里 DNS:
223.5.5.5
和223.6.6.6
(阿里云运营,国内解析速度快)腾讯 DNSPod:
119.29.29.29
百度 DNS:
180.76.76.76
这些都在国内有节点,解析速度比国外快很多。
1.2 国外可用的公共DNS
8.8.8.8(Google DNS):常年在大陆不稳定,大概率不可用。
1.1.1.1(Cloudflare DNS):部分地区能用,但可能延迟高,且有丢包。
OpenDNS(208.67.222.222):有时能用,但延迟也偏高。
如果你不是“必须走国外”,不推荐直接作为备用。
1.3 建议配置(中国大陆场景)
比较稳妥的组合是:
首选 DNS(Pi-hole):树莓派的 IP(比如
192.168.1.50
(这篇文章中,我们用50作为我们树莓派的静态IP))备用 DNS:
国内 DNS 一个(比如
114.114.114.114
)如果你想要“双保险”,可以再额外放一个国外的(如
1.1.1.1
),但别指望它稳定。
2. 设置静态IP
2.1 update 和 vim安装
我们这里用的是pi-hole来建立,参考自 Pi-hole。
在此之前,先拿出我们的树莓派4b,然后烧录一个Pi OS系统,打开树莓派,更新一下系统:
sudo apt update && sudo apt upgrade -y
我这里喜欢用vim,顺便安装一个VIM
sudo apt install vim
2.2 NetworkManager配置
我们首先来确认一下,我们的是什么管理方式:
ps -e | grep -E "dhcpcd|NetworkManager|systemd-networkd"
如果输出里有
dhcpcd
→ 就是 dhcpcd(只是缺少配置文件,可以新建)。如果有
NetworkManager
→ 就是 NetworkManager。如果有
systemd-networkd
→ 就是 systemd-networkd。
我们发现我们这里用的是Network Manager的网络管理方式:
先来查看网卡连接的名称:
nmcli connection show
然后我们来设置静态IP,这里我们想把静态IP 设定在 192.168.1.50
,让我们先来确认一下这个端口有没有程序在运行:
ping 192.168.1.50
没有,那么我们可以直接开始静态IP设置(基于 Nework Manager):
# 设置静态 IPv4 地址(192.168.1.50):
sudo nmcli connection modify "Wired connection 1" ipv4.addresses 192.168.1.50/24
# 设置网关(你的路由器,192.168.1.1):
sudo nmcli connection modify "Wired connection 1" ipv4.gateway 192.168.1.1
# 设置 DNS(路由器和一个国内公共 DNS):
sudo nmcli connection modify "Wired connection 1" ipv4.dns "192.168.1.1 114.114.114.114"
# 启用手动 IPv4(关闭 DHCP):
sudo nmcli connection modify "Wired connection 1" ipv4.method manual
# 断开并重新连接使配置生效:
sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1"
我们来验证一下是否生效:
# 查看 IP 是否生效
ip addr show eth0
# 测试能否联网
ping -c 4 www.baidu.com
发现静态IP设置成功了,并不是一个dynamic的,到现在我们就可以开始我们的pi-hole安装之旅了。
3. 安装 Pi-hole
3.1 开始安装
参考来自 pi-hole/pi-hole
一步自动安装:
想要快速便捷地开始使用 Pi-hole 的用户可以使用以下命令安装:
sudo curl -sSL https://install.pi-hole.net | bash
安装过程要点:
选择静态 IP → 系统会自动识别
192.168.1.50
,直接确认(我们这里已经设置好了,直接确认)选择网络接口 → 选 eth0
上游 DNS → 推荐选国内的(例如 114.114.114.114 / 223.5.5.5)
其中如果是中国大陆网络,如果要用AdlistBlock的话(因为pi-hole本来就是为了过滤广告制作的),请先不要选择Yes,否则你会去拉去Github的仓库,会卡在安装界面。
安装完成后 → 访问
http://192.168.1.50/admin
打开后台
需要用到su 权限
选择静态 IP → 系统会自动识别 192.168.1.50,直接确认(我们这里已经设置好了,直接选择):
选择网络接口 → 选 eth0(因为我们这里是插的网线,更稳定):
上游 DNS → 推荐选国内的(例如 114.114.114.114 / 223.5.5.5):
其中如果是中国大陆网络,如果要用AdlistBlock的话(因为pi-hole本来就是为了过滤广告制作的),请先不要选择Yes,否则你会去拉去Github的仓库,会卡在安装界面。其余的都选Yes即可。
3.2 额外:Pi-hole 的 FTL 隐私模式选项
一般有 4 个级别(数字越大,隐私越强,保存的信息越少):
Show everything(显示所有)
保存完整日志(查询的域名、客户端 IP、时间戳)。
管理后台能看到“谁访问了什么网站”。
最详细,但隐私性最低。
Hide domains(隐藏域名)
日志中仍然显示客户端(谁发起的请求),但不显示具体访问的域名。
适合不想暴露浏览记录,但仍想知道设备是否在工作。
Hide clients(隐藏客户端)
日志中只显示访问的域名,不显示是哪台设备请求的。
适合共享网络,避免知道是谁访问了什么。
Anonymous mode(完全匿名)
不保存客户端、不保存域名,只保存最基本的统计(比如请求总数、阻止了多少广告)。
隐私性最高,但可见信息最少。
3.3 安装结束
安装完成后,登录 Web 管理后台,在浏览器打开:
http://192.168.1.50/admin
成功!
4. 手动指定DNS
在用路由器开始DHCP之前,我们先来单个指定DNS来测试一下,我们的本地DNS服务器是否成功。
控制面板 → 网络和共享中心 → 更改适配器设置
找到你的网络(有线或无线) → 右键属性
双击
Internet 协议版本4 (TCP/IPv4)
选择 “使用下面的 DNS 服务器地址”
首选 DNS:
192.168.1.50
备用 DNS:
公共上游DNS服务器/自家路由器
保存 →
ipconfig /flushdns
刷新缓存。
其实我们这里备用DNS有两种选择:
公共DNS服务器:114.114.114.114
路由器:192.168.1.1
这里备用DNS的主要好处就是,如果网络我们的家庭内网DNS服务器(树莓派)不运行了,家里面的设备也不至于找不到DNS表格从而上不了网。
最简单的就是直接配置公共DNS服务器 (114.114.114.114,或者其他,详情见 第一节 上游DNS),但是还有一种办法是直接转给路由器,这里因为直接转给路由器其实稳定性更高一点,但是我们需要确定一点,转给路由器有可能导致互联网回路,有的路由器说不定会把DNS请求又转发回给pi-hole,这就导致回路,这样主机一样拿不到DNS表格。让我们测试一下(通过192.168.1.1
)来查询www.baidu.com
的ip地址:
nslookup www.baidu.com 192.168.1.1
发现,没有问题,他不会去寻求192.168.1.50
(我们的pi-hole服务器)的帮助,不会形成回路。
然后我们看看我们的DNS服务器是否配置成功:
ipconfig /all
发现很成功,接下来就是对所有的设备进行广播了,这个我们要去到路由器里面。
5. 路由器DHCP设置
5.1 DHCPv4配置
我的是中国联通,路由器后面写的地址是192.168.1.1
,但是登陆进去发现没有DHCP功能,后来问了一下联通技工那边,那边说除了这个家庭能看见的,还有一个管理员内网,找了一下,确实有,在那里面的功能可太全面了,所以如果大家发现自己的内网没有DHCP服务器的时候,建议问一问客服那边,说不定是给了一个阉割版的内网登陆。
直接找到LAN配置-DHCPv4配置:
5.2 DHCPv6配置
我们发现除了DHCPv4配置,我们还能设置DHCPv6配置。
但是如果你想要指定一个ipv6静态地址给pi-hole,可以用下面的命令:
# 给 eth0 加一个固定 IPv6 地址
sudo nmcli connection modify "Wired connection 1" ipv6.addresses "2408:8266:e0f:f70::50/64"
# 设置 IPv6 为 manual(否则它还是可能用 DHCPv6)
sudo nmcli connection modify "Wired connection 1" ipv6.method manual
# 重启网络连接
sudo nmcli connection down "Wired connection 1" && sudo nmcli connection up "Wired connection 1"
然后查看 ip -6 addr show eth0
应该就会发现一条 inet6 2408:8266:e0f:f70::50/64 scope global
行,这就说明成功了:
外部机尝试一下 nslookup www.google.com 2408:8266:e0f:f70::50
,发现可以使用:
6. 测试local DNS
既然我们是做本地DNS服务器的,自然要测试一下功能,打开 Settings - Local DNS Record,我们这里绑定一个 home.lan
到 192.168.1.50
上。
ping 一下:
ping home.lan
发现成功:
总结
很久之前一直想弄的东西,现在完成了!
用树莓派做家庭的本地DNS服务器,嘿嘿嘿
参考
[1] ChatGPT
[2] Pi-hole