obfstunnel 的工作原理和使用方法及其它

obfstunnel 是基于端口转发的流量混淆工具。以前我弄了一个 OpenVPN 的流量混淆补丁,但是补丁毕竟是补丁,使用起来很不方便,每次都要自己编译,版本升级的话又要重新编译,而且也不能使用官方的软件源了。为了解决这些问题,我想有一个一劳永逸的方法,于是 obfstunnel 就出现了。

在提供端口转发的同时对流量进行处理,不仅不需要修改源代码了,而且还能直接支持 SSH 以及各种各样的协议。设计的时候我还预留了可以扩展流量混淆方法的接口。这样以后就可以很方便地开发出各种各样的流量混淆方法插件,比如说把流量伪装成 Skype 的流量啊,伪装成 HTTP 的流量啊,甚至伪装成 DNS 的流量。

目前 obfstunnel 托管在 GitHub 上: https://github.com/greensea/obfstunnel

截止到写这篇文章为止,我给 obfstunnel 内建了两个流量混淆方法,一个是异或方法,就是简单地将数据包中的每个字节和一个预定义的字节进行异或运算。另一个方法是 random 方法,这个方法会使用一个随机生成的初始化向量来编码数据包中的内容,并在数据包末尾添加随机长度的数据,这样就能让数据流看上去是随机的数据。其实 random 方法和我在 OpenVPN 流量混淆补丁中用的方法差不多,只是在 OpenVPN 上进行编码的方法更加安全而已。

工作原理

下面这个图是 obfstunnel 的工作原理,这是按照下文中的例子来画的:

obfstunnel-principle

首先需要在客户端和服务器端各自运行 obfstunnel,接着用户从客户端连接本机的 obfstunnel,本机的 obfstunnel 将数据包处理后,发送给服务器端的 obfstunnel,服务器端的 obfstunnel 对收到的数据包进行解码,然后转发给远程服务器,也就是用户实际想要连接到的服务器。当服务器有数据包需要发送给用户时,数据包就会按照这个过程相反的顺序传输给用户。

其实这和端口转发的原理是基本一致的,只不过是在转发数据包之前多做了一步对数据包进行混淆处理的工作而已。

例子

假设用户的想要通过 SSH 连接到一台远程服务器,但是中间隔着一个防火墙,防火墙阻止了 SSH 的流量,所以用户没法直接连接到服务器。这时候使用 obfstunnel 就可以绕过防火墙了。

在这个例子中,使用 random 来对 SSH 流量进行混淆,服务器的 IP 地址是 1.2.3.4。

首先在服务器端以 SERVER 模式运行 obfstunnel,并在 2000 端口进行监听。运行下面的命令:

obfstunnel -s 2000 -t localhost:22 -m random,padlen=100,maxlen=1400

这几个参数的意思如下:

-s 2000 以 SERVER 模式运行,并在 2000 端口进行监听;

-t localhost:22 将数据转发到 localhost:22。在这个例子中,就是将数据包转发到本地的 SSH 服务上;

-m random,padlen=100,maxlen=1400 用 -m 指定混淆方法以及混淆参数,不同的混淆方法有不同的参数。padlen=100 意思是在数据包后添加长度不超过 100 字节的随机长度的数据,已达到改变包大小的目的;maxlen=1400 的意思是,保证最后得到的数据包的大小不超过 1400 字节,也就是说,如果包大小超过 1400 字节的话,就不会在数据包后面添加随机长度的随机数据了。

然后在客户端以 CLIENT 模式运行 obfstunnel。我们指定让 obfstunnel 在 22 端口监听,运行下面的命令:

obfstunnel -c 22 -t 1.2.3.4:2000  -m random,padlen=100,maxlen=1400

-c 22 的意思是让 obfstunnel 以 CLIENT 模式运行,并在 22 端口进行监听。这样用户就可以连接本机的 22 端口来连接到远程服务器了;

-t 1.2.3.4:2000让 obfstunnel 将流量转发到服务器上,别忘了刚刚我们已经在服务器上让 obfstunnel 监听在 2000 端口了。

客户端使用的混淆方法及参数必须和服务器上的保持一致,否则会导致无法连接。

现在服务器端和客户端两边的配置都已经完成,用户只需要连接到 localhost:22 就可以访问到服务器了。

其他

其实到目前为止 obfstunnel 还只是草稿版,还有很多功能没有完成。现在的 obfstunnel 仅仅支持 TCP 流量转发。下面是未来需要完成的功能:

  • 完成对 UDP 流量的转发处理
  • 完成动态加载流量混淆插件的功能
  • 增加 IPv6 的支持

就目前我测试的情况来看,效果不错。唯一存在的问题是转发 SSH 流量的时候,终端的屏显响应速度有点慢,不过吞吐量倒是不受影响,估计是因为 SSH 的数据包被 obfstunnel 处理之后 TCP 的 PUSH 标志被干掉了,所以就会存在屏显反应迟钝而数据吞吐量不受影响的情况。

本文发表于 技术向,并添加了 , , , 标记。保存永久链接到书签。

发表评论

电子邮件地址不会被公开。