將 dnsmasq 與 NetworkManager 結合使用

將 dnsmasq 與 NetworkManager 結合使用

眾所周知,NetworkManager 不能很好地發揮作用dnsmasq(參考:這裡)。我瀏覽了冗長的內容在這裡討論但仍不確定處理這種情況的建議方法是什麼。

我想做的就是dnsmasq用來為我的本地網路提供 DNS 和 DHCP。在這種情況下,推薦的方式是什麼?

即使對於 Ubuntu 14.04,問題似乎仍然存在,甚至漏洞據稱已修復。

作為變通辦法,人們正在禁用 NM 奴役,dnsmasq-base原因如下:

NM-enslaveddnsmasq使用硬編碼選項(C 語言),提供極為有限的功能。

  • 它不偵聽 ethX ( --listen-address=127.0.0.1)。所以我們不能將我們的伺服器用作本地網路PC的DNS伺服器,也就是它對區域網路來說完全沒有用處。
  • 它不快取請求 ( --cache-size=0)。無快取 ==> 無 DNS 查詢加速。這對 LAN 來說非常重要,因為有許多同時使用者。
  • 最後,我們還需要dnsmasq的DHCP和TFTP功能,所以即使NM+dnsmasq包含一個真正的DNS伺服器,我們也必須執行另一個dnsmasq

但我不確定它們是否仍然有效和/或修復如何解決問題。此外,他們都不清楚自己做了什麼以及如何解決問題。即,解決方案部分缺失冗長的討論。有人可以填空嗎? IE,

由於上述原因,Ubuntu 提供的開箱dnsmasq即用功能在伺服器端無法正常運作。而且,在客戶端,“那些 Ubuntu 筆記型電腦上安裝的 dnsmasq 無法從我的 DNS 伺服器進行 LAN DNS 查詢”, 因為“(Ubuntu 筆記型電腦的)NetworkManager 導致它們有一個奇怪的 127.0.1.1 名稱伺服器設定”(參考:LAN 或本地家庭網路的 DNS 解決方案

如何讓 dnsmasq 與 NetworkManager 順利運作,以便在伺服器端和用戶端向我的本機網路提供 DNS 和 DHCP(和 TFTP)?

TL博士

對於那些尋求答案的人。在下面的所有答案中,我發現最簡單的解決方案是@brad's,對於伺服器端(客戶端仍然沒有好的答案):

該問題的唯一解決方案是停用 NM-drive dnsmasq...,並安裝「標準」dnsmasq,然後透過其標準/etc/dnsmasq.conf設定檔對其進行設定。

答案1

我也有你的問題。

原則上,之後維基百科,似乎要啟用緩存,創建一個/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 中的 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重新申請。 (如果有任何疑問:布拉德的回答錯過了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

除了先前對這篇文章的回覆之外,我想補充一點,網路管理器的dnsmasq-base實例也會遵循該addn-hosts指令(放置在 /etc/NetworkManager/dnsmasq-shared.d/ 下面建立的設定檔中),強制 dnmasq -base 讀取本機/etc/hosts文件,儘管--no-hosts網路管理器使用選項呼叫 dnsmasq

這樣,我就成功地在我的 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 位址,並且為了穩定性,盡可能堅持使用預設的 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,那麼就會有麻煩。

這比用腳本取代 /usr/sbin/dnsmasq 更強大,如建議的那樣https://gist.github.com/magnetikonline/6236150

正確的解決方案是修改 dnsmasq 的呼叫方式以正確使用 dnsmasq 設定檔。我理解希望網路管理器「正常工作」的願望,但使工具防白痴意味著只有白痴才能使用它們。

相關內容