Dns
如何讓 networkmanager 使用 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 名稱。
受這篇文章的啟發,我設置了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