返回文章列表
服务器

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

青山
2025-12-11
8小时前
如何用 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 start
ssh-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),而不是使用默认的管理员账户,可以按照以下步骤操作:

  1. 创建新用户:sudo adduser <username>系统会提示您输入并确认新用户的密码。其他的个人信息(如全名、房间号等)可以直接按回车跳过。
  2. (可选)授予 sudo 权限: 如果您希望这个新用户也能执行管理员命令(使用 sudo),请运行:sudo usermod -aG sudo <username>
  3. 测试连接: 创建完成后,您就可以使用新用户进行 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,完全免费的方案。


本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

分享文章
合作伙伴

本站所有广告均是第三方投放,详情请查询本站用户协议