不得不说,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。