将dnsmasq与NetworkManager一起使用


15

众所周知,NetworkManager不能很好地发挥作用dnsmasq(参考:here)。我在这里冗长的讨论中已略过,但仍不确定建议的处理方式是什么。

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

即使对于Ubuntu 14.04,问题似乎仍然存在,甚至该错误也被称为已修复。

作为解决方法,人们正在禁用由NM奴役的人,dnsmasq-base原因如下:

NM奴隶dnsmasq使用的硬编码选项(用C语言编写)提供了极其有限的功能。

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

但是我不确定它们是否仍然有效和/或该修复程序如何解决问题。此外,他们都不十分清楚他们做了什么以及如何解决问题。即,冗长的讨论中缺少解决方案部分。有人可以填补空白吗?即

由于dnsmasq上述原因,Ubuntu提供的开箱即用在服务器端不起作用。而且,在客户端,“在那些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配置文件对其进行配置。


2
仅适用于Google员工(例如我):在较新版本的ubuntu中,NetworkManager内的dnsmasq-core更为友好。在这里看到:askubuntu.com/questions/233195/...
A. Rabus

Answers:


3

我也有你的问题。

原则上,在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

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

总而言之,似乎14.04(由dnsmasq-base软件包提供)中受NM约束的dnsmask已完全锁定,因此无法启用缓存,也无法启用其他任何功能(dhcp,tftp)。

如果这是正确的,那么我认为,正如您所说,该问题的唯一解决方案是通过注释掉该行来禁用NM驱动器dnsmasq

dns=dnsmasq

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


欢迎使用超级用户布拉德!谢谢你的帮助!
xpt 2014年

1
实际上,这确实启用了缓存,因为它与一起运行--conf-dir=/etc/NetworkManager/dnsmasq.dcache-size使用的是您创建的文件中指定的内容。您可以使用dig
sirfz

6

可以通过将设置置于来覆盖设置/etc/NetworkManager/dnsmasq.d/*.conf。配置文件设置优先于命令行标志。当NetworkManager启动dnsmasq时将应用它们。运行sudo service network-manager restart重新申请。(如果有任何疑问:布拉德的答案错过了ps ax | grep dns表明--conf-dir观点的事实)

例如:

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

我记得,由于担心缓存中毒,NetworkManager默认情况下禁用dnsmasq缓存。对于所有用户都受信任的计算机,这可能不是问题。

如果已安装resolvconf软件包,则NetworkManager不会与集成resolvconf,并且127.0.1.1不会在本地使用NM的服务器。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的连接共享仍然足够。但是对于使用TFTP等的自定义配置的LAN:

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

谢谢。虽然你应该更充分地你的“在总结”命令做形容,即该指令还删除4包,如果你有他们目前 在更多的联系和讨论 reddit.com/r/Ubuntu/comments/2j0va4/...
nealmcb

非常同意@ nealmcb ,, Tobu,请解释为什么“对于只需要本地DNS缓存的人”,他们需要删除dnsmasq程序包。那么下一个echo命令是干什么的呢?因为dnsmasq将消失。
xpt

@xpt Tobu建议删除dnsmasq,但dnsmasq-base由于NM而仍应已安装。
Thalis Kalfigkopoulos

0

我想将特定的MAC分配给特定的IP地址,并且出于稳定性的考虑,请尽可能使用默认的Network Manager / 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,则会有麻烦。

这比使用https://gist.github.com/magnetikonline/6236150所建议的脚本替换/ usr / sbin / dnsmasq更为可靠。

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


感谢Christopher的回答,但是,我确实无法遵循... “我想将特定的MAC分配给特定的IP地址并出于稳定的目的” ... “ ps auxgww | grep dnsmasq显示最后命令行参数的的dnsmasq过程”的 ...... ‘我创造... 会工作 ...... ‘是的,这是不对的’ ......也就是说,我真的不能按照你的思路,以使您想在这里说些什么。
xpt

0

我的解决方案可能会破坏Network Manager并使其保持一切简单的工作方式。由于NM处理dnsmasq的方式很破旧,因此我只用下面的方法覆盖它。

解决该问题的方法是简单地执行以下操作:

sudo apt install dnsmasq
cp /etc/dnsmasq.conf ~/

编辑~/dnsmasq.conf用户目录中的文件,并保存它。

sudo rm -v /etc/dnsmasq.conf
sudo cp -v ~/dnsmasq.conf /etc/
sudo chattr +i /etc/dnsmasq.conf
sudo systemctl restart dnsmasq.service

我做了一个简单的bash别名,并将其放在〜/ .bash_aliases文件的底部,以使编辑dnsmasq.conf文件变得容易。这是别名:

alias="sudo chattr -i /etc/dnsmasq.conf && sudo nano -w /etc/dnsmasq.conf && sudo chattr +i /etc/dnsmasq.conf && sudo systemctl restart dnsmasq.service"

当然,您可以根据自己的喜好为别名中的第二个sudo命令选择任何编辑器,但是我为每个人使用了nano。保存文件,关闭并重新打开命令终端选项卡/窗口。这应该使别名可用于新打开的终端选项卡/窗口。

只需eddmc从您的用户帐户运行,它将要求您输入密码以执行提升权限的命令。

请注意,我始终chattr +i是文件。这样一来,Network Manager就不会用自己的配置覆盖您的配置。

在有线以太网连接上应该没有任何问题。我发现自从使用dnsmasq在具有无线功能的笔记本电脑上进行dns缓存时,我必须在连接到访问点后手动重新启动dnsmasq.service。我认为Network Manager可以执行连接时重新启动服务之类的任务,但我尚未对此进行研究。


0

尽管这里和其他地方有相反的说法,NetworkManager还是完全忽略了所有dmsmasq配置文件-甚至是其自己目录中的文件/etc/NetworkManager/dnsmasq-shared.d。该证明在NetworkManager的源代码中...这是相关的注释:

/ * dnsmasq可能会从其默认配置文件位置读取该文件,如果该位置是有效的配置文件,它将与此处的选项结合使用,并导致不良的副作用。就像发送虚假的IP地址作为网关一样。因此,告诉dnsmasq根本不要使用任何配置文件。* /

这里是相关源代码的链接(第139-144行)。


2
如果可能的话,指向源代码的链接将使读者可以验证该源代码并阅读相关的代码。
jamesc

1
所以是的,不能指定一个明确的配置文件。--conf-file硬编码为/ dev / null。但是,如果您查看用于通过NetworkManager启动dnsmasq的完整命令行,则会看到使用conf-dir:'/ usr / sbin / dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file = / var / run / NetworkManager / dnsmasq.pid --listen-address = 127.0.0.1 --cache-size = 400 --clear-on-reload --conf-file = / dev / null --proxy-dnssec --enable-dbus = org.freedesktop.NetworkManager.dnsmasq --conf-dir = / etc / NetworkManager / dnsmasq.d',表示已读取给定目录中的所有文件。
哈迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.