PassNAT LogoPassNAT

浏览器里就是命令行:飞牛 NAS 用 Docker 自建 WebSSH + 内网穿透远程敲命令

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

WebSSH 是一个跑在浏览器里的 SSH 客户端。打开网页,填上要连的机器地址、用户名和密码,点一下连接,页面直接变成一个终端 —— 键盘敲什么,那台机器就收到什么。本地不用装 PuTTY、Xshell 这类工具,手机浏览器一样能用。

它小得有点夸张:一个容器,镜像不到三十兆,跑起来常驻内存二十多兆,编排只有六行 —— 没有数据库、没有配置文件、连数据卷都不用挂。因为它什么都不存:你填的地址和口令只在这一次会话里用,关掉网页就没了。

它是 MIT 协议的开源项目,用 Python 的 tornado + paramiko + xterm.js 写的,支持口令登录、公私钥登录、加密私钥,还支持两步验证的一次性口令。

一个提醒放在前面:WebSSH 自己没有登录口令,页面打开就是那张表单。所以下面这套做法是 —— 要用的时候在穿透插件里把隧道打开,用完顺手把隧道关掉,平时它就只待在家里的内网里。

关于镜像

上游仓库里那份 docker-compose.yml 写的是 build:,也就是让你自己在本机构建镜像;作者没有往 Docker Hub 发过预构建的镜像。而飞牛的 Docker 只能贴编排、不能现场构建源码,所以这里用的是社区按上游那份 Dockerfile 原样构建出来的一份:

austozi/webssh —— 它的镜像说明里写明了「built using the upstream Dockerfile」,版本号跟上游最新的发行版对得上,amd64 和 arm64 两个架构都有。编排里不写死版本号,直接写仓库名就行,这样以后有新的也能跟上。

部署安装

这东西真正好用的场景是人不在家的时候:服务器上有点事要处理,手边只有手机,打开浏览器就能连回去。装在内网,出了门就够不着,那它一大半用处就没了。想省事可以用 帕斯内网穿透,在飞牛的应用中心里就能搜到插件,装好之后在插件里直接建一条隧道,把 NAS 上的 3382 端口开放到公网,拿到一个公网地址,之后连机器就都用这个地址。

第一步:新建 Compose 项目

打开飞牛的 Docker 应用,切到上面的 Compose 标签,点「新增项目」。项目名称填 webssh;路径这一栏点开,挑一个空文件夹选中,点确认 —— 这个目录是用来放它的编排文件的。

来源选「创建 docker-compose.yml」,把下面这段整段贴进去:

1services:
2 webssh:
3 image: austozi/webssh
4 container_name: webssh
5 ports:
6 - "3382:8888"

要认的就两处。一处是镜像那一行,用的就是上面说的那份社区构建;另一处是端口那一行,冒号右边的 8888 是容器里 WebSSH 自己监听的端口,左边的 3382 是 NAS 对外开出来的端口 —— 等下建隧道要填的就是左边这个。想换成别的端口,只改左边,右边别动。

最后勾上「创建项目后立即启动」,点创建。镜像不到三十兆,拉完就跑起来了。

第二步:建一条隧道,把它开放到公网

打开飞牛里的 PassNAT 插件,点「创建隧道」。名字随便起一个;接入节点留默认的自动分配;传输协议选 TCP;本地IP 那一格什么都不用填 —— 留空默认就是 127.0.0.1,插件本来就跑在这台 NAS 上;本地端口填 3382,也就是上面编排里冒号左边那个。

建完之后点开这条隧道的详情,把标题行最左边的电源键按一下,等状态转成「运行中」。面板上那一行就是分配给你的公网地址,形式是「节点地址:端口」,之后不管在哪儿,浏览器里输这个地址就能打开。

第三步:从公网地址连机器

用刚拿到的公网地址打开,页面上只有一张表单:Hostname 填要连的那台机器的地址,Port 填 22,Username 和 Password 填那台机器上的账号口令,点 Connect。一两秒之后页面就变成终端了,跟平时开终端敲命令一模一样。

如果你用的是密钥登录,把私钥文件从 Private Key 那一格传上去就行,有密码短语的话再填 Passphrase;开了两步验证的机器,最下面那一格填当前的一次性口令。

平时怎么用

WebSSH 没有自己的登录口令,所以别让那个公网地址一直开着。建议的用法是:要连机器的时候,先在 PassNAT 插件里把这条隧道的电源打开,连完事情办完,回到插件里把电源按一下关掉 —— 隧道和公网地址都还留着,下次再打开就是同一个地址,但没打开的时候,外面是访问不到的。插件里那个「开机自启」也建议别勾。

要连的机器如果不止 NAS 一台,Hostname 换成内网里别的机器地址就行 —— WebSSH 跑在 NAS 上,NAS 能连到的机器它都能连。