ByteNoteByteNote
SSH 端口转发实战:本地、远程与动态三种隧道用法
字

字节笔记本

2026年10月6日 · 约 4 分钟读完

SSH 端口转发实战:本地、远程与动态三种隧道用法

API中转
¥120

远程办公时连不上公司内网的数据库,本地开发的服务没有公网 IP 无法给同事演示,公共 Wi-Fi 上的流量裸奔让人不放心。这三个常见困扰,都可以用同一个工具解决:SSH 端口转发。它不需要安装任何额外软件,只要有一台可以登录的 SSH 服务器,就能在加密通道里完成端口映射。

什么是 SSH 端口转发

SSH 端口转发也称 SSH 隧道,原理是利用 SSH 协议在两台主机之间建立一条加密通道,让特定的网络流量从这条通道里经过。按照数据流的方向,它分为三种类型:

  • 本地端口转发:把远程主机的端口映射到本地;
  • 远程端口转发:把本地主机的端口映射到远端;
  • 动态端口转发:在本地创建 SOCKS 代理,按访问目标动态转发流量。

SSH 端口转发三种隧道模式总览

本地端口转发:远程服务,本地用

假设远程主机 remote.example.com 上运行着一个数据库服务,它只监听内网、端口为 3306,从外部无法直接访问。在本地执行:

bash
ssh -L 3307:localhost:3306 user@remote.example.com

这条命令把本地的 3307 端口绑定到远程主机的 3306 端口。此后访问本地的 localhost:3307,流量就会经加密隧道送达远端的 3306,体验上就像数据库跑在本机一样。

本地端口转发命令拆解

它的典型场景有两类。一是安全访问内网服务:当远程主机的某些服务仅对内网开放时,用这种方式可以在本地直接使用。二是绕过防火墙限制:如果某些服务被防火墙阻止,但 SSH 连接本身是允许的,就可以借这条隧道访问受限服务。

远程端口转发:本地服务,远程用

方向反过来:本地机器运行着一个 Web 服务,监听 8080 端口,希望远程主机能够访问它。在本地执行:

bash
ssh -R 9090:localhost:8080 user@remote.example.com

远程主机的 9090 端口被绑定到本地的 8080 端口。此后在远程主机上访问 localhost:9090,实际请求的都是你本机的 Web 服务。

这种转发最典型的用途是穿透 NAT 或防火墙:本机没有公网 IP、外部无法直接连入时,借一台有公网地址的 SSH 服务器,就能把本地服务暴露给外部网络。远程调试也是常见用法,开发人员可以把本地调试服务通过远程端口转发供远程主机访问,方便联调和测试。

动态端口转发:一个命令建起 SOCKS 代理

前两种转发都是一对一的端口映射,如果需要访问的远程服务很多,逐条配置会非常繁琐。动态端口转发正是为解决这个问题:

bash
ssh -D 1080 user@remote.example.com

这条命令在本地创建一个 SOCKS 代理,监听 1080 端口。把浏览器或其他应用的代理设置为 localhost:1080,所有流量都会经 SSH 隧道加密传输,并按访问目标动态选择出口。

在不安全的网络环境中,比如公共 Wi-Fi,这相当于给浏览流量加了一层加密,保证数据安全;需要经由跳板机访问多个内网服务时,也只需配置一次代理,不必逐个建隧道。

服务端配置与安全注意事项

端口转发能不能用、好不好用,取决于 SSH 服务端的配置,有三点值得留意:

  1. 确认服务端允许转发。检查 SSH 服务器配置文件 sshd_config 中的 AllowTcpForwarding 参数,应设置为 yes。
  2. 远程转发要对外开放端口时,需要在服务端把 GatewayPorts 设置为 yes,否则转发的端口只对本机开放,远程主机之外的其他地址无法访问。
  3. 控制暴露面。端口转发会绕过部分网络边界控制,注意不要把敏感服务暴露给不可信任的网络,隧道用完及时断开,合理使用、不要滥用服务器资源。

写在最后

SSH 端口转发的三条命令并不复杂:-L 把远程服务搬到本地,-R 把本地服务送到远端,-D 建一个动态 SOCKS 代理。配合一台随手可得的 SSH 服务器,远程办公、联调演示、加密浏览这些需求都能稳妥覆盖。建议把这三条命令收藏起来,遇到对应场景时直接套用。

相关文章

分享: