virbr0 (libvirt) 和網路管理器上的 dnsmasq
我想在本地機器上執行 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
並發現一個程序正在監聽地址上的埠 53192.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 的虛擬網路並手動進行。