Termius 端口转发常见陷阱与调试 | 规则启用了但连不上怎么排查
排查顺序:从外到内
端口转发失败时,按这个顺序查,能最快定位问题:
- Termius 侧:规则启用了吗?本地端口被占了吗?
- SSH 服务器侧:客户端连到服务器了吗?服务器能到目标地址吗?
- 目标服务侧:目标端口在监听吗?允许来自服务器的连接吗?
第一层:Termius 客户端
主机连接状态
转发建立在 SSH 会话之上。先确认:
- 目标主机(跳板机)已连接成功
- SSH 终端能正常打开、跑命令
- 如果 Jump Host 链路里的任何一层断了,转发都不生效
规则启用状态
在 Port Forwarding 页面,每条规则有一个开关:
- 开关高亮 = 规则已启用
- 开关灰色 = 规则未启用,或者主机没连上
如果规则自动关了,可能是:
- 本地端口被其他进程占用了(Termius 启动转发时绑定端口失败 → 自动关)
- 主机连接断了
本地端口占用
Windows 查端口占用:
netstat -ano | findstr :3307
# 看最后一列的 PID,然后:
tasklist | findstr <PID>
macOS / Linux:
lsof -i :3307
# 或
ss -tlnp | grep 3307
如果本地 3307 已经被别的 MySQL 客户端占了,换一个端口(比如 3308),Termius 规则里同步改。
本地防火墙
Windows Defender 或 macOS 防火墙可能拦截 Termius 绑定本地端口。临时关了试试,如果能用就是防火墙的问题,给 Termius 加白名单。
第二层:SSH 服务器
服务器能到目标吗
这是最常见的坑。Termius 只负责建 SSH 隧道,服务器能不能连到目标是服务器自己的事。
在服务器的 SSH 终端里测试:
# 测试服务器能不能连到目标主机的目标端口
nc -zv 10.0.1.50 3306
# 或
telnet 10.0.1.50 3306
nc / telnet 超时 = 服务器到目标不通,排查方向:
- 目标主机是否在线
- 服务器和目标之间的防火墙
- 目标主机的防火墙是否放行服务器的 IP
SSH 服务器的 GatewayPorts(远程转发)
远程转发(-R)需要服务器端配置允许外部连接:
# 检查
grep GatewayPorts /etc/ssh/sshd_config
如果没有或设为 no,改成:
GatewayPorts yes
然后 systemctl restart sshd。
设完之后,外部用户才能通过服务器端口(比如 8080)访问到你本地的服务。
多网卡服务器
如果 SSH 服务器有多张网卡(公网 + 内网),转发规则里的目标地址要看清楚:
- 目标是内网服务 → 填内网 IP(公网 IP 访问不到)
- 目标是公网服务 → 填公网 IP 或域名
服务器端的 AllowTcpForwarding
极少数安全严苛的服务器会禁掉 SSH 转发:
# 检查
grep AllowTcpForwarding /etc/ssh/sshd_config
如果是 no 或 local 以外的限制值,需要管理员改。默认是 yes。
第三层:目标服务
端口是否监听
在服务器上确认目标服务端口是活的:
ss -tlnp | grep 3306
# MySQL 应该在监听
服务是否绑定了所有地址
很多数据库默认只绑定 127.0.0.1(只允许本机访问):
# 检查 MySQL 配置
grep bind-address /etc/mysql/mysql.conf.d/mysqld.cnf
# 应该是 0.0.0.0 或服务器内网 IP,不能是 127.0.0.1
如果绑定了 127.0.0.1,需要改成 0.0.0.0 并重启 MySQL。
服务的 ACL / 用户权限
比如 MySQL 的用户配置:
SELECT user, host FROM mysql.user;
如果你的 MySQL 用户只允许从 localhost 连接(root@localhost),通过转发过来的连接会被拒绝——因为对 MySQL 来说,连接是从服务器的某个 IP 进来的,不是 localhost。需要加一条允许从服务器 IP 或 % 连接的用户。
Debug Log
Termius 有转发的调试日志。如果上面都查过了还是不行,可以打开转发的 verbose log:
- 设置 → Port Forwarding → 开启 debug logging
- 启用规则后看 Termius 的日志输出
- 日志会告诉你规则建立在哪一步失败了(是本地绑定失败、SSH 隧道建立失败、还是远端连接失败)
快速诊断清单
| 检查项 | 怎么查 | 预期结果 | |
|---|---|---|---|
| 主机连接正常? | SSH 终端能跑 echo | ✅ 正常 | |
| 规则已启用? | Port Forwarding 页开关高亮 | ✅ 高亮 | |
| 本地端口空闲? | netstat -ano / lsof | ✅ 空闲 | |
| 服务器能到目标? | 在服务器上 nc -zv 目标IP 目标端口 | ✅ connected | |
| 目标服务在监听? | `ss -tlnp | grep 目标端口` | ✅ LISTEN |
| 目标允许服务器的连接? | 临时关防火墙 / 改 bind 地址 | ✅ 通 |
转发正常但速度慢
如果能连上但很慢:
- 检查服务器带宽(可能是出口带宽瓶颈)
- 检查 Termius 所在电脑的 CPU(加密隧道有一定开销)
- 本地转发 / 远程转发的开销比直接 SSH 略高,但不应该到明显感知的程度
- 动态 SOCKS 因为每个 HTTP 请求都要建隧道连接,可能稍慢(这是 SOCKS 本身的特性)