在现代网络运维与开发实践中,安全、灵活地访问远程服务是一项基本需求。SSH(Secure Shell)不仅用于远程登录,其内置的端口转发(Port Forwarding)功能更是一种强大而实用的网络隧道技术。本文将深入浅出地介绍SSH端口转发的三种模式——本地转发、远程转发和动态转发,并通过实际示例展示其应用场景。
1.什么是SSH端口转发?
SSH端口转发(也称SSH隧道)是指通过已建立的SSH连接,在本地与远程主机之间创建一个加密的数据通道,将某个端口的流量“转发”到目标地址。由于所有数据都经过SSH加密,因此即使在网络不安全的环境中,也能保障通信的机密性与完整性。
SSH端口转发主要有三种类型:
Ø本地端口转发(Local Port Forwarding)
Ø远程端口转发(Remote Port Forwarding)
Ø动态端口转发(Dynamic Port Forwarding)

2.本地端口转发(-L)
原理
将本地主机上的某个端口绑定到远程主机可访问的目标服务,通过SSH服务器中转。
命令格式
ssh -L [本地IP:]本地端口:目标主机:目标端口 user@ssh服务器
示例场景
假设你身处公司内网,无法直接访问公司数据库服务器 db.internal:3306,但你可以SSH登录跳板机 jump.example.com。此时可执行:
ssh -L 3307:db.internal:3306 user@jump.example.com
执行后,本地的 127.0.0.1:3307 就会通过SSH隧道连接到 db.internal:3306。你只需用数据库客户端连接 localhost:3307 即可安全访问数据库。
⚠️ 注意:默认只监听 127.0.0.1,若需允许其他机器访问该端口,需配合 -g 参数(如 ssh -g -L ...),并确保SSH服务器配置允许(GatewayPorts yes)。
3.远程端口转发(-R)
原理
将远程主机上的某个端口绑定到本地或内网中的服务,使外部可通过SSH服务器访问你的本地服务。
命令格式
ssh -R [远程IP:]远程端口:目标主机:目标端口 user@ssh服务器
示例场景
你在家中开发了一个Web应用,运行在 localhost:8080,希望临时让同事通过公网访问。你有一台公网VPS(vps.example.com),可执行:
ssh -R 8080:localhost:8080 user@vps.example.com
之后,同事访问 http://vps.example.com:8080 即可看到你的本地服务。
🔒 安全提示:默认远程绑定仅限 127.0.0.1。若需绑定到公网接口(如 0.0.0.0),需在SSH服务器配置中设置 GatewayPorts clientspecified 或 yes,并在命令中显式指定(如 -R 0.0.0.0:8080:...)。
4.动态端口转发(-D)
原理
创建一个SOCKS代理,由SSH客户端动态决定目标地址。适用于需要代理多个不同服务的场景(如浏览器翻墙、多协议代理等)。
命令格式
ssh -D [本地IP:]本地端口 user@ssh服务器
示例场景
你想让浏览器的所有流量通过公司网络出口访问互联网:
ssh -D 1080 user@jump.example.com
然后在浏览器中配置SOCKS5代理为 127.0.0.1:1080,所有请求将经由SSH服务器转发。动态转发支持任意TCP连接,但不支持UDP(除非使用额外工具如 tun2socks)
5.高级技巧与注意事项
5.1.后台运行与保持连接
使用 -fN 参数让SSH在后台运行且不执行远程命令:
ssh -fNL 3307:db.internal:3306 user@jump.example.com
配合 autossh 可实现自动重连,提高稳定性。
5.2.配置文件简化命令
在 ~/.ssh/config 中定义:
ssh-config
Host tunnel-db HostName jump.example.com
User user
LocalForward 3307 db.internal:3306
ExitOnForwardFailure yes
之后只需运行 ssh tunnel-db 即可建立隧道。
5.3.安全建议
6.结语
SSH端口转发是系统管理员、开发者和安全工程师不可或缺的工具。它以极低的开销实现了安全、灵活的网络穿透能力,无需额外部署复杂代理或VPN。掌握本地、远程和动态三种转发模式,能让你在面对各种网络隔离、防火墙限制或临时调试需求时游刃有余。