其实 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.10x03 动态转发
动态端口允许通过配置一个本地端口,把通过隧道的数据转发到远端的所有地址。本地的应用程序需要使用 Socks 协议与本地端口通讯。此时 SSH 充当 Socks 代理服务器的角色。
简单的说就是和 ss 功能一样,只是中间的加密有 openssl 来做。
命令如下
ssh -D <local port> <SSH Server>上面的例子可以如下设置
ssh -f -N -D 10.1.1.1:8000 [email protected]