让 pi-hole docker 的 DHCP 与 libvirt dnsmasq 共存

不得不说,Linux 开发者都是一帮偏执的“天才”程序员。曾经有人提出过 dnsmasq 强制将 67 端口绑定至 0.0.0.0(所有网络界面),但是几位“天才”非要固执地说,这是为了负载平衡。结果,由 dnsmasq 魔改的 pihole-FTL,真的就和 libvirt 依赖的 dnsmasq 冲突了……

依照前人的解决办法,依然无法让 pi-hole 正常工作。在参阅了 pi-hole docker 文档pi-hole 源代码另一位前人的笔记之后,终于找到了目前为止最好的解决方案。

关掉 libvirt 里面的 dnsmasq

首先,停止 libvirt 的虚拟桥接网络

virsh net-destroy default

然后,编辑 libvirt 虚拟桥接网络的设置

virsh net-edit default

可以选择使用 nano 编辑器。

删除整个 <dhcp> 部分,保存退出。

再重启 libvirt 虚拟桥接网络

virsh net-start default

启动 pi-hole docker

注意以下几个环境变量

sudo docker run -d \
    --name pihole \
...
    -e DNSMASQ_LISTENING=bind \
    -e INTERFACE=eno1 \ # 填写需要绑定的网络界面
    -e WEB_PORT=8080 \
    -e IPv6=false \
...
    --cap-add=NET_ADMIN \
    --net=host \
    pihole/pihole:latest

其中,DNSMASQ_LISTENING=bind 是 pi-hole docker 文档中遗漏的选项。这个选项会在 01-pihole.conf 的末尾加上 bind-interfaces,也就是说只将 pihole-FTL 应用在 INTERFACE 所指向的网络界面上面。而 libvirt 的 dnsmasq 只应用在 virtbr* 网络界面上,所以不会产生冲突。

副作用

关掉了 libvirt 关联的 dnsmasq,会导致 qemu 虚拟机无法自动获得 IP 地址。也就是说每次新建虚拟机之后需要手工设置 IP。

添加新评论