由浅入深写代理(9)-ssh-代理

其实 ssh 不算是代理,只是一种能实现代理的工具,不过因为 ssh 功能强大,所以单独拿出来说一下。

0x01 本地端口转发

举个例子,远程有个 mongo 服务器需要连接,但是 mongo 不允许远程连接,只能通过和它同一个局域网的跳板机 A (x.x.x.x)连接。这个时候可以通过端口转发的方法直接连接。

命令格式是:

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

例如本地开启了 8000 端口监听, mongo 服务器地址为 192.168.0.2 端口 27017, 跳板机地址 192.168.0.1:

ssh -N -L 8000:192.168.0.2:27017 192.168.0.1

开启完端口转发后,连接 mongo 可以直接通过命令 mongo --host localhost --port 8000

0x02 远程端口转发

远程端口转发和本地端口转发功能一样,唯一的区别在于 ssh client 端和 server 端相反。举上面的例子,本地 client 无法通过 ssh 连接 A, 但是 A 能 ssh 连接本地。这种情况下可以通过远程端口转发

命令格式:

ssh -R <local port>:<remote host>:<remote port> <SSH hostname>

上例可以在本地运行

ssh -R 8000:192.168.0.2:27017 192.168.0.1

0x03 动态转发

动态端口允许通过配置一个本地端口,把通过隧道的数据转发到远端的所有地址。本地的应用程序需要使用 Socks 协议与本地端口通讯。此时 SSH 充当 Socks 代理服务器的角色。

简单的说就是和 ss 功能一样,只是中间的加密有 openssl 来做。

命令如下

ssh -D <local port> <SSH Server>

上面的例子可以如下设置

ssh -f -N -D 10.1.1.1:8000 [email protected]