tun2socks原理

翻墙有几种方式:

1:vpn和各种自定义的vpn;它们是把iOS的ip数据包的内容通过一个tcp转发到vpn服务器,然后在服务器上创建一个tun虚拟网卡,再把接收到的ip数据包内容通过系统的函数发给网卡,然后网卡再把这个原始的ip数据包内容加上自己的ip地址等信息发送出去,对方接收到数据之后,解析出来,在ip之上的内容是没有改变的,所以tcp的连接之类的整个过程是不会影响的,只是在返回数据时,它识别到的源ip地址变成了服务器上虚拟网卡的地址;

2:http代理,现在主流的系统都支持设置http代理;它们的原理是客户端系统在发送http请求时,并不是把数据包发给真正的目的地址,而是与代理服务器创建一个tcp连接,把http包发送给代理服务器,这样代理服务器就可以接收到一个http请求,然后再从请求中得到真正的目的地址,把这个请求转发给目的ip,所以从服务器上来看,就是一个最基本的http服务器而已,只是它的目的从处理请求变成了转发请求;整个请求过程中,在http层上的内容不会改变,但是在tcp这一层会改变;对于客户端操作系统来说,在发送http之前,我们要先与目的地建立连接,但是操作系统并不知道我们是不是用来发送http的,所以它就不能让我们去连接代理服务器,由此可知,http代理的客户端处理不会是操作系统来提供,而是应该上层应用程序来提供;比如提供一个发送http的函数,那么在这个函数中,我们就可以知道它肯定是用来发http的,就可以去连接代理服务器而不是直接的目标服务器;这就解释了为什么有些http请求不走代理(比如libcurl创建的http请求,大部分的linux终端命令),因为这要库去支持,不过现在主流的浏览器都支持;

3:socks5代理,socks5代理中,客户端与代理服务器tcp连接上后,客户端会向代理服务器发送协商数据和真正的目标地址,代理服务器就与直接的目标地址连接,然后再把后续的请求转发到目标地址上;相对于http代理来说,socks5代理不区分上层协议,所以可以在系统库中去实现;

翻墙原理上是这几个基本的方法,vpn的ip数据转发,http代理的http数据转发,sock5代理的tcp,udp数据转发。

但是由于这几种方式都有它的明确的特征和易于识别,比如vpn,sock5代理特征明显,http代理数据明文可见,导致了用来翻墙不稳定(当然自定义vpn可以解决这个问题);

ShadowSocks的优点为sock5代理类似,由于不是在ip层面上,所以数据包相对来说要小(不用传ip数据包头与tcp数据包头,所有理论上它要快一些)

所以现在大家都在用ShadowSocks,在pc端它的实现比较简单,因为它只要在本地实现一个sockt5代理服务器就好了,这样在sock5代理服务器内部,就能得到tcp数据的内容,把内容通过自己的协议转发到远程服务器,让远程服务器转发tcp的内容;相当于本地和服务器上两边实现了类似的socket5代理;

但是对于iOS,android而言,sock5代理在非越狱和root的情况下不被支持,不过能得到ip数据包,所以要想办法把ip数据包转成tcp/udp的包,这样才能分析出tcp/udp中的内容进行转发;

这里引入一个开源的tcp/ip协议栈,它简单占用内存小,所以能运行在移动设备上,我们要的是让它接收系统的ip数据包,分析出tcp/udp数据内容。但是对于标准的tcp/ip协议栈,由于系统的ip数据包发送的目的地与这个协议栈运行的地址,所以正常情况下它是不会被解析出来的,不过由于这个协议栈相对来说简单,所以我们可以进行改造,让它不管是去哪里的ip数据包,都像本来就是发送给他的一样;这样它能accept 发给其它地址的tcp的连接,可以直接读取tcp连接之后的发送的内容;这也就是为什么叫tun2socks了(改造的过程其实很简单,只是把在tcp段组成tcp时的ip和port限制去掉就行了),并且由于它能让我们得到tcp发送的数据包,这样就不用另一个socks代理了。

原文链接:,转发请注明来源!

发表评论