ssh-forward 端口转发
SSH Port Forwarding
SSH 端口转发(SSH Port Forwarding),也叫 SSH 隧道(SSH Tunnel),是利用 SSH 协议建立的安全通道,将网络流量从一个端口“转发”到另一个端口或主机上。
主要用途:
- 加密原本明文的协议(如 Telnet、FTP、数据库连接)
- 绕过防火墙限制(如访问公司内网服务)
- 安全地暴露内网服务到外部(如微信本地调试)
- 作为 SOCKS 代理使用
本地端口转发(Local Forwarding)
即把本地端口通过 SSH 隧道转发到目标端口,命令为:
-L [本地地址:]本地端口:目标主机:目标端口
数据流向:
你的应用 → 本地端口 → SSH客户端加密 → SSH服务器解密 → 目标主机:目标端口
场景:比如远程服务器 sxy91.com 上安装了 mysql,但仅绑定了 localhost,只允许本机访问。若想调试,自己笔记本电脑无法连接到数据库,不方便调试。可使用如下命令解决:
示例:
# macbook 执行
ssh -L 3306:localhost:3306 root@ssh服务器
此时在笔记本电脑上打开 Navicat\DBeaver\DataGrip 等工具,host 写 127.0.0.1 其余照常填写即可连接到 ssh 服务器的 mysql 数据库。
静默转发
默认情况下 SSH 在建立隧道后会启动一个登录 shell(交互式会话)。如果只想让隧道在后台静默运行,不显示远程的终端也不需要执行任何远程命令,可以加上 -N 参数。
ssh -N -L 3306:localhost:3306 root@ssh服务器
-N:告诉 SSH 不要执行远程命令(即不分配 shell、不启动任何程序)。此时 SSH 仅用于端口转发,连接建立后不会出现登录提示或命令行。键入 ctrl+c 即可终止转发
后台转发
也可以在后面加 -f 让 SSH 在后台运行:
ssh -f -N -L 3306:localhost:3306 root@ssh服务器
这样隧道会在后台静默维持,不会占用当前终端。如需终止转发,可以使用命令pkill -f "ssh -f -N -L 3306:localhost:3306"
配置文件转发(./ssh/cnofig)
如果转发的规则比较复杂,或者需要转发多个端口,每次敲击命令都比较麻烦,可以通过 ssh 的配置文件 ./ssh/cnofig 配制好转发规则,下次直接 ssh test 即可。
Host test
HostName 47.92.33.201
User root
Port 4422
LocalForward 15432 127.0.0.1:15432
LocalForward 16379 127.0.0.1:6379
LocalForward 6379 sxy.redisrds.aliyuncs.com:6379
IdentityFile ~/.ssh/id_rsa
远程端口转发(Remote Forwarding)
-R [远程地址:]远程端口:本地主机:本地端口
场景:你想让别人(或自己从外部)访问你本地的一个服务,但你没有公网 IP,而 SSH 服务器有公网 IP。
数据流向:
外部用户 → SSH服务器:远程端口 → SSH服务器加密 → 你的SSH客户端解密 → 本地主机:本地端口
示例:
ssh -R 2222:localhost:22 user@公网服务器
别人在公网服务器上执行 ssh -p 2222 localhost 就能 SSH 到你的内网机器。
3. 动态端口转发(Dynamic Forwarding, SOCKS)
-D [本地地址:]本地端口
场景:你想要一个加密的通用代理,浏览器或应用配置 SOCKS5 代理后,可以访问 SSH 服务器能访问的任何地址。
数据流向:
应用(配置SOCKS) → 本地端口 → SSH客户端加密 → SSH服务器解密 → 目标地址:目标端口(由应用指定)
示例:
ssh -D 1080 user@ssh服务器
浏览器设置 SOCKS5 代理 localhost:1080,所有流量通过 SSH 服务器转发。
总结
数据原理图:
[你的PC] ----(SSH加密通道)---> [SSH服务器] ----(明文或任意的)----> [目标服务]
↑ ↑
本地监听端口 能访问目标服务的网络
- 本地转发:服务器是“跳板”,帮你去访问别的机器。
- 远程转发:你的 PC 是“服务提供方”,服务器帮你把流量引回来。
- 动态转发:目标地址由应用每次动态指定,SSH 服务器作为通用代理。
**注意事项: **
- SSH 连接中断,转发就失效(可用 autossh 保持)。
- 默认只能绑定本地端口,绑定 0.0.0.0 需要在服务器配置
GatewayPorts yes(安全性降低)。 - 只支持 TCP 协议,无法直接转发 UDP(但可用某些工具间接实现)。
- 性能受 SSH 加密和单连接限制,不适合高吞吐量场景。
参考文档: