Chisel

项目地址:https://github.com/jpillora/chisel

Chisel is a fast TCP/UDP tunnel, transported over HTTP, secured via SSH. Single executable including both client and server. Written in Go (golang). Chisel is mainly useful for passing through firewalls, though it can also be used to provide a secure endpoint into your network.

gsocket

项目地址:https://github.com/hackerschoice/gsocket/tree/master

The Global Socket Tookit allows two users behind NAT/Firewall to establish a TCP connection with each other. Securely.

通信是通过gsocket分配密钥后,输入输出都传到官方服务器上实现的。

SSH隧道

本地转发 - L

本地转发里的本地,我认为最简单的理解就是执行转发命令后,后续实际用于连接的端口位于本地主机。 本地转发的基本命令形式如下:

ssh -L 主机A端口A:主机C:主机C端口C username@主机B

结合下面的示意图,我们来理解下这个命令。如果我们的电脑是主机A,主机B是服务器的登录节点,主机C是服务器的子节点,其中我们的主机A可以连接主机B,但不能直接访问主机C。这时如果我们想要在自己电脑上直接使用主机C上部署在端口C的服务,就可以使用上面的命令,将端口C转发到本地的端口A上。 这时,我们在本地其它程序访问A端口,就等于访问了主机C的端口C,就好像在A和C端口之间打了一条隧道直连一样。 另外主要注意的时,主机B可以和主机C是同一台电脑,我们只要把上面命令里的主机C改成localhost即可。一般用在我们只能访问B的部分端口的情况。

远程转发 - R

远程转发里的远程,同样的理解方法,在执行转发命令后,后续实际用于连接的端口在远程主机。 远程转发的基本命令形式如下:

ssh -R 主机B端口B:主机C:主机C端口C username@主机B

同样结合示意图来进行理解。此时我们的主机A与主机C位于同一个内网,无法被直接访问,主机B位于公网可以直接访问。如果我们想要访问主机C端口C上的服务,可以在主机A上发起到主机B的ssh连接,执行如上命令。 这是,访问主机B的端口B,就等于访问主机C的端口C。同样的,主机A和主机C可以是同一台电脑,实现将内网机器提供的服务暴露到公网上。

动态转发 - D

不同于上面的固定端口转发,动态转发相当于把主机B当做一台代理来使用,使用如下命令,可以在端口A上提供一个socks5代理服务。这样当我们在主机A的其它应用上设置了代理后,就可以通过主机B来访问网络,并且A和B之间的通信会被ssh加密。这也是最雏形的越过wall的方式。

ssh -D 主机A端口A username@主机B

在执行上面的命令时,会同时打开一个ssh交互终端,如果我们只是需要后台启动隧道,可以添加- N参数。

DNS隧道

反向SOCKET代理