SSH 端口转发(Port Forwarding)是 SSH 提供的一项强大功能,允许通过加密的 SSH 连接安全地转发网络流量。它可以将本地或远程端口的流量通过 SSH 隧道转发到目标主机。
三种端口转发模式
1. 本地端口转发(Local Port Forwarding)
将本地端口的流量转发到远程服务器可访问的目标。
bash# 语法 ssh -L [本地地址:]本地端口:目标地址:目标端口 用户@远程服务器 # 示例:访问远程服务器的 MySQL ssh -L 3306:localhost:3306 user@remote-server # 示例:通过跳板机访问内网服务 ssh -L 8080:internal-server:80 jump-server
应用场景:
- 访问远程服务器上的数据库
- 通过跳板机访问内网服务
- 测试远程服务的本地开发
2. 远程端口转发(Remote Port Forwarding)
将远程服务器端口的流量转发到本地机器可访问的目标。
bash# 语法 ssh -R [远程地址:]远程端口:目标地址:目标端口 用户@远程服务器 # 示例:让远程服务器访问本地开发服务器 ssh -R 8080:localhost:3000 user@remote-server # 示例:远程访问本地数据库 ssh -R 3306:localhost:3306 user@remote-server
应用场景:
- 内网穿透,让外网访问本地服务
- 远程调试本地应用
- 从远程服务器访问本地资源
3. 动态端口转发(Dynamic Port Forwarding)
创建 SOCKS 代理,支持动态转发多个目标。
bash# 语法 ssh -D 本地端口 用户@远程服务器 # 示例:创建 SOCKS 代理 ssh -D 1080 user@remote-server
应用场景:
- 浏览器代理访问内网资源
- 多目标服务的统一代理
- 绕过网络限制
高级配置
持久化连接
bash# 使用 autossh 保持连接 autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 8080:remote:80 user@server # 或在 SSH 配置中设置 ServerAliveInterval 60 ServerAliveCountMax 3
SSH 配置文件
bash# ~/.ssh/config Host tunnel HostName remote-server.com User username LocalForward 8080 localhost:80 RemoteForward 9000 localhost:3000 DynamicForward 1080
后台运行
bash# 后台运行端口转发 ssh -f -N -L 8080:remote:80 user@server # -f: 后台运行 # -N: 不执行远程命令
安全注意事项
-
访问控制:
- 使用
GatewayPorts no限制仅本地访问 - 配置防火墙规则限制转发端口
- 使用
AllowTcpForwarding控制转发权限
- 使用
-
连接安全:
- 使用强加密算法
- 定期轮换 SSH 密钥
- 监控异常连接行为
-
资源管理:
- 设置连接超时
- 限制并发连接数
- 定期清理不用的转发规则
实际应用案例
开发环境访问
bash# 通过跳板机访问开发数据库 ssh -L 3307:dev-db.internal:3306 jump-server # 然后在本地连接 mysql -h 127.0.0.1 -P 3307 -u user -p
内网服务调试
bash# 将本地开发服务器暴露给远程团队 ssh -R 8080:localhost:3000 remote-server # 团队成员通过 http://remote-server:8080 访问
安全浏览
bash# 创建 SOCKS 代理 ssh -D 1080 corporate-server # 浏览器配置 SOCKS5 代理 127.0.0.1:1080
SSH 端口转发是网络工程师和开发者的必备技能,能够安全地解决复杂的网络访问需求。