從 WSL2 連接到主機
問題
由於防火牆規則,無法從 WSL2 連接到 Windows X Server (VcXsrv)(有時有效,但有時無效;這很奇怪)。無法更改防火牆規則。
但是從 Windows 到 WSL2 的任何連接都可以正常工作。
主意
是否可以將客戶端/伺服器對作為中間服務執行,以鏡像 WSL 上的任何服務並使其可以從 WSL 訪問?
------------Windows Host------------ | [Windows X Server] <--- [Client] | -----------------------------↑------ | ----------------WSL----------v--------- | [XGui Client] ---> [Mirror service] | ---------------------------------------
但是從 Windows 到 WSL2 的任何連接都可以正常工作
作為背景,重要的是要了解 WSL2 網路是在虛擬 Hyper-V 交換機後面進行 NAT 的。它確實是一個獨立於 Windows 主機的第 2 層網路。
從Windows到WSL2 的通信被視為來自 Windows 的出站流量,以及到 WSL2 的入站流量,因此不需要防火牆規則。預設情況下,Windows 允許大多數出站流量,而在 WSL2 下執行的 Linux 發行版接受大部分入站流量。
在這種情況下,我們可以利用它來發揮我們的優勢……
是否可以將客戶端/伺服器對作為中間服務執行,以鏡像 WSL 上的任何服務並使其可以從 WSL 訪問?
你有這個標記為socat,這是一個合理的想法。我
socat
以前以類似的方式成功使用過,但是 (a) 已經有一段時間了,(b) 我需要重現我使用的配方並將其調整到 X 伺服器,並且 (c)socat
的選項很友好工作的痛苦。它功能強大,但不一定易於使用。因此,讓我提出一個內置的、更簡單的替代方案——
ssh
從 Windows 到帶有 X 轉發的 WSL2。它真的被設計用來做這種類型的遍歷。
- 啟用適用於 Windows的 OpenSSH客戶端(請參閱
$$ doc $$(https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui#install-openssh-for-windows)。在這種情況下不需要伺服器,因為您必須為此打開防火牆規則(您說過您不能這樣做)。它已經隨 Windows 一起安裝,您只需要啟用該功能。
在 WSL2 下的 Linux 發行版中啟用 SSH 伺服器。您沒有提及您正在執行哪個發行版,但在 Ubuntu(預設發行版)下,您需要(如果我沒記錯的話):
- 編輯 sshd 配置:
sudo -e /etc/ssh/sshd_config
並選擇一個不同的埠——比如說 2222。PasswordAuthentication
如果您不使用密鑰,可以選擇啟用。- 確保
X11Forwarding=yes
它在 Ubuntu 中已經應該這樣做了。- 保存並退出。
sudo service ssh start
- 如果您收到有關缺少主機密鑰的消息,請嘗試
sudo dpkg-reconfigure openssh-server
然後重新啟動服務。在 Windows 中,使用預設選項 + “禁用訪問控制”
XLaunch
啟動(VcXsrv) 。從 PowerShell:
$env:DISPLAY="localhost:0" ssh -Y -p 2222 wslusername@localhost
注意:請參閱此 SU 答案,了解為什麼
localhost
在這種情況下很關鍵。
- 您應該登錄到 WSL2 實例,並使用 X 轉發。
xterm
等應該啟動到 VcXsrv。