‹ 指南

端口转发

很多有用的东西只监听在服务器自己的回环地址上——数据库、开发服务器、故意不对外网开放的后台页面。转发把其中一个带到手机上,走的是你本来就信任的那条 SSH 连接。

撰写于

三个方向

该用哪一个,取决于「哪一端来绑定端口」,这也是唯一容易绕晕的地方。规则编辑器会随着你输入实时画出方向,保存前可以先对一眼:

direction
local     127.0.0.1:LP   ⇢  host  ⇢  DEST:DP
dynamic   127.0.0.1:LP   =  SOCKS5  ⇢  host  ⇢  *
remote    host:LP        ⇢  device ⇢  DEST:DP
规则编辑器:本地/动态/远程的分段控件,下面是一条实时的流向线,写着 127.0.0.1:8080 → host → 127.0.0.1:8000。
流向线随着你输入实时重写,所以方向在保存之前就已经确定了。
本地(Local)——手机这边绑定一个端口,连接经隧道送到服务器能访问的东西上。最常用的就是它:服务器回环上的 Postgres、跑在 :5173 的开发服务器、服务器内网里的路由器页面。
动态(Dynamic)——手机绑定一个端口并讲 SOCKS5,每个请求自己决定目的地。一条规则顶一堆,把浏览器或应用指过来就行。
远程(Remote)——服务器那边绑定端口,反向转回手机能访问的东西。用得少,也是最该想清楚的一个:你是在对端开了一个口子。
怎么建一条

长按主机 →「端口转发」,再点 + 新建规则。选方向、填端口、打开开关。规则属于这台主机、会一直留着;跑不跑是另一回事,用开关控制。

还有两个入口,对应你会想起它的另外两个时刻:设置 →「端口转发」可以在完全没开终端的情况下管理所有主机的规则;而在会话里,标题栏的 ⇄ 小标签会打开当前主机的同一份列表,带实时 ↑/↓ 字节计数,能直接看出到底有没有流量。

「随会话启动」会在你每次连上这台主机的终端时自动把规则拉起来。

这台主机的端口转发列表:一条名为 web 的规则,开关已打开,显示上行和下行字节计数,以及一个 ⋯ 按钮。
一条正在跑的规则,以及真正流过去的流量。地址和「打开」收在 ⋯ 里。
转发不是标签页

转发跑在它自己到主机的连接上,不依附于任何终端标签页。所以:关掉启动它的那个 shell,隧道照样在;开两个标签页也不会把它启动两遍;无论你开了多少会话,一条规则最多只跑一份。

值得知道的那个限制
终端会话之上的转发面板:正在运行的规则、字节计数,以及展开的 ⋯ 菜单,里面是「复制地址」和「打开」。
有转发在跑时标题栏的 ⇄ 会变绿;地址和「打开」收在这一行的 ⋯ 里。
内置浏览器打开了一个标题为 Internal service 的页面,它由服务器自己的回环地址提供,地址栏显示 127.0.0.1:8080。
「打开」用内置浏览器加载它——SSH 会话因此留在前台,也就不会断。

转发只在 Term 还在运行时存在。HarmonyOS 会挂起退到后台的应用——进程被冻结,而冻结的进程扛不起隧道。切到别的应用,转发就停了。

有一个例外,但它比听上去要窄。当你离开应用时如果还开着一个活着的 SSH 或 telnet 标签页,Term 会向系统申请一小段宽限时间——大约 70 秒——好让你出去一下不至于把会话弄丢,顺带着的转发也能撑过这段时间。这种宽限一天只有有限的几次,电量低时还会更短。

一个终端标签页都没开的转发,根本不在这份宽限的范围内:只有存在活着的非 mosh 标签页时,这个申请才会发出。只开着 mosh 标签页也不算——mosh 本来就会自己重连,不需要它。所以,如果你希望隧道能熬过「去别的应用瞄一眼」,就顺手留一个连着同一台主机的 SSH 标签页。

回到应用时,Term 会核对一遍自己的转发,把已经断掉的关掉,而不是给一条早就没了的隧道亮着绿灯。把规则的开关再打开一次,它就会重连。

凡是你真需要它一直在的场景——一个长时间的传输、一个你正在用来上网的代理——就让 Term 留在屏幕上。悬浮窗和分屏都算「在屏幕上」,这也是一边用别的应用、一边让隧道活着的实际办法: 悬浮窗 →

几点补充

本地和动态转发在手机上绑定的是 127.0.0.1,所以同网络里的其他设备访问不到,只有本机上的应用能用。

删除主机会连同它的规则一起删掉。

转发起不来时,错误里会写清是哪个端口、为什么:常见的两种是手机上这个端口已被占用,或者服务器不允许远程绑定(`GatewayPorts`)。