根据实践,pptp、IPsec甚至OpenVPN等kexue上网法已经无法顺利翻越GFW。通过抓包可知,GFW会将pptp的握手期间的ack包吞掉,导致本地一直无法收到服务器端的响应。而OpenVPN也是类似的情况。目前比较可行的上网法就是将OpenVPN的数据包进行混淆,封装成其它协议发送到服务端再解释,这时候就需要用到Obfsproxy。基本原理如下图:
笔者的软硬件环境如下:
Server:
- 东京机房VPS
- CentOS 6.5 32-bit
Client:
- Win 8.1
基本步骤如下:
- Server端安装Obfsproxy
- Server端安装OpenVPN
- Client端安装Obfsproxy
- Client端安装OpenVPN
基本软件环境要求:
Server端:
- Python2.7或以上版本(Obfsproxy需要Python2.7或以上的支持),对于CentOS 6.5或其它无法通过官方途径升级Python的系统,可以参考CentOS 下升级Python这篇文章。对于其中部分Python2.7的版本(Python 2 <2.7.9),请确保pip已正常安装及正常运行。
- OpenSSL及OpenSSL-devel。
Server端安装Obfsproxy:
- 安装Obfsproxy
pip2 install obfsproxy
此处使用pip还是pip2视具体系统环境而定。
- 配置Obfsproxy
将以下命令/usr/local/bin/obfsproxy obfs2 --dest=127.0.0.1:[server端openvpn所用端口号] server 0.0.0.0: [server端obfsproxy所用端口号]
添加到/etc/rc.local中,以便开机启动obfsproxy。其中“/usr/local/bin/obfsproxy”应替换成具体运行环境中obfsproxy的绝对路径,否则可能无法开机启动。
Server端安装OpenVPN:
- 运行命令:
-
yum install epel-release
-
- 安装OpenVPN
-
yum install openvpn easy-rsa -y
首先安装openvpn和easy-rsa。其中,easy-rsa用于生成安全密钥。
-
- 配置OpenVPN
将OpenVPN配置文件样板复制到OpenVPN目录下:-
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn
编辑/etc/openvpn/server.conf:
port [server端openvpn所用端口号] #使用的端口号,默认为1194,可以不更改 proto tcp #obfsproxy只支持tcp协议,因此只能设置为tcp dev tun ca ca.crt #证书、密钥文件 cert server.crt key server.key dh dh2048.pemserver 192.168.200.0 255.255.255.0 push "redirect-gateway def1 bypass-dhcp" #以下命令用于设置客户端DNS,是具体情况而定,一般设置为Google DNS push "dhcp-option DNS 8.8.4.4" push "dhcp-option DNS 8.8.8.8" keepalive 20 120 #设置openvpn运行后权限 user nobody group nobody persist-key persist-tun status openvpn-status.log verb 5
-
- 生成密钥与证书
创建密钥存放目录:mkdir -p /etc/openvpn/easy-rsa/keys
将生成脚本复制到上面建立的目录中:
cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa
编辑生成脚本的基本环境变量(非开放VPN可忽略大多数参数):
vi /etc/openvpn/easy-rsa/vars
将KEY_NAME编辑为server
同步OpenSSL配置:cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
开始生成:
cd /etc/openvpn/easy-rsa source ./vars ./clean-all ./build-ca ./build-key-server server ./build-dh
将证书与密钥移动到openvpn目录下:
cd /etc/openvpn/easy-rsa/keys cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
生成Client端证书:
cd /etc/openvpn/easy-rsa ./build-key client
- 路由设置
添加iptables规则(以下命令仅做参考,请确保openvpn及obfsproxy所使用的端口不被iptables禁止):iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth0 -j MASQUERADE
保存,重启刷新规则:
service iptables save service iptables restart
设置允许转发:
vi /etc/sysctl.conf修改:ipv4.ip_forward = 1 刷新:sysctl –p
开启openvpn服务及设置其开机启动service openvpn start chkconfig openvpn on
- 将证书与密钥复制到客户端
需要复制的文件有:/etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn/easy-rsa/keys/client.crt /etc/openvpn/easy-rsa/keys/client.key
至此,服务端配置工作完成。进入客户端配置。
Client端安装Obfsproxy
- 下载Windows版obfsproxy
- 配置obfsproxy
运行命令:obfsproxy.exe obfs2 socks 127.0.0.1: [client端obfsproxy所用端口号]
保持运行此程序。
- *将obfsproxy配置成Windows服务
可以使用C#编写一个基本服务来启动obfsproxy,编写方法此处不累述。
Client端安装OpenVPN
- 下载OpenVPN for Windows
- 配置client端:
新建ovpn文件并编辑内容如下:client dev tun proto tcp remote [server地址] [server端obfsproxy所用端口号] resolv-retry infinite nobind persist-key persist-tun verb 5 ca ca.crt cert client.crt key client.key socks-proxy-retry socks-proxy 127.0.0.1 [client端obfsproxy所用端口号]
- 将刚才下载的证书、密钥与此配置文件移动到OpenVPN安装目录下的config文件夹
- 使用OpenVPN GUI进行连接