Rau*_*han 6 networking ip-address windows-subsystem-for-linux 18.04
我正在 WSL2 中运行一个应用程序,其发行版是 Ubuntu 20.04。我可以使用 Ubuntu 的 IP 在 Windows 浏览器中访问该应用程序。
现在,我想在我的网络上访问此应用程序(我的意思是在其他计算机上的办公室网络中)
据我了解,ubuntu的IP仅适用于主机。我如何才能将其提供给我网络上的其他人?
我们应该怎么做?请帮忙。
WSL1 的简短回答:
配置一次防火墙规则,一切都应该“正常工作”。这是最简单的方法。
WSL2 的简短回答:
正确配置后,您可以使用 Ubuntu/WSL2 中的单个命令轻松启动端口转发:
ssh -f -N -R 8080:localhost:8080 "$(hostname).local"
Run Code Online (Sandbox Code Playgroud)
有关如何配置的详细信息如下。这并不一定容易,但这只是一次性设置。
(更多)更多细节:
正如 Steeldriver 在评论中指出的,WSL1 和 WSL2 在此表现不同。
附注只是为了澄清术语(因为注释中略有不同):“WSL”指的是控制两个版本(WSL1 和 WSL2)的子系统本身。
旁注 2. 请不要被这篇文章的长度吓跑。我只是说得很详细。考虑到相关的 Github 问题(目前)有 536 条评论,我认为相比之下我相当简洁;-)。
WSL1 无疑是更简单的用例。由于它是 Linux 系统调用和 Windows 内核之间的“转换层”,因此它实际上利用“真正的”Windows 网络接口。因此,您可以直接从网络上的另一台设备连接到 WSL1 中的端口。
但是,您可能仍然需要防火墙规则。我将在 WSL2 答案中介绍这一点,因为这对于两者来说都是常见的。请参阅New-NetFirewallRuleWSL2 部分中的命令。只需针对防火墙规则运行该命令(一次)即可。
但是,如果您的 Web 应用程序不需要 WSL2(而且大多数都不需要),那么从 WSL1 实例运行它通常要容易得多(或者至少以前是这样)。这就是大多数人最终所做的。另一方面,使用我在下面提出的新的(至少对我来说)WSL2/SSH 方法,它不像以前在 WSL2 中执行此操作那么痛苦。我将把选择哪条路线留给你。在这一点上,我认为两者都同样有效。
如果您选择使用 WSL1,我建议保留两个 Ubuntu 实例——一个使用 WSL1,另一个使用 WSL2。我就是做这个的。
要将现有 WSL2 实例复制到新的 WSL1,请退出现有实例,然后从 PowerShell 中执行以下操作:
# Adjust base path as desired
$WSL_ROOT = "$env:USERPROFILE\WSL"
$WSL_IMAGE_NAME = "$(get-date -UFormat `"%Y-%m-%d`") Ubuntu Backup.tar"
mkdir -p "$WSL_ROOT\images"
mkdir -p "$WSL_ROOT\instances\Ubuntu_WSL1"
cd $WSL_ROOT
wsl -l -v
# Confirm name of distribution - If it isn't "Ubuntu", adjust the following line as needed
wsl --export Ubuntu "$WSL_ROOT\images\$WSL_IMAGE_NAME"
wsl --import Ubuntu_WSL1 .\instances\Ubuntu_WSL1\ .\images\$WSL_IMAGE_NAME --version 1
wsl ~ -d Ubuntu_WSL1
Run Code Online (Sandbox Code Playgroud)
此时,您将处于 Ubuntu WSL1 实例中,但您将是 root 用户,因为 WSL 不会“记住”--import实例的默认用户名。按照此答案中的“方法 1”设置您的默认用户名。
此时,您有两个 WSL Ubuntu 实例,一个用于 WSL1 ( Ubuntu_WSL1),另一个用于 WSL2(可能Ubuntu或可能Ubuntu-20.04)。如果您使用的是 Windows 终端,它将检测它们并创建用于启动的配置文件。或者您始终可以使用手动启动wsl ~ -d <distroname>。
另一种选择是简单转换为 WSL1 并专门使用它。此步骤与复制它类似,因为您可能仍想备份。再次退出实例,并从 PowerShell 中退出:
# Adjust base path as desired
$WSL_ROOT = "$env:USERPROFILE\WSL"
$WSL_IMAGE_NAME = "$(get-date -UFormat `"%Y-%m-%d`") Ubuntu Backup.tar"
mkdir -p "$WSL_ROOT\images"
cd $WSL_ROOT
wsl -l -v
# Confirm name of distribution - If it isn't "Ubuntu", adjust the following line as needed
wsl --export Ubuntu "$WSL_ROOT\images\$WSL_IMAGE_NAME"
wsl --set-version Ubuntu 1
Run Code Online (Sandbox Code Playgroud)
在这种情况下无需重置默认用户名。
WSL2 开始变得更加复杂。虽然评论中有一个关于如何执行此操作的文档的链接,但我将向您指出原始的 Github 问题和评论,这些问题和评论真正让人们朝这个方向发展。
要使其在 WSL2 中正常运行,必须解决两个实际问题:
首先,WSL2网络是一个虚拟网络(实际上是Hyper-V vNIC)。正如您在问题中所指出的,它并不驻留在您的“办公室网络”上。您首先需要有某种方法告诉 Windows 主机将数据包路由到该端口的 WSL2 虚拟网络。
由于虚拟 WSL2 网络地址在每次重新启动(或wsl --shutdown)时都会发生变化,因此转发变得很复杂。这意味着(至少使用注释中记录的方法和 Github 问题)您必须重复以下过程:
...每次重新启动时。多么痛苦,对吧?
因此,我将提出我认为更简单的方法。如果您愿意,您仍然可以退回到其他方法。这有一些稍微复杂的设置,但几乎所有这些都只需完成一次。
此方法利用 SSH 提供端口转发。由于这是从 WSL2 端初始化的,因此它有几个优点:
首先,它可以作为运行应用程序(Web 服务器)时同一步骤的一部分来完成。您没有提到应用程序的架构/语言,但我假设最常见的架构/语言之一是 Node.js。如果是这种情况,您甚至可以将其包含在npm run脚本中。几乎可以肯定有一种技术适用于任何架构。
最重要的是,它不需要 WSL2 的 IP 地址。这样就无需在每次重新启动时执行上述 4 个步骤。
那么,我们开始吧。首先,有“一次性”设置:
启用 Windows OpenSSH 服务器。您可以按照 Microsoft 的说明进行操作,但我将在此进行总结。首先以管理员身份打开 PowerShell 提示符,然后:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Set-Service -Name sshd -StartupType 'Automatic'
Run Code Online (Sandbox Code Playgroud)
这应该会自动创建 SSH 转发规则。再次强调,如果遇到任何问题,请去看医生。
编辑C:\ProgramData\ssh\sshd_config并确保GatewayPorts yes没有被注释掉。我相信它默认是禁用的。
返回管理员 PowerShell,运行:
Start-Service sshd
Run Code Online (Sandbox Code Playgroud)
您没有提及您的网络应用程序运行的端口号,因此我将8080根据这些示例进行选择。根据需要进行调整。仍然在管理员 PowerShell 中运行:
New-NetFirewallRule -DisplayName 8080 -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow -Profile Private
Run Code Online (Sandbox Code Playgroud)
这:
如果您的网络已设置Public,请删除-Profile Private
退出管理员 PowerShell
有了这个,一切就都准备好了。要在此时开始转发,请从 Ubuntu/WSL2 执行以下命令:
ssh -f -N -R 8080:localhost:8080 "$(hostname).local"
Run Code Online (Sandbox Code Playgroud)
使用您的Windows用户名和密码。
此时,您应该可以从同一办公网络上的另一台计算机(或电话或其他设备)访问您的网络应用程序。
解释:
"$(hostname).local"which(应该)总是通过mDNS找到正确的DNS名称(这个答案中的解释) 。-N在后台运行 ( )-fGatewayPorts yes因为我们在服务器配置中指定,这意味着它将将该转发扩展到网络上的其他主机。| 归档时间: |
|
| 查看次数: |
11897 次 |
| 最近记录: |