當主機漫游到特定網路時,為什麼 DNS 在 QEMU“使用者網路”下停止解析?
我在筆記型電腦上使用 GNOME Boxes。每當筆記型電腦在網路(乙太網、不同位置的 Wi-Fi 或作為 USB 調製解調器的手機)之間移動時,來賓機器會使用預設設置自動獲得 Internet 連接。
來賓機器沒有與主機橋接,並且在主機的 LAN 上不可見,這意味著在將幀傳遞到主機的 LAN 之前,來賓的 MAC 地址已被覆蓋。
預設情況下,QEMU 將為訪客創建一個 SLiRP 使用者網路後端和一個適當的虛擬網路設備……
使用者網路是使用“slirp”實現的,它在 QEMU 中提供了一個完整的 TCP/IP 堆棧,並使用該堆棧來實現一個虛擬的 NAT’d 網路。
QEMU 的最後一個也是最奇怪的網路選項也是它的預設選項。這樣做是將“使用者模式網路堆棧”連接到 VLAN。此網路堆棧是 ip、tcp、udp、dhcp 和 tftp(等)協議的獨立實現。它可以處理來自 vlan 的幀,例如,使用有效地址響應 dhcp 請求,使用來自主機文件系統的文件響應 tftp 請求,或者通過創建可以轉發數據包數據的 udp/tcp 套接字。
請注意,此網路堆棧在 qemu 程序本身內執行。因此,例如,沒有單獨的 dhcp 或 tftp 程序處理這些請求。此外,堆棧通過從 udp/tcp 數據包中解包應用程序數據並通過連接 qemu 程序和目標程序的套接字轉發它們,從而有效地充當代理。
請注意,在上述上下文中,“vlan”代表“仿真”LAN,並不表示 IEEE 802.1Q VLAN ID。
預設情況下,訪客在 10.0.2.0/24 網路上的 IP 地址為 10.0.2.15。網關是 10.0.2.2。DNS 伺服器是 10.0.2.3。來賓可以通過連接 10.0.2.2 網關 IP 來訪問主機。
在特定的 Wi-Fi 網路中,所有訪客機器都無法訪問 Internet。我發現了另一個關於QEMU 下來賓中缺少 Internet 的問題,發現在某些設置下 DNS 可能無法開箱即用。所以,我檢查了我的。我可以通過訪客的 IP 訪問網站。此外,如果我手動配置 IPv4 連接,則如果我添加另一個已知解析器(例如 8.8.8.8)作為預設 10.0.2.3 之外的備份,解析將恢復。
據當地管理員稱,該 Wi-Fi 網路啟用了 VLAN 標記,可將本地電腦與訪問者的電腦分開。顯然,如果 VLAN 是一個問題,它會導致完全失去 Internet 訪問,而不僅僅是解決問題。
該網路的另一個特點是第一個 DNS 解析器被配置為拒絕大多數請求。提供了第二個解析器 8.8.8.8,但顯然 QEMU 沒有使用。
該問題在設備上仍然存在。我在兩台完全不同的筆記型電腦上嘗試了英特爾無線。至少從 10.4、“Bullseye”和“Sid”開始,該問題在 Debian“Buster”中被發現。
在預設的“使用者模式”網路中,QEMU 僅使用主機的第一個 DNS 名稱伺服器。因此,如果該名稱伺服器沒有正確解析,QEMU 將不會回退到任何其他可能在主機上配置為輔助的名稱伺服器。它會導致訪客明顯失去 Internet 連接,而主機仍然可以使用其備份名稱伺服器“隱藏”問題。
這是已知的 QEMU 行為,預計不會在 QEMU 中修復。這是2011 年 Debian 錯誤報告日誌 #625689的引述:
不,限制沒有記錄(還),而且也很難修復,或者可能真的不值得麻煩。兩個原因。首先,使用者模式網路不適合任何嚴肅的事情,你真的想要使用網橋的 Tap 網路,它的速度大約快 100 倍並且確實有效(例如 ICMP)。其次,實現相當簡單——對於 DNS,它只是將來自訪客的數據包轉發(如 NAT 框)從主機 /resolv.conf 到名稱伺服器——只有一個名稱伺服器,因為您不能一次 NAT 到兩個目的地。所以為了解決這個問題,qemu 必須成為 DNS 的應用級代理,而不是簡單的 NAT“設備”。
nameserver
通過/etc/resolv.conf
在主機上添加一些垃圾作為第一個垃圾很容易重現該問題。客人立即停止解決。對於 Debian 客戶機,要恢復網路,只需將另一個已知的解析器(例如 8.8.8.8)添加到
/etc/resolv.conf
. 這種配置更改不會在重新啟動來賓後繼續存在。