将 dnsmasq 与 NetworkManager 结合使用

将 dnsmasq 与 NetworkManager 结合使用

众所周知,NetworkManager 与以下系统配合不佳dnsmasq(参考:这里)我浏览了冗长的讨论在这里但仍然不确定处理这种情况的推荐方法是什么。

我想要做的就是dnsmasq使用为我的本地网络提供 DNS 和 DHCP。在这种情况下,推荐的方法是什么?

看来问题仍然存在,即使是 Ubuntu 14.04,甚至漏洞据称已经修复。

dnsmasq-base为了解决这个问题,人们出于以下原因禁用了 NM 奴役:

NM-enslaveddnsmasq使用硬编码选项(在 C 语言中),提供的功能极其有限。

  • 它不监听 ethX(--listen-address=127.0.0.1)。所以我们不能将我们的服务器用作本地网络 PC 的 DNS 服务器,也就是说,它对 LAN 完全没用。
  • 它不缓存请求(--cache-size=0)。无缓存 ==> DNS 查询无加速。这对于局域网来说也非常重要,因为局域网中有许多并发用户。
  • 最后,我们还需要 dnsmasq 的 DHCP 和 TFTP 功能,因此即使 NM+dnsmasq 包含真正的 DNS 服务器,我们也必须运行另一个 dnsmasq

但我不确定这些建议是否仍然有效,以及/或者修复如何解决了问题。此外,他们都没有明确说明他们做了什么以及如何解决问题。也就是说,解决方案部分缺失了冗长的讨论。有人可以填一下空白吗?例如,

由于上述原因,Ubuntu 提供的开箱dnsmasq即用功能在服务器端无法正常工作。此外,在客户端,“安装在这些 Ubuntu 笔记本电脑上的 dnsmasq 无法从我的 DNS 服务器执行 LAN DNS 查询”, 因为“(Ubuntu 笔记本电脑的)NetworkManager 导致它们拥有奇怪的 127.0.1.1 名称服务器设置”(参考:LAN 或本地家庭网络的 DNS 解决方案

如何使 dnsmasq 与 NetworkManager 顺利协作,以便在服务器端和客户端为我的本地网络提供 DNS 和 DHCP(和 TFTP)?

总结

对于那些寻求答案的人来说。在下面的所有答案中,我发现最简单的解决方案是@brad的,因为服务器端(对于客户端来说仍然没有好的答案):

解决该问题的唯一方法是禁用 NM 驱动器 dnsmasq...,并安装“标准”dnsmasq,然后通过其标准/etc/dnsmasq.conf配置文件对其进行配置。

答案1

我也有你的问题。

原则上,之后wiki.archlinux,似乎要启用缓存,只需创建一个/etc/NetworkManager/dnsmasq.d/cache包含以下内容的文件即可

$ cat /etc/NetworkManager/dnsmasq.d/cache 
cache-size=1000

我尝试了这个,但是,在 NM 重新启动后,仍然没有缓存:

# ps ax | grep dns
11724 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

请注意,引用的配置文件始终是空的:我无法使用此过程配置任何选项。

总而言之,似乎 14.04 中的 NM-enslaved dnsmask(由 dnsmasq-base 包提供)已被完全锁定,因此无法启用缓存,也无法执行其他任何操作(dhcp、tftp)。

如果这是正确的,我认为,正如你所说,解决问题的唯一方法是通过注释掉以下行来禁用 NM-drive dnsmasq

dns=dnsmasq

在文件中/etc/NetworkManager/NetworkManager.conf安装“标准”dnsmasq,然后通过其标准/etc/dnsmasq.conf配置文件对其进行配置。

答案2

可以通过将设置放入 来覆盖设置/etc/NetworkManager/dnsmasq.d/*.conf。配置文件设置优先于命令行标志。它们在 NetworkManager 启动 dnsmasq 时应用。运行sudo service network-manager restart以重新应用。(如果有任何疑问:brad 的回答忽略了ps ax | grep dns显示--conf-dir参数的事实)

例如:

echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

我记得 NetworkManager 默认禁用 dnsmasq 缓存,因为担心缓存中毒。对于所有用户都受信任的机器来说,这可能不是问题。

NetworkManager 不与 集成resolvconf,并且如果安装了 resolvconf 包,则 NM 的服务器127.0.1.1将不会在本地使用。resolvconf 是 ubuntu-minimal 和标准 Debian 安装的一部分;NetworkManager 以更集成、更少基于脚本的方式重新实现了该功能。

NetworkManager 确实确保不会干扰全局 dnsmasq 实例(绑定到辅助环回 IP 并bind-interfaces通过进行设置/etc/dnsmasq.d/network-manager)。如果您安装全局 dnsmasq 实例并保留 NM 的实例,请仔细检查/etc/resolv.conf主机默认将使用哪一个。

虽然您可以自定义 NetworkManager 的 dnsmasq 实例(如上所示),但如果您想要一个绑定到公共接口的 DNS 服务器,则应安装软件包dnsmasq(NetworkManager 仅使用dnsmasq-base,不配置全局实例)并将您的配置放入/etc/dnsmasq.d/*.conf。NetworkManager 的从属实例仅用于绑定到环回接口,超出该范围进行配置可能会破坏它。


总而言之,对于只需要本地 DNS 缓存的人来说:

sudo apt-get remove dnsmasq resolvconf dhcpcd5 rdnssd
echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

对于简单的 LAN,NetworkManager 的连接共享应该足够了。但对于自定义配置的 LAN,使用 TFTP 等:

sudo apt-get install resolvconf dnsmasq
echo 192.168.0.50,192.168.0.150,12h |sudo tee -a /etc/dnsmasq.d/lan.conf
echo enable-tftp |sudo tee -a /etc/dnsmasq.d/lan.conf
sudo service dnsmasq restart

答案3

除了之前对这篇文章的回复之外,我想补充一点,Network-manager 的dnsmasq-base实例也将遵循addn-hosts指令(放置在 /etc/NetworkManager/dnsmasq-shared.d/ 下创建的配置文件中),强制 dnmasq-base 读取本地文件,尽管Network-Manager 使用选项/etc/hosts调用了 dnsmasq--no-hosts

这样,我成功地在 Mint 20.1 笔记本电脑上设置了本地 DNS 服务器。无需摆弄 IP 地址(/etc/hosts已提供正确设置...)

在下面找到一个工作示例...

 # /etc/NetworkManager/dnsmasq-shared.d/local-DNS.conf
 domain=local.wifi              // specify the (local) DNS-domain
 addn-hosts=/etc/hosts          // force dnmasq to read /etc/hosts despite --no-host
 bogus-priv                     // do not forward private reverse lookups to upstream server (not needed if there is none...)
 dhcp-option=6,[IP-OF-WIFI_IF]  // tell client to use [IP-OF-WIFI_IF] as DNS-Server

答案4

我想将特定的 MAC 分配给特定的 IP 地址,并且为了稳定性,尽可能坚持使用默认的网络管理器/dnsmasq。

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c确实有关于使用 --conf-file 忽略配置的评论,但后面的文件中有

/* dnsmasq exits if the conf dir is not present */
    if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR))
        nm_cmd_line_add_string (cmd, "--conf-dir=" CONFDIR);

在 Ubuntu 16.04 LTS 下,设置 Wi-Fi 热点并共享另一个连接后,ps auxgww | grep dnsmasq显示每个 dnsmasq 进程的最后一个命令行参数是:

--conf-dir=/etc/NetworkManager/dnsmasq-shared.d

因此,可以在该目录中创建在网络管理器启动的所有 dnsmasq 调用之间共享的配置文件。

我创建了 /etc/NetworkManager/dnsmasq-shared.d/Hue

dhcp-host=0c:4d:e9:a0:ce:cf,192.168.1.221

并重新启动,尽管正在运行

sudo service network-manager restart

就会起作用。

这使得我的设备获得了适当的 IP 地址。

是的,这是错误的,因为这意味着 NetworkManager 对 dnsmasq 的所有调用都将获得此声明,但在这种情况下,这是无害的,因为只有当 MAC 出现在相关网络上时,它才重要。如果网络不是 192.168.1,那么就会有麻烦。

这比用脚本替换 /usr/sbin/dnsmasq 更为强大,如https://gist.github.com/magnetikonline/6236150

正确的解决方案是修改 dnsmasq 的调用方式,以正确使用 dnsmasq 配置文件。我理解希望网络管理器“正常工作”的愿望,但让工具变得傻瓜化意味着只有傻瓜才能使用它们。

相关内容