
一、本地端口映射(Local Port Forwarding)
作用:将远端机器的某个端口映射到本地端口,本地访问该端口相当于直接访问远端端口。
适用场景:开发时访问远端服务器的服务(如数据库、集群服务),无需直接暴露远端端口。

说明:本地客户端通过访问本地的8080端口,数据会通过 SSH 隧道传输到 SSH 服务器,再由 SSH 服务器转发到远端服务器db.example.com的3306端口。
操作步骤
1、确认远端服务状态
假设远端服务器 remote_host(IP:10.0.0.100)上运行着一个服务(如 NebulaGraph 服务),端口为 9669,且该服务仅监听本地或内网(不直接对外暴露)。
2、执行本地端口映射命令
在本地终端运行:
ssh -L [本地端口]:[远端目标IP]:[远端目标端口] [远端用户名]@[远端服务器IP] -N-L:指定本地端口映射
-N:仅建立隧道,不登录 shell(可选,后台运行可加 -f)
将本地 9669 端口映射到远端 10.0.0.100 的 9669 端口:
ssh -L 9669:127.0.0.1:9669 root@10.0.0.100 -N(127.0.0.1 表示远端服务器自身,若服务在另一台内网机器 10.0.0.101 上,可改为 10.0.0.101)
3、验证映射效果
本地访问 localhost:9669,相当于直接访问 10.0.0.100:9669。例如用 telnet 测试:
telnet localhost 9669 # 若连接成功,说明映射生效二、远程端口映射(Remote Port Forwarding)
作用:将本地端口映射到远端服务器的某个端口,让远端(或公网)访问该端口相当于访问本地服务。
适用场景:本地运行的服务需要被公网访问(如调试 WebHook 接口),需远端服务器 SSH 配置允许。

说明:远程客户端访问 SSH 服务器的9090端口,数据会通过 SSH 隧道传输到本地服务器的3000端口。
操作步骤
1、配置远端 SSH 服务(关键)
远端服务器需允许远程端口映射,修改 /etc/ssh/sshd_config:
sudo vim /etc/ssh/sshd_config确保以下配置(无则添加):
GatewayPorts yes # 允许其他机器访问远端映射的端口(默认仅远端自身可访问)
AllowTcpForwarding yes # 允许 TCP 转发(默认开启,确认未禁用)重启 SSH 服务生效:
sudo systemctl restart sshd2、确认本地服务状态
假设本地运行着一个 Web 服务,端口为 8080(如调试中的 WebHook 接口)。
3、执行远程端口映射命令
在本地终端运行:
ssh -R [远端端口]:[本地目标IP]:[本地目标端口] [远端用户名]@[远端服务器IP] -N-R:指定远程端口映射
示例:将本地 8080 端口映射到远端 10.0.0.100 的 8080 端口:
ssh -R 8080:127.0.0.1:8080 root@10.0.0.100 -N4、验证映射效果
远端服务器访问 localhost:8080,应能看到本地 8080 服务内容。
若 GatewayPorts 设为 yes,公网机器访问 10.0.0.100:8080,也能访问本地服务。
三、动态端口映射(Dynamic Port Forwarding,SOCKS5 代理)
作用:将本地端口作为 SOCKS5 代理服务器,所有通过该代理的网络请求会经远端服务器转发。
适用场景:通过远端服务器访问其所在网络的资源(如访问内网网站、突破网络限制)。

说明:本地客户端将8080端口作为 SOCKS 代理,所有通过该代理的网络请求会经 SSH 服务器转发到互联网上的各个站点。
操作步骤
1、执行动态端口映射命令
在本地终端运行:
ssh -D [本地SOCKS端口] [远端用户名]@[远端服务器IP] -N-D:指定动态端口(SOCKS5 代理端口)
示例:将本地 1080 端口作为 SOCKS5 代理,通过 10.0.0.100 转发:
ssh -D 1080 root@10.0.0.100 -N2、配置客户端使用代理
浏览器(如 Chrome):安装代理插件(如 SwitchyOmega),设置代理类型为 SOCKS5,地址 localhost,端口 1080。
命令行工具(如 curl):
curl --socks5-hostname localhost:1080 https://目标网站 # 通过代理访问3、验证代理效果
访问需通过远端服务器才能访问的资源(如远端内网地址 192.168.1.1),若能成功打开,说明代理生效。
补充说明
后台运行隧道:命令后加 -f(需输入密码或配置免密登录),例如:
ssh -f -L 9669:127.0.0.1:9669 root@10.0.0.100 -N关闭隧道:通过 ps aux | grep ssh 找到进程 ID,再用 kill [PID] 终止。