如何让网络管理器使用 openresolv + dnsmasq 配置域特定名称服务器

如何让网络管理器使用 openresolv + dnsmasq 配置域特定名称服务器

我经常同时连接到多个网络。这些网络中的每一个都通过 dhcp 提供名称服务器配置。例如网络 1:(eth0):

domain company1.corp #
nameserver 192.168.0.253
nameserver 192.168.0.254

网络2(tun0):

domain company2.corp #
nameserver 10.102.204.51
nameserver 10.102.208.51

# 名称已更改

同时连接到两个网络时:

# resolv.conf from NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

解析 service.company2.corp 不起作用,因为第一个名称服务器只知道company1.corp 名称。

受此启发文章,我已经设置了开放解析(resolvconf 实现)在我的 Arch Linux 安装上配置本地 dnsmasq 服务。

如果我使用 resolvconf 手动配置名称服务器:

# resolvconf -d NetworkManager
# echo "domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
" | resolvconf -a eth0
# echo "domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51
" | resolvconf -a tun0

然后我就能够解析来自company1.corp和company2.corp的名称(本地dnsmasq服务器处理这个问题。)

请注意,手动配置后,resolveconf -l 分别显示 2 个配置:

~ # resolvconf -l
# resolv.conf from tun0
domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51

# resolv.conf from eth0
domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254

但是,当让网络管理器进行配置时,这两个配置并不是分开的,就像网络管理器写入 /etc/resolve.conf 时的情况一样

~ # resolvconf -l
# resolv.conf from NetworkManager
# Generated by NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

我的问题是如何让网络管理器正确调用resolveconf,以便每个接口的名称服务器单独注册。 (不幸的是,谷歌搜索是没有用的,因为谷歌认为“resolveconf”==“resolve.conf”)

答案1

NetworkManager 具有管理内置本地 dnsmasq 服务器的功能。无需使用 resolvconf/openresolv 来执行此操作。

要启用此功能:

  • 如果先前启用了 resolvconf/openresolv dnsmasq 配置,请禁用它,并确保没有 dnsmasq 实例在运行。
  • 确保已安装 dnsmasq
  • 添加。dns=dnsmasq/etc/NetworkManager/NetworkManager.conf
  • 重新启动网络管理器

完成此操作后,您将看到 NetworkManager 已启动 dnsmasq 进程:

$ pgrep dnsmasq -fl
1697 /usr/bin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/nm-dns-dnsmasq.pid --listen-address=127.0.0.1 --conf-file=/var/run/nm-dns-dnsmasq.conf --cache-size=400 --proxy-dnssec

/etc/resolve.conf应该指向本地 dnsmasq 实例:

$ cat /etc/resolv.conf
# Generated by NetworkManager
domain company1.corp
search company1.corp
nameserver 127.0.0.1

我们可以看到 dnsmasq 正在使用哪些服务器:

# cat /var/run/nm-dns-dnsmasq.conf 
server=/company2.corp/10.102.208.51
server=/10.in-addr.arpa/10.102.208.51
server=192.168.1.244
server=192.168.1.239

答案2

按照 Gary van der Merwe 的回答去做,但是在

/etc/NetworkManager/NetworkManager.conf

我必须添加

[main]
dns=dnsmasq

到文件。不只是

dns=dnsmasq

这是因为该文件中的所有设置都必须位于一个部分下,而我的发行版 manjaro (archlinux) 版本的 NetworkManager 软件包不会填充配置文件。 (我假设加里的发行版确实如此,因为他建议的线路对他和其他人都有效)

另请注意,任何 dnsmasq 配置都必须放入此配置文件中

/etc/NetworkManager/dnsmasq.d/

目录。它可能是您计算机上的不同目录。我通过查看 NetworkManager 用于启动 dnsmasq 守护进程的行了解了所使用的目录。您可以通过运行看到这一行ps aux|grep dnsmasq。您必须等到修改 NetworkManager 的配置并重新启动其服务后才能运行此命令。

答案3

看起来 NetworkManager 只是覆盖/etc/resolv.conf而不是使用 openresolv。根据FS#24635,NetworkManager 确实支持 openreslov,但最初并未在构建中启用。您运行的是哪个版本的 Arch Linux?网络管理器软件包的版本是什么?

相关内容