SSH 操作晋级篇:三大端口转发模式,内网穿透与代理搭建实战

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

指定密钥文件

所有模式

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...