最近墙抽风得比较厉害,OpenVPN 几乎全部阵亡,我自己架设的不用于翻墙用途的 OpenVPN 也都一并阵亡了。我只是用 OpenVPN 来组建一个虚拟局域网,以便从外网连接到我那被糟糕的移动宽带挡在内网里面的机器而已啊,这种人畜无害的服务都被咔嚓掉了,墙这次抽风抽得不轻。不过听说 有北邮的学生参与了墙的开发,考虑到天朝大学生的水平,出现这种情况也就不足为奇了。
虽然说我可以使用其他的虚拟专用网技术,但是比较起来还是 OpenVPN 更容易配置和方便部署。所以决定还是继续使用 OpenVPN,暂时不考虑更换到其他的虚拟专用网技术去。
据目前观察到的情况,墙只是会根据 OpenVPN 进行 TLS 握手时候的特征对特定的端口进行封杀,如果 OpenVPN 不使用 TLS 握手的话,墙就不会认出 OpenVPN 了。不过如果不使用 TLS 握手的话,OpenVPN 就只能配置成一对一的网络,没法组建局域网,故使用 TLS 是必须的(所以说你这墙放着只能用于翻墙用途的非 TLS 方式不管而去对可以作为正常应用的 TLS 协议下手你是要想怎样)。既然这样,那就只能对 TLS 握手过程进行一些模糊了。考虑到即使是握手之后的流量也会带有 OpenVPN 的表示,干脆顺便把握手之后的流量也一起做个模糊处理算了(好吧其实真正的原因修改代码的时候对所有流量进行处理要比仅仅对 TLS 握手流量进行处理更简单-_-b)。
于是这个补丁就出现了:
OpenVPN-2.2.2-obfs.patch <– 这个版本的 TCP 和 UDP 模式均无问题,请使用此版本.
补丁文件的内容发到了 gist 上: https://gist.github.com/4372285
使用说明
从 OpenVPN 官方下载 2.2.2 源码包(http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz,from http://openvpn.net/index.php/download/community-downloads.html或http://openvpn.net/index.php/open-source/downloads.html),并解压,
将此补丁保存到解压后的目录内,然后执行
patch < openvpn-2.2.2-obfs.patch
(如果要卸载补丁,命令为
patch -R < openvpn-2.2.2-obfs.patch)
另外建议手工修改源码目录中的 version.m4 文件,将 OpenVPN 的版本号 2.2.2 改为 2.2.2-obfs,以便和原始的 OpenVPN 区分.
之后按正常的编译安装步骤进行:
./configure
make
make install
本补丁虽然使用了类似加密的方法对流量进行处理,但是我无法保证这种类似加密算法的安全性,不要尝试使用本补丁对流量进行加密。要对流量进行加密,请使用 OpenVPN 自带的加密功能。
补丁原理
本补丁在 OpenVPN 发送包之前以及接收包之后对数据包进行混淆,混淆方法是将数据包与一个混淆密钥进行异或操作。
混淆之后,OpenVPN 的流量看上去就是完全无意义的随机流量了,但此时还有包大小信息是可识别的。为了把包大小信息也一并混淆,可以在包末尾增加一些随机长度的随机内容,这样包长度信息就也被混淆了。
在单个连接流量较小的情况下,OpenVPN 的 ping 包是按照固定时间间隔发送的,这同样也是一个有用的信息。本补丁未针对此情况进行数据包混淆处理,用户可以通过在服务器端和客户端都禁用 OpenVPN 的 keepalive 及 ping 系列选项来避免此类信息被识别。
截止到写这篇文章为止,我已经在两上运行这个补丁超过 5 天时间,暂时还没有观察到墙有任何反应,这比使用原版 OpenVPN 的时候运行不到一天就被墙的情况强多了。期间只出现了一个小插曲,其中一台服务器的 IP 地址被局部墙掉,主要是在非电信线路上被墙,不过这有可能和我在此期间在手机上使用联通网络去访问这台服务器的 SSH 引起的,此猜测有待证实。另外和这台服务器上 OpenVPN 产生的流量主要都是和一台位于电信宽带上的服务器进行的,估计这台服务器局部被墙和 OpenVPN 的关系不大。
也就是说到目前为止,这个补丁运行得还不错,至少没看到墙有什么实质性的动静。不过既然我把这个补丁发出来了,如果日后有其他人使用的话,到时候墙会作出何种反应就不得而知了,总之保持观察然后根据其反应作出调整即可。
最后要黑一下 Windows。我写这个补丁花了两天时间,在 Windows 上研究怎样编译 OpenVPN 又花了另外两天时间。在 Windows 上研究编译方法的时间竟然和我写补丁的时间一样长!于是得出结论:企图在 Windows 下进行开发=自虐。
from http://web.archive.org/web/20150601181445/https://www.gsea.com.cn/blog/topic/traffic-obsfucate-patch-for-openvpn/
------------------------------------
本人测试成功,服务器端的配置文件和客户端的配置文件无需添加额外的参数。 添加了的话,反而会连不上openvpn server。
建议在xen vps上使用。在openvz vps上使用的话,服务器端的 openvpn进程容易退出,要时时刻刻开着putty,这样就比较麻烦.
(这几天测试,此法也失效了。 建议用obfsproxy+openvpn,我一直在用。参见
http://briteming.blogspot.co.uk/2013/02/bypassing-censorship-by-obfuscating.html ( 文中蓝色字体部分测试成功,来自 https://community.openvpn.net/openvpn/wiki/TrafficObfuscation)
其他方法:
http://briteming.blogspot.co.uk/2013/02/obfsproxyopenvpn.html
虽然说我可以使用其他的虚拟专用网技术,但是比较起来还是 OpenVPN 更容易配置和方便部署。所以决定还是继续使用 OpenVPN,暂时不考虑更换到其他的虚拟专用网技术去。
据目前观察到的情况,墙只是会根据 OpenVPN 进行 TLS 握手时候的特征对特定的端口进行封杀,如果 OpenVPN 不使用 TLS 握手的话,墙就不会认出 OpenVPN 了。不过如果不使用 TLS 握手的话,OpenVPN 就只能配置成一对一的网络,没法组建局域网,故使用 TLS 是必须的(所以说你这墙放着只能用于翻墙用途的非 TLS 方式不管而去对可以作为正常应用的 TLS 协议下手你是要想怎样)。既然这样,那就只能对 TLS 握手过程进行一些模糊了。考虑到即使是握手之后的流量也会带有 OpenVPN 的表示,干脆顺便把握手之后的流量也一起做个模糊处理算了(好吧其实真正的原因修改代码的时候对所有流量进行处理要比仅仅对 TLS 握手流量进行处理更简单-_-b)。
于是这个补丁就出现了:
OpenVPN-2.2.2-obfs.patch <– 这个版本的 TCP 和 UDP 模式均无问题,请使用此版本.
补丁文件的内容发到了 gist 上: https://gist.github.com/4372285
使用说明
从 OpenVPN 官方下载 2.2.2 源码包(http://swupdate.openvpn.org/community/releases/openvpn-2.2.2.tar.gz,from http://openvpn.net/index.php/download/community-downloads.html或http://openvpn.net/index.php/open-source/downloads.html),并解压,
将此补丁保存到解压后的目录内,然后执行
patch < openvpn-2.2.2-obfs.patch
(如果要卸载补丁,命令为
patch -R < openvpn-2.2.2-obfs.patch)
另外建议手工修改源码目录中的 version.m4 文件,将 OpenVPN 的版本号 2.2.2 改为 2.2.2-obfs,以便和原始的 OpenVPN 区分.
之后按正常的编译安装步骤进行:
./configure
make
make install
本补丁虽然使用了类似加密的方法对流量进行处理,但是我无法保证这种类似加密算法的安全性,不要尝试使用本补丁对流量进行加密。要对流量进行加密,请使用 OpenVPN 自带的加密功能。
补丁原理
本补丁在 OpenVPN 发送包之前以及接收包之后对数据包进行混淆,混淆方法是将数据包与一个混淆密钥进行异或操作。
混淆之后,OpenVPN 的流量看上去就是完全无意义的随机流量了,但此时还有包大小信息是可识别的。为了把包大小信息也一并混淆,可以在包末尾增加一些随机长度的随机内容,这样包长度信息就也被混淆了。
在单个连接流量较小的情况下,OpenVPN 的 ping 包是按照固定时间间隔发送的,这同样也是一个有用的信息。本补丁未针对此情况进行数据包混淆处理,用户可以通过在服务器端和客户端都禁用 OpenVPN 的 keepalive 及 ping 系列选项来避免此类信息被识别。
截止到写这篇文章为止,我已经在两上运行这个补丁超过 5 天时间,暂时还没有观察到墙有任何反应,这比使用原版 OpenVPN 的时候运行不到一天就被墙的情况强多了。期间只出现了一个小插曲,其中一台服务器的 IP 地址被局部墙掉,主要是在非电信线路上被墙,不过这有可能和我在此期间在手机上使用联通网络去访问这台服务器的 SSH 引起的,此猜测有待证实。另外和这台服务器上 OpenVPN 产生的流量主要都是和一台位于电信宽带上的服务器进行的,估计这台服务器局部被墙和 OpenVPN 的关系不大。
也就是说到目前为止,这个补丁运行得还不错,至少没看到墙有什么实质性的动静。不过既然我把这个补丁发出来了,如果日后有其他人使用的话,到时候墙会作出何种反应就不得而知了,总之保持观察然后根据其反应作出调整即可。
最后要黑一下 Windows。我写这个补丁花了两天时间,在 Windows 上研究怎样编译 OpenVPN 又花了另外两天时间。在 Windows 上研究编译方法的时间竟然和我写补丁的时间一样长!于是得出结论:企图在 Windows 下进行开发=自虐。
from http://web.archive.org/web/20150601181445/https://www.gsea.com.cn/blog/topic/traffic-obsfucate-patch-for-openvpn/
------------------------------------
本人测试成功,服务器端的配置文件和客户端的配置文件无需添加额外的参数。 添加了的话,反而会连不上openvpn server。
建议在xen vps上使用。在openvz vps上使用的话,服务器端的 openvpn进程容易退出,要时时刻刻开着putty,这样就比较麻烦.
(这几天测试,此法也失效了。 建议用obfsproxy+openvpn,我一直在用。参见
http://briteming.blogspot.co.uk/2013/02/bypassing-censorship-by-obfuscating.html ( 文中蓝色字体部分测试成功,来自 https://community.openvpn.net/openvpn/wiki/TrafficObfuscation)
其他方法:
http://briteming.blogspot.co.uk/2013/02/obfsproxyopenvpn.html