找回密码
 立即注册
首页 业界区 业界 使用Alpine配置WSL ssh门户

使用Alpine配置WSL ssh门户

瞧厨 昨天 19:20
WSL是一种在Windows设备上运行Linux子系统的方法。一台Windows设备可以运行多个WSL实例,在网络配置得当的情况下,可以通过直接访问宿主机的端口访问WSL中的网络服务,例如ssh。
然而,不同的WSL实例无法同时监听同一个端口。当一台设备运行多个WSL实例时,ssh端口的管理可能会变得十分麻烦。
那么有没有办法统一配置不同WSL实例的ssh登录入口呢?答案是有的,我们可以用一个ssh门户实例来统一处理ssh登录请求,并将它们“转发”到不同的ssh实例中,实现类似堡垒机的功能。
配置Alpine

为了配置一个尽可能小的门户实例,我们可以使用Alpine Linux,其Mini root filesystem分发版的功能十分精简,总体积不到10MB,却足以满足我们的需求。
首先从Alpine下载页下载Mini root filesystem的镜像
然后导入到WSL中
  1. wsl --import Alpine D:\Alpine alpine-minirootfs-latest-x86_64.tar.gz
复制代码
之后安装和配置openssh服务端
  1. wsl -d Alpine
  2. apk update
  3. apk add openssh-server
  4. ssh-keygen -A
复制代码
在/etc/wsl.conf设置运行时自动启动sshd
  1. [boot]
  2. command="/usr/sbin/sshd"
复制代码
配置ssh跳转

为了实现“门户”功能,我们将在Alpine中统一开启ssh端口监听,然后根据登录的用户名将ssh请求“转发”到不同的实例中。
OpenSSH配置中的ForceCommand功能可以帮助我们完成这个任务。配置该选项后,ssh登录完成后会强制指定的命令或脚本。我们可以将转发逻辑配置到脚本中,并指定为登录的ForceCommand。
在/usr/local/bin/triage.sh创建跳转脚本:
  1. #!/bin/sh
  2. [[ "$SSH_ORIGINAL_COMMAND" == "internal-sftp" ]] && SSH_ORIGINAL_COMMAND=/usr/lib/sftp-server
  3. exec /mnt/c/Windows/System32/wsl.exe -d "$USER" --cd "~" $SSH_ORIGINAL_COMMAND
复制代码
脚本中的$USER和$SSH_ORIGINAL_COMMAND分别是传入的登录用户名和命令。
在这个跳转脚本中,我们将传入的用户名映射为WSL实例名,并以默认用户登录。例如,通过ssh Debian@hostname登录将跳转到本机的Debian WSL实例。
为了适配sftp客户端,我们将internal-sftp命令配置为WSL实例的/usr/lib/sftp-server。
也可以配置更加复杂的脚本逻辑来跳转到实例中的指定用户。
配置登录用户名

上面的脚本实现了跳转的逻辑,要让门户实例可以登录并实施跳转,我们还需要进行用户和ssh服务端配置。
为了让指定用户名可以用于登录,我们需要在门户实例中创建用户。由于在门户中用户只有登录这一个功能,我们可以不为这些用户配置home文件夹,也无需为其创建同名组。
  1. addgroup homeless
  2. adduser -H -G homeless -h /var/empty Debian
复制代码
或者可以直接编辑/etc/group和/etc/passwd,即在/etc/group中添加一行
  1. homeless:x:1000:
复制代码
并在/etc/passwd中添加
  1. Debian:x:1001:1000::/var/empty:/bin/sh
复制代码
然后在/etc/ssh/sshd_config末尾添加
  1. Match Group homeless
  2.         ForceCommand /usr/local/bin/triage.sh
复制代码
之后通过passwd Debian给用户设置登录密码,即可通过ssh Debian@hostname从门户登录并跳转到对应实例。
如果要配置密钥登录,可以设置
  1. Match Group homeless
  2.         AuthorizedKeysFile /etc/ssh/authorized-keys/%u.pub
  3.         ForceCommand /usr/local/bin/triage.sh
复制代码
然后通过ssh-keygen -f /etc/ssh/authorized-keys/Debian在/etc/ssh/authorized-keys/下生成密钥对(Debian和Debian.pub)。将私钥文件Debian复制到其他设备,即可通过ssh Debian@hostname -i Debian登录。
常见问题

如果可以从本地登录但无法从局域网其他设备访问,可以检查

  • .wslconfig中是否开启了networkingMode=mirrored
  • ssh端口是否被其他程序,包括Windows和其他WSL实例中的程序占用
  • 在Windows防火墙(wf.msc)的入站规则中是否开放了对应的TCP端口

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册