Systemd

如何避免 dnsmasq 和 systemd-resolved 之間的衝突?

  • October 6, 2020

我最近安裝了dnsmasq作為本地網路的 DNS 伺服器。dnsmasq 偵聽埠 53,該埠已被systemd-resolved的本地 DNS 存根偵聽器使用。

只需停止 systemd-resolved 然後在 dnsmasq 執行後重新啟動它即可解決此問題。但它在重新啟動後返回:systemd-resolved 以首選項啟動,並且 dnsmasq 不會啟動,因為埠 53 已在使用中。

我想,第一個明顯的問題是,我怎樣才能最好地讓 systemd-resolved 明白它不應該啟動本地 DNS 存根偵聽器,從而保留埠 53 供 dnsmasq 使用?

然而,一個更有趣的問題是這兩種服務通常是如何協同工作的。如果一個人正在使用 dnsmasq,它們是否甚至意味著並排工作或者是 systemd-resolved?

systemd 232(2017 年發布)開始,您可以編輯/etc/systemd/resolved.conf並添加以下行:

DNSStubListener=no

這將關閉與埠 53 的綁定。

該選項在resolved.conf 手冊頁中有更詳細的描述。

您可以找到您的系統正在執行的 systemd 版本:

systemctl --version

您可以systemd-resolved使用sudo systemctl disable systemd-resolved.

如果你想同時執行這兩個,你可以重定向systemd-resolved使用 localhost 作為主名稱伺服器。這將確保在訪問外部 DNS 伺服器之前將所有查詢定向到 dnsmasq 進行解析。這可以通過在文件nameserver 127.0.0.1頂部添加該行來完成/etc/resolv.conf。這也將禁用 systemd 的本地記憶體。

您可以在Arch Linux wiki上閱讀更多內容。我從那裡複製了這個,它很好地涵蓋了它。

然而,這並不能可靠地避免啟動時的錯誤,即如果 systemd-resolved 恰好首先啟動,dnsmasq 仍然會失敗。如果您的版本systemd足夠新,請使用Malvineous的答案。如果您的版本systemd太舊,您可以通過修改 dnsmasq 單元來解決此問題:在該[Unit]部分中,添加Before=systemd-resolved.

在此之後,如果您願意,可以為上游名稱伺服器創建一個單獨的文件並使用or選項/etc/dnsmasq-resolv.conf傳遞它,或者將上游名稱伺服器添加到 dnsmasq 配置文件並使用or選項。這樣你只有本地主機,一切都通過 dnsmasq。-r``--resolv-file``-R``--no-resolv``/etc/resolv.conf

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