原理说明

SSH 端口转发是在指定的计算机上建立 SSH 连接通道,从而转发数据。因为 SSH 通信本身是加密的,所以安全上有所保证,但是并不意味着绝对的安全(如中间人攻击)。所以在第一次建立连接时,远端主机会将共钥指纹发送给建立连接的对端,为了避免中间人攻击,可以事先将远端服务器的共钥指纹告诉客户端,这样客户端可以辨别是否在建立连接时,存在中间人。

本地端口转发

$ ssh -L [本地主机:]本地端口:目标主机:目标主机端口 [用户名@]SSH服务器

# 例如在本地监听 3306 端口,然后将数据通过 SSH 转发到 example.com 的 3306 端口。
$ ssh -L 3306:example.com:3306 user@example.com

注意:目标主机是相对于 SSH 服务器的,例如上面的目标主机可以是 localhost,也就是 example.com 自己。

当按下会车后,后面的流程和普通 SSH 一样。

远程端口转发

Remote Port Forwarding

如上图,Server 1 需要访问 Server 2 的服务,但是二者无法直接通信,Server 3 可以同时和 Server 1 以及 Server 2 通信,但是因为 Server 3 处于内网, Server 1 无法访问 Server 3。这种情况就需要使用远程端口转发来实现让 Server 1 通过 Server 3 转发数据到 Server 2 的对应端口。

$ ssh -R [远程主机:]远程主机端口:目标主机:目标主机端口 [用户名@]SSH服务器

# 在 Server 3 上执行如下命令,将在 Server 1 上监听 3306 端口,然后将数据通过 Server 3 转发到 Server 2 的 3306 端口。
$ ssh -R 3306:server2:3306 user@server1

动态端口转发

这种方式多用于代理请求。

$ ssh -D [本地主机:]本地端口 [用户名@]SSH服务器

# 执行这个命令后将创建一个 SOCKS 隧道
$ ssh -D 8080 -N -f user@example.com

所有到 8080 端口的数据将通过 SOCKS 转发到 example.com 代理。

I hope this is helpful, Happy hacking…