SSH 隧道详解:本地转发、远程转发与动态转发
数据库端口不想对公网开,但本地又要用图形工具连;内网的服务想临时给外面看一眼;出差时想让所有流量走回自己的服务器——这几件事都不用装额外软件,SSH 自带的端口转发就能做。 本文讲清楚三种转发方式的区别、参数怎么记、以及那些一看就懂但一用就错的地方。 一、先理解一件事:转发的是「连接」,不是「端口」 很多教程一上来就给命令,看完照抄能跑,但换个场景就不会改了。原因是没想清楚数据往哪边流。 SSH 转发的本质是:在一台机器上开个监听端口,谁连上来,就把这条连接通过已建立的 SSH 加密通道,转到另一端去替他连目标地址。 所以每次写命令,只需要回答三个问题: 在哪台机器上监听?(决定用 -L 还是 -R) 监听哪个端口? 连接最终要送到哪个地址、哪个端口?——从哪一端的视角看? 第三个问题是所有困惑的来源,后面会反复强调。 二、本地转发 -L:把远端的服务搬到本地 这是最常用的一种。典型场景:数据库只监听 127.0.0.1,不对公网开放,但你要用本地的图形工具连它。 ssh -L 13306:127.0.0.1:3306 root@db-server 参数怎么读 -L 13306:127.0.0.1:3306 └─┬─┘ └────┬────┘ └┬─┘ │ │ └─ 目标端口 │ └─ 目标地址(★ 从 db-server 的视角看 ★) └─ 在你本机监听的端口 中间那个地址是站在服务器上看的,这是最容易搞错的地方。127.0.0.1 在这里指的不是你的电脑,而是 db-server 自己。 数据怎么走 你的电脑 db-server mysql -h 127.0.0.1 -P 13306 │ └─→ 本机 13306(ssh 在监听) │ │ ═══ SSH 加密隧道(走 22 端口)═══ │ └─→ 127.0.0.1:3306(MySQL) 关键在于:MySQL 看到的连接来自它自己的 127.0.0.1,因为最后一跳是 db-server 内部发起的。所以数据库完全不用对外开放端口,防火墙只需要放行 22。 ...