BadVPN详解之--始记:透明socks代理与tun2socks

上周六晚上闲来无事跟以前的同事聊天,问之最近有没有接触到什么比较好玩的技术,答曰tun2socks。这个正合我的胃口,我所谓的好玩的技术是那种简单,有用的技术点或者技术框架,能在10分钟内领略其原理和思想,能在20分钟内跑起来,能在半天内彻底剖析它的结构,能在此后很久的时间受益无穷。OpenVPN就是这样的“好玩”的东西,网卡点灯也算,tun2socks是另一个,当然还有一个更好玩的,那就是BadVPN,我要在另外的文章中单独介绍。本文先来介绍tun2socks,它其实是BadVPN的一个组成部分。
       能玩tun2socks,要特别感谢这位目前貌似已经穿上皮鞋的刘经理,在我离职后抢了我最后面的经理工位,却放弃了我那把尊贵的防爆炸座椅(指不能旋转升降的座椅,因为旋转升降座椅会爆炸)。

总览

tun2socks实现一种机制,它可以让你无需改动任何应用程序而完全透明地将数据用socks协议封装,转发给一个socks代理,然后由该代理程序负责与真实服务器之间转发应用数据。使用代理有两种方式,一种是你自己显式配置代理,这样一来,数据离开你的主机时它的目标地址就是代理服务器,另一种是做透明代理,即在中途把原始数据重定向到一个应用程序,由该代理程序代理转发。tun2socks在第二种的基础上,完成了socks协议的封装,并且实现该机制时使用了强大的tun网卡而不必再去配置复杂的iptables规则。

什么是socks代理

本文以TCP为例,就不再提UDP了。所以说,简单点,把socks代理称为带有认证功能的TCP代理是合适的。
       TCP代理非常容易理解,然而纯粹的TCP代理并不实用,必然要加入一些控制功能,比如谁可以被代理,谁不能被代理,如何认证,最多可以代理多少路的请求等等。有了这些控制手段,TCP代理才真正变得实用起来。

附:socks代理如何运作

socks的运作原理非常简单,就是在TCP数据外包一层socks协议头,到达socks代理服务器后,脱去socks头,然后通过socks服务器与真实服务器之间建立的连接将TCP裸数据传给真实服务器。如下图所示:

请注意,socks代理并不理解任何应用层协议,它只是负责转发应用层数据而已,这一点使socks成为了一个通用的代理协议,这一点和HTTP代理服务器是完全不同的。

什么是tun网卡

这个就不再多说。之所以有这个小节是为了文章的完整性。也是为了给初学者一个完整的提纲来更深入的学习。

什么是透明代理

我理解的透明代理就是“偷偷的给你做代理”,这一点与你在浏览器里显式设置socks代理服务器完全不同。透明代理就比如说下面这样子:

要实现这一点有很多方式,比如你可以用Linux的TProxy+Policy routing机制,关于这种方式请参见《socket的IP_TRANSPARENT选项实现代理》,然而,很多时候,这种方式行不通。

现实中的需求

如果给一个Linux的root账户,那么几乎可以随意显摆,而很多时候这并不可能。比如Android系统就不能随意root,这就意味着你无法在Android系统上随意地配置iptables规则,路由等。那么想在Android系统上免root实现一个透明代理,就需要别的办法。而tun2socks提供了一种这样的办法。

tun2socks能做什么

如果理解了上述所有的概念,那么tun2socks就不剩下什么了。先给出一个总览图:

通过上图,我们看到tun2socks可以被拆解出三个部分,即tun网卡部分,协议处理部分以及socks转换部分,这三部分在tun2socks的处理流程是串行的。我来一个一个说。

1.tun网卡部分

该部分解决了一个基本的问题,即“如何获取原始的数据包”。拿到了数据包,什么都好办了。

2.协议处理部分

如果你想做透明代理,那么你必须“想办法把数据流导入到本地”,完成这件事有好多种办法,以Linux为例,比如做一个DNAT即可完成,再比如如上所述,用tun网卡直接把原始数据包捕获到一个应用程序。显然tun2socks采用了后者。
       两者有何不同呢?
       很大的不同。如果使用DNAT的话,目标地址和端口将会是本地的一个代理程序,比如socks代理,那么操作系统的协议栈会自动将数据包交到该代理程序,除了这个DNAT之外不需要再做任何操作。而使用tun捕获数据包的话,由于只是捕获到了IP数据报文,这意味着你要自己处理IP层以上的逻辑,比如TCP按序交付,TCP状态处理,TCP拥塞控制,你要确保代理程序收到的数据包看起来是“经过协议栈处理过的数据包”,“就像是直接从socket的recv接口读到的一样”。
       tun2socks使用现成的lwip来完成了协议处理。lwip是一个轻量级的用户态协议栈,非常适合完成这种协议适配工作。

附:Android系统使用TAP模式的tun网卡

说起lwip来处理tun捕获的原始IP数据报文与socks协议的适配工作,我想起了很早之前我也做过同样的事情。那就是在Android系统上使用TAP模式的tun网卡。

3.socks协议转换部分

经过第2部分,即协议处理之后,现在tun2socks拿到的已经是源主机试图发送到原始目标主机的裸数据了,接下来它可以做的事情可就多了,当然可以用socks协议封装裸数据,将其发送给一个socks代理程序。

tun2socks与OpenVPN

只要是使用了tun网卡获取原始数据,那么任何框架都会面临一个必须回答的问题,即拿到原始的IP数据报文或者以太帧之后,下一步如何处理这些数据。OpenVPN和tun2socks显然是给出了两种不同的回答,而这不同的回答即是OpenVPN和tun2socks之间唯一的不同。

后记

这篇文章的最初内容来自于刘经理,我只是做了补充。然而沿着这个tun2socks一路走下去,我发现了一个十分好玩的东西,那就是BadVPN,所以我准备写一篇关于BadVPN的文章了,请注意接收。

时间: 2024-10-12 13:33:30

BadVPN详解之--始记:透明socks代理与tun2socks的相关文章

BadVPN详解之--组网原理剖析

这可能是第一篇关于BadVPN原理的中文介绍,所以我恪守职责,希望能将BadVPN的原理阐述清楚,而不仅仅是为了欺世盗名取天下之先. 序:格尔上市 这一段插在这里有点突兀,与BadVPN无关,只是我的一点实感,忽略即可.       明天小小要去厦门演出,今天是什么日子?是小小准备且出发的日子.但是同样在今天,也就是2017年4月21日(写完本文时估计已经到了22日...),上海格尔软件股份有限公司成功上市了.也许你不知道这个公司,确实这公司的业务是很小众,不像BAT布局那般宏大,但这并不意味着

BadVPN详解之--编译与运行

前言 还是要感谢穿皮鞋的经理,为我指示了tun2socks这条路,然则经理日理万机无暇挖掘这种纯技术的东西,只知道有这么回事就OK了,等到需要的时候,用上即可...但我等非经理就不同了,只能撸代码,撸原理.       从tun2socks一路撸下来,就是BadVPN了. 0.什么是BadVPN BadVPN是另一种VPN框架,和OpenVPN平级等同,但是我个人认为它要比OpenVPN更加优秀.OpenVPN能实现的,BadVPN几乎都能实现,重要的是,BadVPN是一种更加优雅的Client

BadVPN详解之--题外话:我之前自研的一个设计

说实话,这个与BadVPN无关,是我去年年初时想的一个东西,只是觉得与BadVPN类似就单列一篇文章来说,在看到BadVPN之前,我一直都想用这个思路来重构OpenVPN,无奈场面过于宏大,加之工作又再也与VPN无关,就一直搁置了,现在知道了有BadVPN这个东西,我也就再也没有必要去想这个事了,就当是个了结吧.我把我去年自研的基于OpenVPN的重构思路在本文中阐述一下,本文中我把我的这个VPN叫做ZyVPN,其实它是基于OpenVPN改的. 总览 有了前面对BadVPN和OpenVPN的介绍

swift详解之十一------------协议、委托(代理)模式

协议.委托(代理)模式 注:本小节总结协议以及依靠协议实现委托,这将在以后经常被使用.是一个非常重要的模块 看下官方的定义:协议定义了一个蓝图 , 规定了用来实现某一特定工作或者功能所必须的方法和属性,类.结构体.或者枚举类型都可以遵循协议, 并提供具体实现来完成协议定义的方法和功能 . 任意能够满足协议要求的类型都被成为遵循了这个协议 1.协议的语法 协议的关键字:protocol 协议的语法: protocol Pro1{ //这里定义属性或者方法 } 要使一个类或者结构体遵循某个协议 ,

Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更改实现类或参数信息时,只需要修改配置文件即可,这种方法在上例的基础上更进一步的降低了类与类之间的耦合.我们还可以对某对象所需要的其它对象进 行注入,这种注入都是在配置文件中做的,Spring的IOC的实现原理利用的就是Java的反射机制, Spring还充当了工厂的角色,我们不需要自己建立工厂类.S

详解 Java 中的三种代理模式

代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.      这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法.      举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎

详解 Java 中的三种代理模式!

作者:岑宇 https://www.cnblogs.com/cenyu/p/6289209.html 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法. 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的

SSH 概念及使用详解

注意:转载请注明出处:http://www.programfish.com/blog/?p=124 SSH 基本概念 SSH 英文全称是secure shell,字面意思:安全的shell. SSH协议由IETF(Internet Engineering Task Force)的Network Working Group所制定,建立在应用层和传输层基础上相对可靠,专为远程登录会话和其他网络服务提供安全性的协议. 说其是Secure的很重要一个原因是ssh会对远程登陆时的认证信息和远程执行的命令进

http代理之HTTP协议详解

http代理之HTTP协议详解 2014-01-03 23:36 来源: 有代理ip资源网 点击:1675 次 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基本协议相当重要, 因为它让我们理解了Web应用程序的内部工作. 本文将对HTTP协议进行详细的实例讲解,内容较多,希望大家耐心看.也希望对大家的开发工作或者测试工作有所帮助.使用Fiddler工具非常方便地捕获HTTP Requ