SSH端口转发总结
SSH端口转发总结
SSH端口转发是一种通过SSH连接建立网络隧道的技术,可以实现不同网络环境下的安全通信。本文详细介绍三种端口转发类型及其实际应用场景。
🔄 本地转发 (Local Forwarding)
概念说明
本地转发用于解决本地机器无法直接访问目标服务的问题,通过SSH隧道将本地端口的流量转发到远程服务。
语法格式
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
工作原理
通过下图了解用法和应用场景:

示例解析
ssh -L 8080:HOST_C:80 HOST_A
工作流程:
- 通过A机器作为跳板访问C机器的80端口
- 在本机监听8080端口
- 访问本地8080端口时,流量会经过A机器转发到C的80端口
- 实现本地访问原本无法直接连接的受限制远程主机
💡 应用场景
场景一:跨网络访问数据库
需求: 国外有一台MySQL服务器,本地机器无法直接访问,但有一台中转服务器可以同时连接本地和MySQL服务器。
解决方案: 利用中转服务器建立SSH隧道,让它在本地机器和MySQL服务器之间搭建通信桥梁。
ssh -L 3306:mysql-server:3306 user@jump-server
场景二:端口映射与防火墙绕过
需求: 本机运行在8080端口的Web服务因防火墙限制无法被其他机器访问,希望通过8888端口提供访问。
步骤:
启动Web服务:
python3 -m http.server 8080
建立本地端口映射:
ssh -L 8888:127.0.0.1:8080 [email protected] -N
验证结果: 两个端口都能正常访问同一个Web服务
💡 提示: 对于本机端口转发,也可以使用
iptables
或更简单的socat
工具。
⬆️ 远端转发 (Remote Forwarding)
概念说明
远端转发的作用是将远端机器作为代理,转发流量到本地服务,实现内网穿透功能。
语法格式
ssh -R <remote port>:<local host>:<local port> <SSH hostname>
工作原理
通过下图了解原理和应用场景:

示例解析
ssh -R 0.0.0.0:8080:HOST_C:80 HOST_A
工作流程:
- 将C机器的80端口映射到A机器的8080端口
- 外部访问A机器的8080端口时,流量会转发到C机器的80端口
- 实现内网服务的外部访问能力
💡 应用场景
场景一:内网服务外部共享
需求: 本地有一个Web服务,希望分享给其他人测试,但由于网络限制其他人无法直接访问本地网络。
解决方案: 通过SSH远端转发,将本地服务映射到外网服务器上。
ssh -R 0.0.0.0:8888:127.0.0.1:8080 ubuntu@external-server -N
结果: 其他人可以通过 external-server:8888
访问你本机的8080服务。
📝 说明: 虽然通常使用frp等专用工具,但SSH也能实现相同效果。
⚙️ 服务器配置要求
远端转发需要在SSH服务器上开启转发和外部访问权限:
# 编辑SSH配置文件
sed -i "s/#GatewayPorts no/GatewayPorts yes/g" /etc/ssh/sshd_config
sed -i "s/#AllowTcpForwarding/AllowTcpForwarding/g" /etc/ssh/sshd_config
# 重启SSH服务
systemctl restart ssh
sudo systemctl restart sshd
🔀 动态转发 (Dynamic Forwarding)
概念说明
动态转发通过创建本地SOCKS代理,实现灵活的流量转发。无需指定具体的远程主机和端口,可以根据实际需求动态转发流量。
语法格式
ssh -D <local port> <SSH hostname> -N
工作原理
通过下图了解原理和应用场景:

特点分析
- 灵活性高: 动态转发在本机与SSH服务器之间创建加密连接,本机所有通过指定端口的通信都会转发
- 用途广泛: 主要应用场景是让所有外部网站访问都通过SSH服务器中转
- 动态路由: SSH服务器访问哪个网站完全取决于原始通信内容,因此称为"动态转发"
- 代理功能: 由于可以按原始通信转发所有流量,因此常用于网络代理或突破网络限制
💡 应用场景
创建SOCKS代理
ssh -D 2121 root@proxy-server -N
功能说明:
- 在本地监听2121端口,所有流量都通过proxy-server进行转发
- 本地的2121端口成为一个SOCKS代理,可供浏览器或其他程序使用
- 支持多种应用程序的代理配置
网络访问优化
使用场景:
- 绕过网络限制,访问被屏蔽的网站
- 通过海外服务器加速国际网站访问
- 为应用程序提供统一的代理出口
🌐 实战案例:为远程服务器提供外网访问能力
应用背景
适用场景: 远程服务器位于国内,无法连接外网,且不希望在远程服务器上运行代理软件。
实现步骤
第一步:建立SSH反向隧道
假设本地代理端口是7890(已运行代理软件),通过SSH将远程服务器的8888端口转发到本地的7890端口:
ssh -R 8888:127.0.0.1:7890 user@remote-server
第二步:配置远程服务器代理
在远程服务器上配置代理环境变量:
export HTTP_PROXY="http://127.0.0.1:8888"
export HTTPS_PROXY="http://127.0.0.1:8888"
export ALL_PROXY="socks5://127.0.0.1:8888"
验证效果
远程服务器现在可以通过本地代理访问外网,实现了网络访问能力的扩展。
📚 总结对比
转发类型 | 语法格式 | 主要用途 | 典型场景 |
---|---|---|---|
本地转发 | ssh -L local:remote:port host | 访问受限远程服务 | 跨网络数据库访问、防火墙绕过 |
远端转发 | ssh -R remote:local:port host | 内网服务外部化 | 内网服务分享、临时外网访问 |
动态转发 | ssh -D port host | 创建SOCKS代理 | 网络代理、访问限制绕过 |
🎯 选择建议
- 需要访问特定远程服务时 → 选择本地转发
- 需要让外部访问内网服务时 → 选择远端转发
- 需要灵活的代理服务时 → 选择动态转发
通过合理运用这三种SSH端口转发技术,可以有效解决各种网络连接和访问问题,为系统管理和开发工作提供便利。