以前有各種躲避運營商流量計費的方法,稱之為 “免流”,但是各大運營商也不是待宰的羔羊,也會通過技術手段進行過濾和遮蔽,這樣就導致了極大一部分 “免流” 技術只是在某些情況下可以使用,比如 QQ 微信聊天可以,但是優酷視訊就不行。
然後最近又有了一種新的 “免流” 技術,稱之為 “雲免流” 。聽起來很高大上,其實原理很簡單。
各大運營商為了方便使用者進行流量查詢、繳費等操作,設定了當使用者瀏覽一部分運營商自己的網站時不需要耗費流量,而各大運營商識別使用者訪問的網址是否為這部分網址時,出現了問題,導致識別錯誤,主要是這個 X-Online-Host 欄位上的問題。
當使用者通過 OpenVPN 免流時,在你的 VPS 和移動裝置之間打通一個隧道,你的所有互聯網請求都先經過 OpenVPN 傳給 VPS,然後 VPS 把你請求的東西拿到之後又通過 OpenVPN 傳回來。免流的關鍵就在於,每次利用 OpenVPN 發起互聯網請求之前,都要對請求頭進行偽裝,加上 X-Online-Host 欄位,讓運營商認為你請求的是運營商自己的免流量網站。
wooyun 上有相關的討論:中國聯通移動電信三大運營商流量計費系統漏洞
瞭解了原理就很好辦了,首先就是在 VPS 上搭建 OpenVPN 站羣服務器端,鑑於速度需要,最好是國內的 VPS 。
安裝 OpenVPN
這裏以 Ubuntu 14.04 為例。
首先安裝 OpenVPN 和 easy-rsa 。
sudo apt-get -y install openvpn libssl-dev openssl easy-rsa

安裝完成好檢視 OpenVPN 版本。
openvpn –version

官方源裏的最高版本目前為 2.3.2,這個版本號,建議記住。確認版本無誤後,我們開始製作需要的證書檔案。
製作 CA 證書
首先,在/etc/openvpn/目錄下建立 easy-rsa 資料夾。
sudo mkdir /etc/openvpn/easy-rsa/

然後把/usr/share/easy-rsa/目錄下的所有檔案全部複製到/etc/openvpn/easy-rsa/下。
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

當然,我們也可以直接在/usr/share/easy-rsa/製作相關的證書,但是為了後續的管理證書的方便,我們還是把 easy-rsa 放在了 openvpn 的啓動目錄下。另外,由於我們現在使用的是 ubuntu 系統,所以我們必須切換到 root 使用者下才能製作相關證書,否則 easy-rsa 會報錯。如果是 centos 系統,則不存在此問題。
sudo su

開始製作 CA 證書之前,我們還需要編輯 vars 檔案。
sudo vi /etc/openvpn/easy-rsa/vars

export KEY_COUNTRY=” 國家 CN”
export KEY_PROVINCE=” 省份 BJ”
export KEY_CITY=” 城市 Beijing”
export KEY_ORG=” 機構 Random”
export KEY_EMAIL=” 你的郵箱 abc@abc.com”
export KEY_OU=” 姓名 Tink”
export KEY_NAME=”vpntink”
vars 檔案主要用於設定證書的相關組織資訊,具體內容可以根據自己的實際情況自行修改。其中 export KEY_NAME=”vpntink” 這個要記住下,我們下面在製作 Server 端證書時,會使用到。
然後使用 source vars 命令使其生效。
source vars

開始製作 CA 證書。
./clean-all (執行 clean-all 命令會刪除,當前目錄下的 keys 資料夾。)
./build-ca

一路按回車鍵即可。製作完成後,我們可以檢視 keys 目錄。
ll keys/

如果以上操作無誤的話應該可以看到已經生成了 ca.crt 和 ca.key 兩個檔案,其中 ca.crt 就是我們所需要的 CA 證書。至此,CA 證書製作完畢。現在把該 CA 證書的 ca.crt 檔案複製到 openvpn 的啓動目錄/etc/openvpn 下。
cp keys/ca.crt /etc/openvpn/

製作 Server 端證書
CA 證書製作完成後,我們現在開始製作 Server 端證書。
./build-key-server vpntink(這裏的 vpntink,就是我們前面 vars 檔案中設定的 KEY_NAME)
ll keys/

一路回車即可。可如果以上操作無誤的話應該可以看到生成的 vpntink.crt 、 vpntink.key 和 vpntink.csr 三個檔案。其中 vpntink.crt 和 vpntink.key 兩個檔案是我們所需要的。現在再為站羣服務器生成加密交換時的 Diffie-Hellman 檔案。
./build-dh
ll keys/

一路回車。正常情況下應該可以看到已經生成的 dh2048.pem 檔案。
以上操作完畢後,把 vpntink.crt 、 vpntink.key 、 dh2048.pem 複製到/etc/openvpn/目錄下。
cp keys/vpntink.crt keys/vpntink.key keys/dh2048.pem /etc/openvpn/

至此,Server 端證書就製作完畢。
製作 Client 端證書
Server 端證書製作完成後,我們現在開始製作 Client 端證書。
./build-key tinksvpn
ll keys/

還是一路回車。上述命令中的 tinksvpn,是客户端證書的名稱。這個是可以進行自定義的。
正常情況下應該可以看到已經生成的 tinksvpn.csr 、 tinksvpn.crt 和 tinksvpn.key 這個三個檔案。其中 tinksvpn.crt 和 tinksvpn.key 兩個檔案是我們要使用的。
至此,Client 端證書就製作完畢。
配置 Server 端
所有證書製作完畢後,我們現在開始配置 Server 端。配置 Server 端所需的檔案,可以從 openvpn 自帶的模版中進行復制。
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
cd /etc/openvpn/
gzip -d server.conf.gz

現在我們來修改 server.conf 檔案,下面是我的 server 端配置 (只有關鍵行) 。
vi /etc/openvpn/server.conf

port 1194
proto tcp
dev tun
ca ca.crt
cert vpntink.crt
key vpntink.key
dh dh2048.pem
server 10.18.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 114.114.114.114”
push “dhcp-option DNS 114.114.115.115”
duplicate-cn
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
接下來配置流量轉發。
iptables -t nat -A POSTROUTING -s 10.18.0.0/24 -o eth0 -j MASQUERADE (eth0 根據你的網絡卡修改)
echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf

配置檔案修改完畢後,我們可以嘗試啓動 OpenVPN 。
/etc/init.d/openvpn start

如果沒有報錯,那麼服務端已經 ok 了。
配置 Client 端
利用各種方法複製這三個檔案到本地電腦中,比如利用 python 起一個臨時的 web 服務,或者用 scp 傳回來。
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/tinksvpn.crt
/etc/openvpn/easy-rsa/keys/tinksvpn.key

用記事本分別開啓這三個檔案,同時新建一個 client.ovpn,內容如下。
client
dev tun
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
comp-lzo
verb 3
remote 站羣服務器 IP 1194

ca.crt 的內容複製到這裏


tinksvpn.crt 的內容複製到這裏


tinksvpn.key 的內容複製到這裏

########免流程式碼 ########
http-proxy-option EXT1 “POST http://rd.go.10086.cn”
http-proxy-option EXT1 “GET http://rd.go.10086.cn”
http-proxy-option EXT1 “X-Online-Host: rd.go.10086.cn”
http-proxy-option EXT1 “POST http://rd.go.10086.cn”
http-proxy-option EXT1 “X-Online-Host: rd.go.10086.cn”
http-proxy-option EXT1 “POST http://rd.go.10086.cn”
http-proxy-option EXT1 “Host: rd.go.10086.cn”
http-proxy-option EXT1 “GET http://rd.go.10086.cn”
http-proxy-option EXT1 “Host: rd.go.10086.cn”
http-proxy 10.0.0.172 80
########免流程式碼 ########
其中需要修改站羣服務器 IP 為自己的站羣服務器 IP,ca 、 cert 、 key 的內容需要按上面那三個檔案的內容完整的複製進去。免流程式碼每個地區每個運營商都不盡相同,需要自己不斷嘗試,找到最適合自己地區的那個。
下面是一些常用的免流程式碼。
#聯通
http-proxy-retry
http-proxy 10.0.0.172 80
http-proxy-option EXT1 “X-Online-Host: wap.10010.com”
http-proxy-option EXT2 “Host: wap.10010.com”
#電信
http-proxy-retry
http-proxy 10.0.0.200 80
http-proxy-option EXT1 “X-Online-Host: ltetp.tv189.com”
http-proxy-option EXT2 “Host: ltetp.tv189.com”
#移動-預設
http-proxy-retry
http-proxy 10.0.0.172 80
http-proxy-option EXT1 “POST http://rd.go.10086.cn”
http-proxy-option EXT1 “GET http://rd.go.10086.cn”
http-proxy-option EXT1 “X-Online-Host: rd.go.10086.cn”
http-proxy-option EXT1 “POST http://rd.go.10086.cn”
http-proxy-option EXT1 “X-Online-Host: rd.go.10086.cn”
http-proxy-option EXT1 “POST http://rd.go.10086.cn”
http-proxy-option EXT1 “Host: rd.go.10086.cn”
http-proxy-option EXT1 “GET http://rd.go.10086.cn”
http-proxy-option EXT1 “Host: rd.go.10086.cn”
#移動-彩信
http-proxy-retry
http-proxy 10.0.0.172 80
http-proxy-option EXT1 “POST http://mmsc.monternet.com”
http-proxy-option EXT1 “GET http://mmsc.monternet.com”
http-proxy-option EXT1 “X-Online-Host: mmsc.monternet.com”
http-proxy-option EXT1 “CMCC: mmsc.monternet.com”
至此,Client 端的配置檔案製作完成。
最後,你需要在你的手機上下載安裝 OpenVPN 的 Android 版或者 iOS 版 (需要美區 AppleID),然後將這個 client.ovpn 匯入到手機中,並用 OpenVPN 開啓,然後連線就 OK 了。
文章來源於互聯網博客網站,原博文地址:http://www.gaojinan.com/vps-openvpn-china-telecom-unicom-mobile-mianliu-ml.html