Dns

如何讓 networkmanager 使用 openresolv + dnsmasq 配置特定於域的名稱伺服器

  • January 11, 2022

我經常同時連接到多個網路。這些網路中的每一個都通過 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 名稱。

受這篇文章的啟發,我設置了openresolv(一個 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

但是,當讓網路管理員進行配置時,這 2 個配置不是分開的,就像網路管理員正在寫入 /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,以便分別註冊每個介面的名稱伺服器。(不幸的是,Google搜尋是沒用的,因為Google認為“resolveconf”==“resolve.conf”)

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

引用自:https://unix.stackexchange.com/questions/37264