SSH 本地端口转发常用命令

你的网络关系是:

 
你的电脑
   │ SSH
   ▼
服务器 A
   │ 可以访问
   ▼
服务器 B:9109
 

假设:

 
A SSH地址:192.168.30.124
B 地址:172.30.100.21
B Web端口:9109
 

在你本地电脑执行:

 
ssh -L 9109:172.30.100.21:9109 root@192.168.30.124
 

保持这个 SSH 窗口不要关闭。

然后你本地浏览器直接访问:

 
http://127.0.0.1:9109
 

实际访问链路就是:

 
本地浏览器
127.0.0.1:9109
      │
      │ SSH隧道
      ▼
服务器A
      │
      │ A访问B
      ▼
172.30.100.21:9109
服务器B Web服务
 

注意这里有一个关键条件:A 必须能够访问 B 的 9109 端口。你可以先在 A 上验证:

 
curl http://172.30.100.21:9109
 

或者:

 
nc -vz 172.30.100.21 9109
 

如果 A 能访问,那么 SSH 转发通常就可以直接用。

如果你只想建隧道、不需要登录 A 的 Shell,可以用:

 
ssh -N -L 9109:172.30.100.21:9109 root@192.168.30.124
 

其中:

 
-N    不打开A的Shell,只建立SSH隧道
-L    本地端口转发
 

如果你本地 9109 已经被占用,也可以换成本地其他端口,例如:

 
ssh -N -L 19109:172.30.100.21:9109 root@192.168.30.124
 

浏览器访问:

 
http://127.0.0.1:19109
 

这不会改变 B 的端口,含义只是:

 
本地 19109 → A SSH隧道 → B 9109
 

所以针对你这个需求,我推荐直接用:

 
ssh -N -L 19109:B的IP:9109 root@A的IP
 

然后浏览器打开 http://127.0.0.1:19109

 
 
把上面说的ssh端口转发等命令,列出来并简要说明。为了总结记录,为后续使用
 

可以,整理成一份后续可以直接查的 SSH 跳板/端口转发速查。

SSH 跳板机与端口转发常用命令

网络场景:

 
本地电脑
   │
   │ SSH 可访问
   ▼
服务器 A(跳板机)
   │
   │ A 可以访问 B
   ▼
服务器 B
 

本地无法直接访问 B,但可以 SSH 到 A,并且 A 可以访问 B。

1. 登录 A 后再登录 B

 
ssh root@A_IP
 

进入 A 后:

 
ssh root@B_IP
 

链路:

 
本地 → A → B
 

适合临时操作,最简单。


2. 通过 A 直接 SSH 登录 B

在本地执行:

 
ssh -J root@A_IP root@B_IP
 

例如:

 
ssh -J root@192.168.30.124 root@172.30.100.21
 

-J 表示使用 A 作为 Jump Host(跳板机)。

链路:

 
本地 ──SSH──> A ──SSH──> B
 

最终终端直接登录在 B 上。


3. 本地访问 B 的 Web 服务

例如 B 上有:

 
B_IP:9109
 

本地无法直接访问,但 A 可以访问。

本地执行:

 
ssh -L 9109:B_IP:9109 root@A_IP
 

例如:

 
ssh -L 9109:172.30.100.21:9109 root@192.168.30.124
 

然后本地浏览器访问:

 
http://127.0.0.1:9109
 

实际链路:

 
浏览器
127.0.0.1:9109
      │
      │ SSH隧道
      ▼
      A
      │
      ▼
B_IP:9109
 

4. 只建立端口转发,不进入 A

推荐日常使用:

 
ssh -N -L 9109:B_IP:9109 root@A_IP
 

例如:

 
ssh -N -L 9109:172.30.100.21:9109 root@192.168.30.124
 

其中:

 
-N    不打开远程 Shell,只建立 SSH 隧道
-L    本地端口转发(Local Forward)
 

浏览器仍然访问:

 
http://127.0.0.1:9109
 

5. 本地端口被占用时

本地端口和 B 的实际端口不要求相同

例如把本地 19109 转发到 B 的 9109

 
ssh -N -L 19109:B_IP:9109 root@A_IP
 

例如:

 
ssh -N -L 19109:172.30.100.21:9109 root@192.168.30.124
 

浏览器:

 
http://127.0.0.1:19109
 

对应关系:

 
本地 19109
    ↓ SSH
A
    ↓
B 9109
 

6. 转发 B 上其他 TCP 服务

格式完全一样:

 
ssh -N -L 本地端口:B_IP:B端口 root@A_IP
 

例如 B 有:

 
Web     9109
HTTPS   443
MySQL   3306
SSH     22
 

可以分别:

 
ssh -N -L 19109:B_IP:9109 root@A_IP

ssh -N -L 10443:B_IP:443 root@A_IP

ssh -N -L 13306:B_IP:3306 root@A_IP

ssh -N -L 10022:B_IP:22 root@A_IP
 

之后本地分别使用:

 
http://127.0.0.1:19109
https://127.0.0.1:10443

MySQL:
127.0.0.1:13306

SSH:
127.0.0.1:10022
 

例如通过转发端口 SSH B:

 
ssh -p 10022 root@127.0.0.1
 

7. 建立多个端口转发

一个 SSH 连接可以同时转发多个端口:

 
ssh -N \
  -L 19109:B_IP:9109 \
  -L 10443:B_IP:443 \
  -L 10022:B_IP:22 \
  root@A_IP
 

这样只需要维持一个 SSH 连接。


8. 建立转发前,先确认 A 能访问 B

在 A 上:

 
ping B_IP
 

检查 TCP 端口:

 
nc -vz B_IP 9109
 

Web 服务也可以:

 
curl http://B_IP:9109
 

因为 SSH -L 的本质是:

 
本地
 │
 │ SSH
 ▼
 A
 │
 │ 由A建立TCP连接
 ▼
 B:9109
 

所以 A → B:9109 必须可达


最常用的 3 条记住即可

通过 A 登录 B:

 
ssh -J root@A_IP root@B_IP
 

通过 A 访问 B 的服务:

 
ssh -N -L 本地端口:B_IP:B端口 root@A_IP
 

例如:

 
ssh -N -L 19109:172.30.100.21:9109 root@192.168.30.124
 

然后:

 
http://127.0.0.1:19109
 

一个隧道转发多个服务:

 
ssh -N \
  -L 19109:B_IP:9109 \
  -L 10443:B_IP:443 \
  -L 10022:B_IP:22 \
  root@A_IP
 

核心记忆就是:

 
-J = 借 A 登录 B
-L = 借 A 访问 B 的 TCP 服务
-N = 只建隧道,不进入 A 的 Shell
 
 
 
 
 
posted @ 2026-08-10 13:25  你说夕阳很美  阅读(24)  评论(0)    收藏  举报