@(HomeLab)[Pi-hole]
使用 Pi-hole 作为 DNS 和 DHCP 服务器
在使用 OpenWrt 的过程中,因为会经常修改 OpenWrt 的配置,导致 OpenWrt 出问题重新安装后没有来得及备份的配置丢失;其中以 IP 地址静态分配最多
另外,因为需要通过 DNS 做广告拦截,所以需要使用 Pi-hole 作为 DNS 服务器,但是 Pi-hole 提供的 DNS 服务都是国外的,所以为了快速解析国内的 DNS,需要使用 Smartdns 作为 Pi-hole DNS 的上游;DNS 的解析在 Smartdns 中提供
配置 Docker macvlan 网络
因为在同一个服务器上提供了多个服务,因此存在端口冲突问题,Pi-hole 和 Smartdns 都需要 53 端口用于提供 DNS,而且 53 端口默认被 Ubuntu Server 使用;而且局域网中的设备需要访问 DHCP 服务,因此为了避免冲突,需要使用 macvlan 作为 Docker 网络的驱动
macvlan 是一种网卡虚拟化技术,允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP
通过 macvlan,可以为每个 Docker 容器提供特定的 IP 地址,用于局域网内的设置直接通过容器的 IP 地址访问
- 开启网卡混杂模式
默认情况下网卡只会将发送给本机的包传递到上层服务,其他的包一律丢弃;开启混杂模式后机器的网卡能够接收所有流经过它的数据流,而无论其目的地址是否是它,因此,为了能让 Docker 容器能正常收到其他设备的请求,需要开启网卡混杂模式;需要注意 eth0 要和实际的网卡名称一致
1 | sudo ip link set eth0 promisc on |
- 创建 macvlan 网络
创建 macvlan 网络时,指定其 IP 范围和网关,与局域网一致,方便直接访问
1 | docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=eth0 macnet |
安装配置 Smartdns
以容器的方式运行 Smartdns,在配置中指定其上游 DNS
- smartdns.conf
在配置中添加了常用的 DNS 服务商作为上游 DNS ,可以通过 ping 的方式检查响应延时,删除超时的 DNS 上游
建议不要开启 IPV6,也不要使用 IPV6 地址作为 DNS 解析,开启后会导致网络非常明显的变慢
1 | #https://github.com/pymumu/smartdns/blob/master/etc/smartdns/smartdns.conf |
- 启动 Smardns 容器
在启动容器时指定 IP 地址为局域网内不冲突的固定 IP 地址;同时挂载配置文件到容器中
1 | docker run --restart always \ |
在启动完成后,使用 telnet 检查是否可以正常访问 53 端口
1 | telnet 192.168.2.21 53 |
安装配置 Pi-hole
- 启动 Pi-hole 容器
启动 Pi-hole 时同样需要指定 IP 地址
1 | docker run --restart always \ |
启动后访问 Pi-hole 的管理界面 http://192.168.2.20/admin,这时需要提供访问密码,可以进入到容器中进行修改
1 | docker exec -it pihole bash |
修改密码
1 | sudo pihole -a -p |

- 配置 Smartdns 作为上游服务器
在 Settings - DNS 中,配置上游的 DNS 服务,将 Smartdns 作为第一个上游服务服务;同时可以添加其他 DNS 服务,避免在 Smartdns 出现问题时使用其他 DNS 服务器
修改接口配置,允许所有的查询来源

- 配置 DHCP
在 Settings - DNS 中,启用 DHCP,指定分配的 IP 范围、路由器地址、本地域名以及 DHCP 过期时间

路由器配置 DHCP 和 DNS 服务
在路由器配置中, 选择关闭 DHCP,并指定 DNS 为 Pi-hole 的地址,重启路由器后,即可生效
- 关闭 DHCP
在网络-接口-LAN 中选择忽略此接口

- 配置 DNS
在网络-接口-LAN 配置中,将自定义的 DNS 服务器指向 Pi-hole 的地址
