根據實踐,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進行連接
實例配置:
[root@east-usa01 ~]# cat /etc/openvpn/server.conf |grep -v "^#"|grep -v "^;"|grep -v "^$" local 47.****.224 port 1194 proto udp dev tun ca ca.crt cert huanqiuvpn.crt key huanqiuvpn.key # This file should be kept secret dh dh1024.pem server 10.8.200.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.4.4" push "dhcp-option DNS 8.8.8.8" duplicate-cn keepalive 10 120 comp-lzo persist-key persist-tun status openvpn-status.log verb 3