‹ 指南

連接埠轉送

很多有用的東西只監聽在伺服器自己的回送位址上——資料庫、開發伺服器、刻意不對外網開放的後台頁面。轉送把其中一個帶到手機上,走的是你本來就信任的那條 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`)。