在CM7/9上使用OpenVPN

最近把Defy+从CM9刷回了CM7,由于CM9实在是太吃内存了。另外一个原因就是ICS对VPN的支持实在太差(见https://code.google.com/p/android/issues/detail?id=23124),很多人都报告L2TP在ICS上无法正常连接。

CM7自带OpenVPN的客户端,CM9必须另外安装。CM9的客户端可以到这里下载:https://play.google.com/store/apps/details?id=de.blinkt.openvpn,只支持4.0+,不支持tap模式(服务端用这个很少,一般是tun)。这个客户端是目前Android上最好的第三方OpenVPN客户端,支持直接读入ovpn和证书文件,几乎100%的免配置。

OpenVPN for Android在ICS上唯一需要注意的是可能需要选择Fix permissions for /dev/tun(需要root),至少在我的Defy+ CM9上面需要这样选择。据说三星的某些ROM根本没有这个文件,那么很遗憾无法使用OpenVPN。

CM7的话需要先生成p12文件(如果服务端使用的是客户端/服务器双证书认证),步骤如下:

准备好服务器CA证书(ca.crt),客户端证书(client.crt)和客户端密钥(client.key),在linux下运行

openssl pkcs12 -export -in client.crt  -inkey client.key -certfile ca.crt -name magic -out client.p12

然后把这个文件拷到SD卡根目录,在Android上通过”设置”-“位置与安全”-“从SD卡安装”来安装证书。

如果是用户名/密码认证的话则只需要安装CA证书,直接把ca.crt拷到SD卡根目录即可安装。

然后在”无线与网络设置”-“虚拟专用网设置”-“添加虚拟专用网”里面选择OpenVPN,按照服务器提供的ovpn文件设置即可。如果是用户名/密码认证需要在”高级”-“额外参数”里面添加:

--ns-cert-type server --persist-tun --persist-key --nobind --resolv-retry infinite --tun-mtu 1500

如果服务器不是使用的默认AUTH算法(CM7客户端默认是SHA1)的话(在ovpn里面auth一行会定义),还需要加上

--auth algorithm

algorithm替换为所使用的算法。否则在服务器端log里会看到类似的条目:

WARNING: 'auth' is used inconsistently, local='auth alg', remote='auth SHA1'

本文参考:

http://lgallardo.com/en/2011/09/12/openvpn-en-android-cyangenmod/