如何用 WSL 搭建公用远程 Linux 服务器?

使用场景,将自己的WSL当做Linux 服务器分给其他用户使用。
大体思路:搭建 WSL - 按照普通 Linux 的方式配置 SSH 服务 - 配置 Windows 宿主机和 WSL 之间的端口转发 - 远程连接测试 - 限制用户访问宿主机文件系统
前置
要求已经搭建好了 WSL
按照普通 Linux 的方式配置 SSH 服务
在 WSL 终端中运行以下命令,检查 SSH 服务是否正在运行:
sudo service ssh status如果你没有配置过,输出应该如下:
* Starting OpenBSD Secure Shell server sshdsshd: no hostkeys available -- exiting. [fail]提示没有可用的 hostkeys,这是因为你还没有生成 SSH 主机密钥,按照如下命令生成密钥并启动:
sudo ssh-keygen -A && sudo service ssh startssh-keygen: generating new host keys: RSA DSA ECDSA ED25519* Starting OpenBSD Secure Shell server sshd [ OK ]然后修改 SSH 配置文件 /etc/ssh/sshd_config: 1.允许密码登录,先在配置文件中找到 PasswordAuthentication,将其值改为 yes,如果前面有 # 号注释符号,请去掉。2. 设置监听端口为 22(默认即可),将 Port 设置为 22,如果前面有 # 号注释符号,请去掉。
查看配置文件中的相关部分是否设置成功:
grep -E "^PasswordAuthentication|^Port" /etc/ssh/sshd_config输出应该为:
Port 22PasswordAuthentication yes重启 SSH 服务使配置生效:
sudo service ssh restart查看服务状态:
sudo service ssh status* sshd is running配置 Windows 宿主机和 WSL 之间的端口转发
已经在 WSL 中成功启动了 SSH 服务,要实现从远程机器访问这个 WSL 实例,还需要解决 WSL 2 的网络隔离问题。 WSL 2 运行在一个虚拟网络中,拥有独立的 IP 地址,外部机器无法直接访问它,WSL 2 需要在 Windows 宿主机上配置端口转发,按照以下步骤操作。
获取 WSL 的 IP 地址
hostname -I记下这个 IP 地址(一般是 172.x.x.x,是虚拟网络的 IP)。需要注意的是,WSL 2 的 IP 地址每次重启后可能会变化,如果重启机器需要重新配置端口转发。
使用如下命令 ip route show | grep -i default | awk '{ print $3}'可以获取到 WSL 的默认网关 IP 地址,这个地址通常是 Windows 宿主机在虚拟网络中的地址。
在 Windows 上配置端口转发
这一步需要在 Windows 的 PowerShell(管理员模式)中执行。
在 Windows 宿主机上,按 Win + X,选择终端管理员。

Windows终端管理员
我们需要把 Windows 的某个端口(比如 2222)转发到 WSL 的 22 端口,运行以下命令(将 <WSL_IP> 替换为上一步获取的 IP):
netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=22 connectaddress=<WSL_IP>TODO: 可以编写一个脚本开机自动获取 WSL IP 并设置端口转发,避免每次重启后手动操作。
在 Windows 防火墙中开放端口
为了让外部机器能访问 Windows 的 2222 端口,你需要添加防火墙规则。 继续在 管理员 PowerShell 中运行:
New-NetFirewallRule -DisplayName "WSL SSH" -Direction Inbound -LocalPort 2222 -Protocol TCP -Action Allow远程连接测试
现在,你可以从局域网内的其他机器连接了。
目标 IP:你 Windows 主机的局域网 IP(不是 WSL 的 IP)。
端口:2222
用户名:你的 WSL 用户名(user_name)。
命令示例:
ssh -p 2222 user_name@<Windows_LAN_IP>ssh -p 2222 user_name@<Windows_LAN_IP>创建新用户
如果你希望为远程连接创建一个单独的用户(例如 remote_user),而不是使用默认的管理员账户,可以按照以下步骤操作:
- 创建新用户:sudo adduser <username>系统会提示您输入并确认新用户的密码。其他的个人信息(如全名、房间号等)可以直接按回车跳过。
- (可选)授予 sudo 权限: 如果您希望这个新用户也能执行管理员命令(使用 sudo),请运行:sudo usermod -aG sudo <username>
- 测试连接: 创建完成后,您就可以使用新用户进行 SSH 登录了:ssh -p 2222 <username>@<Windows_LAN_IP>
限制用户访问宿主机文件系统
在 WSL 中,宿主机的文件系统通常挂载在 /mnt/c、/mnt/d 等目录下。默认情况下,所有 WSL 用户都可以访问这些目录。
当你为其他人分配账号的时候,也不想宿主机文件被一览无余吧?这和裸奔有什么区别?
要限制特定用户(例如 remote_user)访问宿主机文件系统,可以使用 **ACL (Access Control Lists)**工具。
安装 ACL 工具
大多数发行版默认已安装,如果没有,请运行:
sudo apt-get update && sudo apt-get install acl设置 ACL 规则禁止访问
假设你要限制的用户名为 remote_user,你可以运行以下命令明确禁止该用户访问 C 盘:
# 禁止 remote_user 访问 /mnt/csudo setfacl -m u:remote_user:--- /mnt/c# 如果有 D 盘或其他盘,也重复此操作# sudo setfacl -m u:remote_user:--- /mnt/d-m: 修改 ACL。
u:remote_user:---: 针对用户 remote_user,设置权限为无读、无写、无执行(---)。
验证限制
你可以切换到该用户进行测试:
# 切换到受限用户su - remote_user# 尝试访问 C 盘ls /mnt/c# 预期输出: ls: cannot access '/mnt/c': Permission denied如果以后想恢复该用户的访问权限:
sudo setfacl -x u:remote_user /mnt/c注意
WSL 默认只使用宿主机一半的内存资源,如果需要调整,可以参考WSL官方文档进行配置。

WSL配置
非局域网内远程访问的方法
推荐 tailscale,完全免费的方案。
本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。



