PassNAT LogoPassNAT

浏览器里直接 SSH 到 NAS:飞牛 Docker 自建 Next Terminal + 内网穿透远程运维

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

Next Terminal 是一个跑在浏览器里的远程连接工具。SSH、RDP、VNC、Telnet 这几种连接方式它都收进了一个网页里 —— 把要连的机器登记进去,之后想连哪台就点哪台,网页里直接开出一个终端,本地不用再装任何客户端。

它还带着一整套团队用的东西:谁能连哪台机器的授权策略、命令审计、会话录像、工单审批。一个人用的话这些可以先不管,主线很简单:加一台机器 → 点接入 → 网页里就是终端。

装在自己的 NAS 上,免费用,功能不锁。下面这套编排跑起来是三个容器:主程序、一个 PostgreSQL 数据库,外加一个 guacd(远程桌面协议的转换服务,连 RDP/VNC 才用得上,但它是编排的一部分,一起起着)。

部署安装

这东西的价值就在于人不在家的时候也能连上去看一眼。装在内网,出了门就够不着,那它一大半用处就没了。想省事可以用 帕斯内网穿透,在飞牛的应用中心里就能装到插件,装好之后在插件里直接建一条隧道、把 NAS 上的 8088 端口开放到公网,拿到一个公网地址,之后建管理员、加机器、连终端全都在这个地址上做。

第一步:先把 config.yaml 建出来

这一步顺序不能反,先建文件再启动。编排里挂的是一个文件(./config.yaml:/etc/next-terminal/config.yaml),而 Docker 有个脾气:绑定挂载的路径要是不存在,它会自作主张建一个同名的目录。真让它建成目录了,主程序读不到配置就起不来,而且用 compose down 也删不掉那个目录,还得手动去删。所以在放编排的那个目录里,先建一个 config.yaml,内容如下:

1Database:
2 Type: postgres
3 Postgres:
4 Hostname: postgresql
5 Port: 5432
6 Username: next-terminal
7 Password: next-terminal
8 Database: next-terminal
9
10Server:
11 Addr: "0.0.0.0:8088"
12
13App:
14 Guacd:
15 Hosts:
16 - Hostname: guacd
17 Port: 4822
18 Weight: 1

上游给的那份有四十来行,这里只留了三段:数据库怎么连、自己监听哪个端口、guacd 在哪。其余的都是可选项,不写就走默认值,实测这样够用。数据库的主机名写 postgresql、guacd 写 guacd,是因为它们在同一套编排里,容器之间直接用服务名互相找得到,不用填 IP。

第二步:编排文件

同一个目录里再放这份编排。它跟上游给的那份是一致的,照抄就行:

1services:
2 guacd:
3 container_name: guacd
4 image: dushixiang/guacd:latest
5 volumes:
6 - ./data:/usr/local/next-terminal/data
7 restart: always
8 postgresql:
9 container_name: postgresql
10 image: postgres:18
11 environment:
12 POSTGRES_DB: next-terminal
13 POSTGRES_USER: next-terminal
14 POSTGRES_PASSWORD: next-terminal
15 volumes:
16 - ./data/postgresql:/var/lib/postgresql
17 restart: always
18 next-terminal:
19 container_name: next-terminal
20 image: dushixiang/next-terminal:latest-pg18
21 ports:
22 - "8088:8088"
23 volumes:
24 - /etc/localtime:/etc/localtime:ro
25 - ./data:/usr/local/next-terminal/data
26 - ./logs:/usr/local/next-terminal/logs
27 - ./config.yaml:/etc/next-terminal/config.yaml
28 depends_on:
29 - postgresql
30 - guacd
31 restart: always

要认的地方就两处。一是端口 8088:8088,左边那个是 NAS 上开出来的口,等下建隧道要填的就是它。二是几行挂载:data 放数据、logs 放日志、config.yaml 就是上一步建的那个文件。数据库那三个 POSTGRES_ 变量是容器之间自己用的,跟上面 config.yaml 里那三行对上就行,想改的话两个文件一起改。

第三步:起容器,然后在公网地址上建管理员

在飞牛的 Docker 里新建一个 Compose 项目,路径选到刚才那个目录,把编排贴进去启动。三个容器都跑起来之后,先去 PassNAT 插件里把隧道建好、按下电源拿到公网地址,然后直接用公网地址打开,页面会停在一个初始化用户的界面上,设一个管理员账号和密码就行 —— 没有验证码、也没有时间限制,不用赶。

第一次打开是无人认领的状态,谁先访问谁就是管理员。所以隧道一开,就顺手把管理员建掉,别晾在那儿。

第四步:加一台机器,然后连上去

进去之后走 资源管理 → 资产 → 新建。要填的东西很少:

名称随便起一个自己认得出来的;协议那一排默认就选中了 SSH,不用动;网络地址填这台机器的内网 IP,右边的端口默认已经是 22;账户类型留默认的「密码」,下面把用户名和密码填上。保存之后列表里那一行的状态会变成「活跃」,说明它已经能连上这台机器了。

然后点那一行右边的「接入」,浏览器里就开出一个终端,命令敲下去跟本地终端没有区别。人在外面用手机或者别人的电脑,打开那个公网地址登录进来,一样能连。

几句提醒

管理员密码设一个复杂点的,别用弱口令 —— 这个页面开在公网上,进去之后就能连到你登记进去的所有机器。系统设置里还能开两步验证,建议顺手打开。

登记进去的机器账号密码是存在它自己的数据库里的,也就是编排里那个 data 目录。哪天不想用了,把容器停掉、把这个目录删掉,里面存的东西就一起没了。