问题
由于防火墙规则,无法从 WSL2 连接到 Windows X Server (VcXsrv)(有时可以工作,但有时不行;这很奇怪)。无法更改防火墙规则。
但从 Windows 到 WSL2 的任何连接都可以正常工作。
主意
是否可以将客户端/服务器对作为中间服务运行,以镜像 WSL 上的任何服务并使其可从 WSL 进行访问?
------------Windows Host------------
| [Windows X Server] <--- [Client] |
-----------------------------↑------
|
----------------WSL----------v---------
| [XGui Client] ---> [Mirror service] |
---------------------------------------
答案1
但从 Windows 到 WSL2 的任何连接都可以正常工作
作为背景,了解 WSL2 网络在虚拟 Hyper-V 交换机后面进行 NAT 非常重要。这确实是一个分离来自 Windows 主机的第 2 层网络。
沟通从视窗到考虑 WSL2出境来自 Windows 的流量以及入站到 WSL2 的流量,因此不需要防火墙规则。默认情况下,Windows 允许大多数出站流量,而在 WSL2 下运行的 Linux 发行版则接受大多数入站流量。
在这种情况下我们可以利用这一点......
是否可以将客户端/服务器对作为中间服务运行,以镜像 WSL 上的任何服务并使其可从 WSL 进行访问?
您已标记此内容索卡特这是一个合理的想法。我socat
以前曾以类似的方式成功使用过,但是(a)已经有一段时间了,(b)我需要重现我使用的配方并将其调整到X服务器,并且(c)socat
的选项很不错需要克服的痛苦。它很强大,但不一定易于使用。
因此,让我提出一个内置的、更简单的替代方案——ssh
从 Windows 到带有 X 转发的 WSL2。它实际上就是为了进行这种类型的遍历而设计的。
启用 OpenSSH客户对于 Windows(请参阅[文档](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
然后重新启动服务。
- 编辑 sshd 配置:
在 Windows 中,
XLaunch
使用默认选项启动 (VcXsrv) +“禁用访问控制”。来自 PowerShell:
$env:DISPLAY="localhost:0" ssh -Y -p 2222 wslusername@localhost
注:参见这个苏答案为什么
localhost
在这种情况下至关重要。您应该登录到 WSL2 实例,并使用 X 转发。
xterm
等应该启动到 VcXsrv。