前言

一直想建立一个家庭内部的DNS服务器,今天想了想也终于是建立了起来。

正文

1. 上游DNS

这里我们这里要把树莓派当作家庭DNS服务器,所以上游DNS肯定得有的,不然怎么连接?

1.1 国内可用的公共DNS

以下几个在大陆一般是可用的:

  • 114 DNS114.114.114.114114.114.115.115
    (中国电信背景,最常用,稳定性好)

  • 阿里 DNS223.5.5.5223.6.6.6
    (阿里云运营,国内解析速度快)

  • 腾讯 DNSPod119.29.29.29

  • 百度 DNS180.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 个级别(数字越大,隐私越强,保存的信息越少):

  1. Show everything(显示所有)

    • 保存完整日志(查询的域名、客户端 IP、时间戳)。

    • 管理后台能看到“谁访问了什么网站”。

    • 最详细,但隐私性最低。

  2. Hide domains(隐藏域名)

    • 日志中仍然显示客户端(谁发起的请求),但不显示具体访问的域名。

    • 适合不想暴露浏览记录,但仍想知道设备是否在工作。

  3. Hide clients(隐藏客户端)

    • 日志中只显示访问的域名,不显示是哪台设备请求的。

    • 适合共享网络,避免知道是谁访问了什么。

  4. Anonymous mode(完全匿名)

    • 不保存客户端、不保存域名,只保存最基本的统计(比如请求总数、阻止了多少广告)。

    • 隐私性最高,但可见信息最少。

3.3 安装结束

安装完成后,登录 Web 管理后台,在浏览器打开:

http://192.168.1.50/admin

成功!

4. 手动指定DNS

在用路由器开始DHCP之前,我们先来单个指定DNS来测试一下,我们的本地DNS服务器是否成功。

  1. 控制面板 → 网络和共享中心 → 更改适配器设置

  2. 找到你的网络(有线或无线) → 右键属性

  3. 双击 Internet 协议版本4 (TCP/IPv4)

  4. 选择 “使用下面的 DNS 服务器地址”

    • 首选 DNS:192.168.1.50

    • 备用 DNS:公共上游DNS服务器/自家路由器

  5. 保存 →ipconfig /flushdns 刷新缓存。

其实我们这里备用DNS有两种选择:

  1. 公共DNS服务器:114.114.114.114

  2. 路由器: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.lan192.168.1.50 上。

ping 一下:

ping home.lan

发现成功:

总结

很久之前一直想弄的东西,现在完成了!

用树莓派做家庭的本地DNS服务器,嘿嘿嘿

参考

[1] ChatGPT
[2] Pi-hole

立志做一个有趣的碳水化合物。