本地、远程、动态转发总记混?用数据流方向选对 SSH 隧道

你在笔记本上访问内网数据库,命令里该写 -L;外部测试环境要临时回调本机服务,轮到 -R;想让浏览器或命令行工具经跳板机访问多个目标,才是 -D。三个参数只差一个字母,流量方向却完全不同。

死记命令很容易在现场写反。选 SSH 端口转发时只问两件事:谁发起第一次连接,目标地址是不是固定的。答案一出来,本地转发、远程转发和动态转发就不难区分。

先画箭头,再选 L、R、D

需求第一次连接从哪里发起目标是否固定选择本地监听点
笔记本访问服务器侧数据库你的电脑固定本地转发 -L你的电脑
服务器侧访问你电脑上的临时服务远端服务器固定远程转发 -R远端服务器
多个应用经跳板机访问不同站点你的电脑不固定动态转发 -D你的电脑上的 SOCKS5

这里的“本地”和“远程”说的是监听端口开在哪一侧,不是目标服务归谁管理。把箭头画成“发起方 → 监听端口 → SSH 连接 → 目标”,通常比背语法可靠。

无论选哪一种,都只应在已授权的主机与网络中使用。SSH 隧道改变的是访问路径,不会绕开目标服务本身的账号、权限、TLS 或审计要求。

picture.image

本地转发:从电脑伸进服务器内网

场景是最常见的:数据库只允许跳板机所在内网访问,你希望本机数据库客户端连上它。数据流是:

本机客户端 -> 127.0.0.1:15432 -> SSH 跳板机 -> db.internal:5432

对应命令:

ssh -N \
  -o ExitOnForwardFailure=yes \
  -L 127.0.0.1:15432:db.internal:5432 \
  ops@jump.example.com

127.0.0.1:15432 是本机监听点,db.internal:5432 由跳板机一侧解析并连接。数据库客户端此时填 127.0.0.1:15432-N 表示不启动远端 shell,ExitOnForwardFailure=yes 会在监听创建失败时直接报错,避免窗口看似连着、隧道其实没起来。

监听地址最好明确写 127.0.0.1。若写成 0.0.0.0,同一网络中的其他设备可能也能访问这个入口,暴露面会扩大。隧道建立成功也不代表数据库连接必然成功,数据库白名单、账号权限与 TLS 仍需单独核对。

picture.image

在 Xterminal 中,这类规则可以按 SSH 会话保存本地监听和远端目标,启动后从列表查看状态。它适合减少重复输入,但地址方向仍要由人确认;保存错误规则只会稳定地重复错误。

停止命令可按 Ctrl+C 结束当前 SSH 进程。随后用 lsof -nP -iTCP:15432 -sTCP:LISTEN 检查本机端口是否释放。若临时改过数据库白名单,也要按原变更记录恢复。

远程转发:让服务器回到你电脑上的服务

另一个典型场景是调试 webhook:代码跑在你的笔记本,测试服务器需要访问它。箭头变成:

远端调用方 -> 远端 127.0.0.1:18080 -> SSH 连接 -> 本机 127.0.0.1:3000

命令如下:

ssh -N \
  -o ExitOnForwardFailure=yes \
  -R 127.0.0.1:18080:127.0.0.1:3000 \
  ops@test-server.example.com

远端机器上的调用方访问 127.0.0.1:18080,请求经 SSH 回到本机 3000 端口。两处 127.0.0.1 分属隧道两端,读命令时要沿箭头逐段解释,别把它们当成同一个地址。

picture.image

远程转发最危险的误区,是为了让第三方访问而把远端监听直接开放到公网。OpenSSH 服务端通常还会受到 GatewayPortsAllowTcpForwarding、防火墙和安全组限制。确有外部联调需求时,先评估带身份认证和 TLS 的反向代理或专用隧道服务;若仍要改 sshd_config,应走变更审批,限制来源地址,测试配置后再平滑重载,并预留原 SSH 会话作为回滚通道。

没有修改权限时,不要用其他入口绕过服务端策略。管理员拒绝远程转发,往往正是访问控制的一部分。停止调试后终止隧道,确认远端 18080 已释放,并回滚临时防火墙与 SSH 配置。

动态转发:目标不固定时提供 SOCKS5 入口

动态转发没有预先写死目标。它在本机开一个 SOCKS5 代理,支持代理的应用把目标主机名和端口交给 SSH 客户端处理:

ssh -N \
  -o ExitOnForwardFailure=yes \
  -D 127.0.0.1:1080 \
  ops@jump.example.com

测试时可以让 DNS 解析也走远端:

curl --proxy socks5h://127.0.0.1:1080 https://example.com/

socks5h 中的 h 表示主机名交给代理端解析。若应用使用普通 socks5 并在本地先解析域名,内网域名可能解析失败,也可能产生不必要的 DNS 泄露。

picture.image

动态转发不是“全局网络自动走隧道”。只有明确配置了 SOCKS5 的应用才会使用它,部分程序也可能忽略系统代理。它同样不提供内容过滤、恶意站点防护或业务鉴权。监听仍应绑定本机回环地址,结束后清理应用代理设置,避免下一次启动时出现“网络突然不可用”。

隧道不通,按三段链路查

遇到连接失败时,不要立刻换参数。沿链路检查,通常很快能定位在哪一段断开。

本地监听是否存在:

lsof -nP -iTCP:15432 -sTCP:LISTEN
# Linux 也可以使用
ss -lntp | rg ':15432'

SSH 是否接受转发:临时加 -vvv 查看握手和 forwarding 日志,留意 administratively prohibited、监听冲突和主机名解析错误。详细日志可能包含主机名、用户名和网络结构,对外分享前需要脱敏。

目标服务是否能从正确一侧访问:本地转发的目标应从 SSH 服务器侧验证;远程转发的目标应从本机验证。能 ping 通不等于目标 TCP 端口开放,也不等于应用层鉴权通过。

Xterminal 的端口转发列表可把三种规则、监听地址、目标与运行状态放在一起,并支持规则启停、自动重连和连接复用。自动重连只负责恢复 SSH 通道;目标服务已挂、凭据过期或网络策略变化时,它不会把故障变成成功。生产环境仍应配合服务监控和访问审计。

用一句话做现场选择

从电脑访问远端固定服务,选 -L;让远端访问本地固定服务,选 -R;本地应用要经跳板机访问多个动态目标,选 -D。落笔前再补上监听地址,测试后再写停止与回滚动作。

不妨拿下一条真实需求画四个节点:发起方、监听点、SSH 服务器、目标。箭头能顺着读通,再执行命令。这个小动作比收藏更多命令速查表更能减少端口开错方向。

0
0
0
0
评论
未登录
暂无评论