以前有各种躲避运营商流量计费的方法,称之为 “免流”,但是各大运营商也不是待宰的羔羊,也会通过技术手段进行过滤和遮蔽,这样就导致了极大一部分 “免流” 技术只是在某些情况下可以使用,比如 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