SSH 操作晋级篇:三大端口转发模式,内网穿透与代理搭建实战
前言:为什么需要 SSH 端口转发?
日常运维或开发中,你是否遇到过这些场景:
公司内网的数据库(仅内网可达),在家想访问怎么办?本地开发的 Web 服务,想临时让外网朋友测试如何实现?某些网站被地域限制,如何通过 SSH 安全绕过?
SSH 端口转发(Port Forwarding)是解决这些问题的 “瑞士军刀”,它通过加密隧道将网络请求转发到目标地址,兼具 “安全性” 和 “灵活性”。本文将详解 SSH 的本地转发、远程转发、动态转发三大模式,附完整操作指令和实战场景,看完就能上手。
一、SSH 端口转发核心原理
SSH 端口转发本质是 “通过 SSH 加密隧道传递其他协议的流量”(如 HTTP、MySQL 等),所有数据经过 SSH 加密,避免被监听或篡改。
三大转发模式的核心区别:
|
模式 |
作用 |
典型场景 |
|
本地转发 |
本地端口 → SSH 服务器 → 目标地址 |
访问内网服务(如内网数据库) |
|
远程转发 |
远程服务器端口 → SSH 客户端 → 本地地址 |
内网穿透(如外网访问本地 Web 服务) |
|
动态转发 |
本地 SOCKS 代理 → SSH 服务器 → 任意地址 |
全局代理(如绕过网络限制) |
前置条件:
需有一台可 SSH 登录的服务器(称为 “跳板机” 或 “转发服务器”);本地已安装 SSH 客户端(Linux/macOS 自带,Windows 用 Git Bash 或 PuTTY);确保 SSH 服务器配置允许转发(默认允许,若禁用需修改 sshd_config 中的 AllowTcpForwarding yes)。
二、本地端口转发(Local Port Forwarding):访问内网服务
1. 场景说明
假设:
你的电脑(本地)无法直接访问公司内网的 MySQL 服务器(192.168.1.10:3306);但你可以 SSH 登录公司的跳板机(jump.example.com,公网可达);跳板机能访问内网 MySQL 服务器。
目标:通过本地端口转发,让本地电脑直接访问 192.168.1.10:3306。
2. 原理图示
|
本地电脑(127.0.0.1:3306) → SSH 隧道 → 跳板机(jump.example.com) → 内网 MySQL(192.168.1.10:3306) |
3. 操作指令
基础命令:
|
ssh -L [本地IP:]本地端口:目标主机:目标端口 跳板机用户@跳板机地址 -p 跳板机SSH端口 |
-L:本地转发标识;[本地IP:]:可选,默认 127.0.0.1(仅本地可访问),若填 0.0.0.0 则局域网内其他设备可访问;其他参数:跳板机的登录信息。
实战命令(以上述场景为例):
|
# 将本地 3306 端口转发到内网 MySQL(192.168.1.10:3306),通过跳板机 jump.example.com 转发 ssh -L 3306:192.168.1.10:3306 user@jump.example.com -p 22 |
执行后,输入跳板机密码(或通过密钥免密登录),保持 SSH 会话不关闭;本地访问 127.0.0.1:3306 即可连接内网 MySQL 服务器。
4. 进阶:后台运行与配置文件
后台运行(避免终端关闭后隧道断开):
|
ssh -fN -L 3306:192.168.1.10:3306 user@jump.example.com -p 22 # -f:后台运行;-N:不执行远程命令(仅转发) |
配置文件复用(编辑 ~/.ssh/config,下次直接 ssh mysql-forward):
|
vim ~/.ssh/config # 添加以下内容 Host mysql-forward HostName jump.example.com User user Port 22 LocalForward 3306 192.168.1.10:3306 # 本地转发配置 ServerAliveInterval 30 # 每30秒发送心跳,保持连接 |
5. 验证效果
在本地执行以下命令,若能连接则说明转发成功:
|
# 测试 MySQL 连接(需本地安装 mysql 客户端) mysql -h 127.0.0.1 -P 3306 -u 数据库用户 -p |
三、远程端口转发(Remote Port Forwarding):内网穿透
1. 场景说明
假设:
你本地电脑运行着一个 Web 服务(127.0.0.1:8080),仅本地可访问;你有一台公网服务器(public.example.com,公网 IP:203.0.113.5);想让外网朋友通过 public.example.com:8080 访问你本地的 Web 服务。
目标:通过远程端口转发,将公网服务器的 8080 端口转发到本地 Web 服务。
2. 原理图示
|
外网用户 → 公网服务器(203.0.113.5:8080) → SSH 隧道 → 本地电脑(127.0.0.1:8080) |
3. 操作指令
基础命令:
|
ssh -R [远程IP:]远程端口:本地主机:本地端口 公网服务器用户@公网服务器地址 -p 公网服务器SSH端口 |
-R:远程转发标识;[远程IP:]:可选,默认 127.0.0.1(仅公网服务器本地可访问),若填 0.0.0.0 则外网可访问(需服务器配置允许)。
实战命令(以上述场景为例):
|
# 将公网服务器的 8080 端口转发到本地 8080 端口 ssh -R 8080:127.0.0.1:8080 user@public.example.com -p 22 |
执行后,保持 SSH 会话不关闭;此时公网服务器的 127.0.0.1:8080 已映射到本地 127.0.0.1:8080,但外网还无法访问(需下一步配置)。
4. 关键配置:允许外网访问
默认情况下,远程转发的端口仅绑定公网服务器的 127.0.0.1,外网无法访问,需修改公网服务器的 sshd_config:
|
# 登录公网服务器,编辑 SSH 配置 sudo vim /etc/ssh/sshd_config # 添加/修改以下配置(允许远程转发绑定到所有网卡) GatewayPorts yes # 重启 SSH 服务 sudo systemctl restart sshd # CentOS/Ubuntu 通用 |
修改后,重新执行远程转发命令(指定绑定公网服务器的所有 IP):
|
ssh -R 0.0.0.0:8080:127.0.0.1:8080 user@public.example.com -p 22 |
5. 验证效果
外网朋友访问 http://203.0.113.5:8080,即可打开你本地的 Web 服务;若无法访问,检查公网服务器防火墙是否开放 8080 端口:
|
# 公网服务器开放 8080 端口(CentOS 示例) sudo firewall-cmd –add-port=8080/tcp –permanent sudo firewall-cmd –reload |
四、动态端口转发(Dynamic Port Forwarding):搭建 SOCKS 代理
1. 场景说明
假设:
你想通过 SSH 服务器的网络访问某些被限制的网站(如学术资源);需搭建一个本地代理,让浏览器 / 工具通过该代理访问网络。
目标:通过动态转发创建 SOCKS5 代理,实现全局代理访问。
2. 原理图示
|
本地应用(浏览器) → SOCKS 代理(本地:1080) → SSH 隧道 → 远程服务器 → 目标网站 |
3. 操作指令
基础命令:
|
ssh -D [本地IP:]本地端口 代理服务器用户@代理服务器地址 -p 代理服务器SSH端口 |
-D:动态转发标识,会创建一个 SOCKS5 代理;本地应用需配置代理为 socks5://本地IP:本地端口。
实战命令:
|
# 在本地创建 SOCKS5 代理(端口 1080),通过代理服务器 proxy.example.com 转发 ssh -D 1080 user@proxy.example.com -p 22 |
执行后,保持 SSH 会话不关闭,本地 127.0.0.1:1080 即为 SOCKS5 代理。
4. 配置浏览器使用代理(以 Firefox 为例)
打开 Firefox → 右上角菜单 → 设置 → 搜索 “代理”;选择 “手动配置代理”;SOCKS 主机:127.0.0.1,端口:1080;勾选 “SOCKS v5”,并勾选 “远程 DNS”(避免本地 DNS 泄露);点击 “确定”,访问网站时流量会通过 SSH 代理转发。
(截图描述:Firefox 代理设置界面,上述参数对应输入框填写内容,勾选选项清晰可见)
5. 进阶:后台运行与代理工具
后台运行:
|
ssh -fN -D 1080 user@proxy.example.com -p 22 |
配合代理工具:对于需要代理的应用(如终端),可使用 proxychains 工具:
|
# 安装 proxychains(CentOS 示例) sudo yum install proxychains-ng -y # 配置代理(编辑 /etc/proxychains.conf,最后一行添加) socks5 127.0.0.1 1080 # 使用代理访问网站 proxychains curl https://目标网站 |
五、常见问题与排查技巧
1. 端口转发失败:“bind: Address already in use”
原因:本地或远程端口已被占用;解决:更换端口(如将 3306 改为 3307),或杀死占用进程:
|
# 查看端口占用(Linux) lsof -i:3306 # 杀死进程(PID 替换为实际进程号) kill -9 PID |
2. 远程转发后外网无法访问
检查公网服务器 sshd_config 中 GatewayPorts yes 是否生效;检查公网服务器防火墙是否开放转发端口;远程转发命令需指定 0.0.0.0:端口(如 -R 0.0.0.0:8080:…)。
3. 隧道频繁断开
解决方案:添加心跳参数 ServerAliveInterval 30(每 30 秒发送一次心跳),可写入 ~/.ssh/config 永久生效。
4. 权限不足:“Permission denied”
原因:绑定的端口是 1-1024(特权端口),非 root 用户无权限;解决:使用 1024 以上端口(如 8080、1080),或用 root 用户执行命令。
六、总结与扩展
SSH 三大转发模式各有侧重:
本地转发:“从外到内” 访问内网服务;远程转发:“从内到外” 实现内网穿透;动态转发:“全局代理” 绕过网络限制。
实际使用中,可结合密钥登录(-i 参数)、端口复用等技巧,提升安全性和灵活性。例如,用非默认 SSH 端口(如 2222)减少被扫描风险,或通过跳板机多层转发访问更深层的内网服务。
掌握这些技巧后,无论是远程运维、本地开发调试还是安全访问,SSH 端口转发都能成为你的得力工具。
附:常用参数速查表
|
参数 |
作用 |
模式 |
|
-L |
本地端口转发 |
本地转发 |
|
-R |
远程端口转发 |
远程转发 |
|
-D |
动态端口转发(SOCKS) |
动态转发 |
|
-f |
后台运行 |
所有模式 |
|
-N |
不执行远程命令 |
所有模式 |
|
-p |
指定 SSH 端口 |
所有模式 |
|
-i |
指定密钥文件 |
所有模式 |


