Libvirt

virbr0 (libvirt) 和網路管理器上的 dnsmasq

  • December 7, 2020

我想在本地機器上執行 dnsmasq 以配置萬用字元以解析為 127.0.0.1 以進行測試。

但是,當我使用 systemd 啟動 dnsmasq 時,我收到以下錯誤消息:

[root@dhcppc4 ~]# systemctl status dnsmasq -l
● dnsmasq.service - DNS caching server.
  Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; disabled; vendor preset: disabled)
  Active: failed (Result: exit-code) since Fri 2015-10-09 21:49:58 BST; 14s ago
 Process: 2652 ExecStart=/usr/sbin/dnsmasq -k (code=exited, status=2)
Main PID: 2652 (code=exited, status=2)

Oct 09 21:49:58 dhcppc4 systemd[1]: Started DNS caching server..
Oct 09 21:49:58 dhcppc4 systemd[1]: Starting DNS caching server....
Oct 09 21:49:58 dhcppc4 dnsmasq[2652]: dnsmasq: failed to create listening socket for port 53: Address already in use
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Oct 09 21:49:58 dhcppc4 systemd[1]: Unit dnsmasq.service entered failed state.
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service failed.

對如何在沒有目前 DNS 伺服器執行(並用 確認dig @127.0.0.1)的情況下使用埠 53 感到困惑,我執行netstat -ln並發現一個程序正在監聽地址上的埠 53 192.168.122.1

tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN
udp        0      0 192.168.122.1:53        0.0.0.0:* 

ifconfig 顯示這192.168.122.1是虛擬介面 virbr0。

快速Google搜尋和 wiki 後,我了解到 libvirt 為主機提供虛擬網路以抽象物理介面。Libvirt 使用一個虛擬網路交換機,所有流量都通過該交換機路由$$ 1 $$. 預設虛擬網路交換機 virbr0 是在守護程序首次啟動時創建的。

然後我可以確認我可以在這個界面上通過 DIG 向 dnsmasq 發送查詢:

[grobinson@dhcppc4 ~]$ dig @192.168.122.1 +short
a.root-servers.net.
j.root-servers.net.
m.root-servers.net.
b.root-servers.net.
i.root-servers.net.
k.root-servers.net.
l.root-servers.net.
d.root-servers.net.
g.root-servers.net.
c.root-servers.net.
h.root-servers.net.
e.root-servers.net.
f.root-servers.net.

問題 1:我不明白讓 dnsmasq 在這個虛​​擬介面上監聽的原因?對於 /etc/resolv.conf,我可以看到在 DHCP 伺服器上配置的 DNS 伺服器告訴機器將查詢定向到 Google DNS 伺服器。它的用途是什麼?

# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4

我發現我可以編輯/etc/NetworkManager/NetworkManager.conf並添加該行dns=dnsmasq,然後使用 systemd 重新啟動網路管理器。從這裡開始,網路管理器被配置為將查詢定向到環回地址上的 dnsmasq,並且可以通過簡單的 dig 呼叫看到:

[grobinson@dhcppc4 ~]$ dig @127.0.0.1 +short
l.root-servers.net.
g.root-servers.net.
i.root-servers.net.
...

輸出現在netstat -ln顯示兩個套接字綁定並在埠 53 上偵聽:

tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN 

問題 2:為什麼網路管理員可以在 127.0.0.1 上啟動 dnsmasq 而我不能使用 systemctl?那是因為預設配置試圖在所有介面上偵聽,這對於 virbr0 失敗了嗎?我只需要說明所需的界面嗎?

問題3:好像dnsmasq有兩個配置選項:/etc/dnsmasq.conf和一個/etc/NetworkManager/dnsmasq.d/可以寫配置文件的文件夾。看起來後者是用於何時dns=dnsmasq設置和 dnsmasq 監聽 127.0.0.1,因為編輯/etc/dnsmasq.conf對@127.0.0.1 的查詢沒有影響。前者可以用於 libvirt 中的 dnsmasq 嗎?

預設情況下,libvirt 為其每個虛擬介面橋啟動一個 dnsmasq 實例。這樣做是為了向在虛擬網路中執行的 VM 提供 DHCP 服務。

http://wiki.libvirt.org/page/VirtualNetworking

本質上,每次使用預設設置啟動 VM 時,libvirt 都會創建 virbr 橋。如果您想防止這種情況發生,您需要在啟動 VM 之前自己創建網橋,然後以“網橋”模式啟動它,並將您的自定義網橋指定為參數。這是一個很好地解釋它的手冊頁。在 –network 選項下查看:

https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm

每次在 libvirt 中創建“虛擬網路”時,它也會為其啟動一個 dnsmasq 實例。因此,再次,您必須停止使用 libvrt 的虛擬網路並手動進行。

引用自:https://serverfault.com/questions/727998