Valid_Cat

修改Openvpn使得VPN能建立在Cloudflare上

各类科学上网的工具大都使用HTTP或者SOCK5代理来接收流量,这种方式仍然可以被“不想被代理”的程序绕过,达不到真正的‘全局代理’效果。要让所有程序都走代理,也有很多种方法,甚至可以整个软路由之类的硬件。但回到VPN设计的初衷:

虚拟私人网络(英语:virtual private network,缩写:VPN)是常用于连接中、大型企业或团体间私人网络的通讯方法。它利用隧道协议(Tunneling Protocol)来达到发送端认证、消息保密与准确性等功能。

隧道是VPN设计的关键,对于很多并非用于科学上网的VPN程序,接收全局流量常用的是 虚拟网卡(Tun/Tap设备),这样的虚拟网卡是对应用层透明的,也就是说应用并不知道它数据发送给的是真实的物理网卡还是虚拟网卡。使用虚拟网卡技术的有Openvpn、Softether以及系统内建的L2TP/PPTP等,主要特征是使用这类程序会在系统中新建一块网卡。 而很多并非用于科学上网的VPN程序常常很快被墙(block),经过测试使用Openvpn同一端口传输大量数据持续3天端口被block,原因是协议特征太明显了。解决这种方法要不是用v2ray这种工具强加密和混淆,要不就是有足够的IP地址。而前者据说在大流量的情况下即使加密也会被block,未测试。

故基于以下考虑决定对Openvpn源码进行修改

  1. 也尝试过自己开发一个VPN,但是对于Windows上的虚拟网卡操作不熟悉,找不到很详细的manual,只实现了Linux上的VPN(万物皆文件yyds)
  2. ovpn使用的是虚拟网卡,能在底层代理系统上的所有流量
  3. ovpn是开源的,便于研究具体实现
  4. Cloudflare有任播(Anycast)技术,且IP地址足够多不怕被ban
  5. Cloudflare 支持Websocket,可以建立长连接,用于建立隧道也合适 另:移动广州出口能直连香港的Cloudflare服务器,延迟低丢包少

1.png

6.校园网免流,涉及学校网关某个ACL规则,具体详情不多说了。

参考标准和资料:

  1. IETF RFC6455 The WebSocket Protocol https://datatracker.ietf.org/doc/html/rfc6455
  2. greensea/OpenVPN-2.2.2-obfs.patch 作者也是广西人 The obfs patch obsfucate OpenVPN traffic, make it looks like random traffic. The obfs patch add two options for OpenVPN. –obfs-salt is a secret to generate the input XOR stream. To enable the obfs patch, this options must be set. –obfs-padlen is a positive integer max to 255. This option tells obfs patch to padding random content to each packet with random length between 0 to num.

https://gist.github.com/greensea/4372285

具体修改:

  1. 添加了在可选调用参数里cloudflare代理选项 2.png
  2. 模仿了标准Websocket握手操作在连接过程中
  3. 服务端使用Python处理后通过127.0.0.1传递给服务器上的ovpn(localhost不过网卡)因为对于服务端的代码还没有摸透不敢轻易动,这种屎山一动就一大堆Fatal Error,怕了。 3.png效果:
  4. 连接 4.png
  5. 观察隧道效果 5.png 说明:修改路由表前IP是107段,添加一条路由到隧道再看IP已变104段(服务端ip) 感受:
  6. 还是要多看开源项目的代码看看别人怎么写的,这回研究ovpn源码看见了一些我之前没用过的好用写法。
  7. 对于TCP拥塞控制,FEC纠错这种还需要研究。

Release

准备放到Github上