我想在本機電腦上執行 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 伺服器的情況下獲取連接埠 53 感到困惑(並透過 確認dig @127.0.0.1
),我運行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 嗎?
答案1
預設情況下,libvirt 為其每個虛擬介面橋啟動一個 dnsmasq 執行個體。這樣做是為了向虛擬網路中執行的 VM 提供 DHCP 服務。
http://wiki.libvirt.org/page/VirtualNetworking
本質上,每次使用預設設定啟動虛擬機器時,libvirt 都會建立 virbr 橋。如果您想防止這種情況發生,您需要在啟動虛擬機器之前自行建立橋接,然後以「橋接」模式啟動它,並指定您的自訂橋接作為參數。這是一個很好地解釋它的手冊頁。查看 --network 選項下:
https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm
每次您在 libvirt 中建立「虛擬網路」時,它也會為其啟動一個 dnsmasq 執行個體。因此,再次強調,您必須停止使用 libvrt 的虛擬網路並轉而採用手動方式。
答案2
如果您希望使用相同的介面將本機 /etc/hosts 變更傳播到您的虛擬機,您只需對本機 libvirt 進程執行 SIGHUP 即可。
答案3
將您的 dnsmasq 執行個體配置為您希望其偵聽的介面的明確清單。
您/etc/dnsmasq.conf
可以使用介面名稱interface=eth0
或介面 IP listen-address=192.168.0.1
。即使使用此設置,dnsmasq 也將有助於綁定到所有接口,因此透過新增bind-interfaces
至設定檔來停用它。
或者,在設定檔中,使用 指定介面黑名單except-interface=virtbr*
。
資料來源: