如何避免 dnsmasq 和 systemd-resolved 之間的衝突?
我最近安裝了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