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

浙公网安备 33010602011771号