NetworkManager启用dnsmasq插件后绑定错误接口,无法连接本地dnscrypt-proxy
我之前也踩过这个NetworkManager+dnsmasq的坑,默认配置下它的行为确实有点反直觉——明明是回环地址,却非要走物理网卡的接口,导致连不上只监听lo的dnscrypt-proxy。不过咱们可以通过几个简单的配置调整来彻底解决这个问题,同时还能保留你需要的wildcard域名解析功能。
问题根源
当你启用NetworkManager的dnsmasq插件后,dnsmasq默认会使用当前活动网络接口的源IP来发起出站请求,哪怕目标是回环地址(比如127.0.2.1),它也会走物理网卡(比如你的enp6s0)而不是lo回环接口,自然就连不上只监听lo的dnscrypt-proxy了。
解决方案:强制dnsmasq仅使用回环接口
我们可以给NetworkManager的dnsmasq实例添加自定义配置,强制它只和回环接口打交道:
创建dnsmasq自定义配置文件
新建/etc/NetworkManager/dnsmasq.d/01-loopback-only.conf文件(NetworkManager会自动加载这个目录下的所有配置),内容如下:# 强制dnsmasq只监听回环接口,不碰物理网卡 interface=lo bind-interfaces # 强制转发DNS请求到dnscrypt-proxy时使用lo接口 server=127.0.2.1@lo # 你的wildcard域名解析规则 address=/local.site/127.0.0.1调整你的Home.nmconnection配置(可选但推荐)
既然已经让dnsmasq接管了DNS处理,你可以把Home.nmconnection里的dns=127.0.2.1;去掉,避免冲突——dnsmasq会自动按照我们上面的配置转发请求到dnscrypt-proxy。修改后的ipv4段可以是:..... [ipv4] address1=192.168.1.10/24,192.168.1.1 ignore-auto-dns=true method=manual .....重启NetworkManager生效
执行命令让配置生效:sudo systemctl restart NetworkManager
验证配置是否生效
检查dnsmasq的启动参数,确认它只绑定了lo接口:
ps aux | grep dnsmasq你应该能看到
--interface=lo和--bind-interfaces这些参数。测试wildcard解析是否正常:
dig test.local.site返回的A记录应该是127.0.0.1。
测试普通DNS请求是否能通过dnscrypt-proxy:
dig example.com @127.0.0.1应该能正常返回解析结果。
额外注意点
- 确保dnscrypt-proxy确实在监听回环接口的127.0.2.1,你可以用
ss -tulpn | grep dnscrypt-proxy检查,输出里应该有127.0.2.1:53的监听记录。 - 如果之后切换其他网络连接,这个配置也能正常工作,因为dnsmasq只会和回环接口交互,不会受物理网卡影响。
备注:内容来源于stack exchange,提问作者Nick

