这两天为了让手头的山寨Android tablet Ten3翻墙,折腾了半天。虽然最后还是没能成功,但对伟大的GFW和如何翻墙,有了更多的认识。
翻墙之前的首先要了解GFW是如何干扰网络连接的,具体可见 GFW封锁网络的几种常用方法。干扰大体可以分为DNS干扰,IP封锁,TCP连接干扰,SSL干扰。翻墙的方法虽然千差万别,但基本思路都是一样:建立本地和国外服务器的加密通道,将本地的DNS查询连接,HTTP/HTTPS中转至国外服务器。对于DNS服务,除了加密中转通道,还需要设置正确的DNS服务器(like Google or opendns)来解决DNS劫持问题。
从上面可以看到,利用国外服务器建立加密中转通道是翻墙的关键。TCP/IP连接是分层架构,因此较高层上的加密中转只能适应部分程序。openvpn/l2tp/pptp都是较低层面的加密连接,可以让所有的本地连接加密中转。SSH的socket proxy可以加密中转http/https的接连。需要注意的是http proxy并不能处理ftp和https的中转。https的中转需要socket proxy来处理。
除了国外服务器,加密中转的另外一个问题就是如何将本地连接转发至加密通道上。openvpn/l2tp/pptp在内核空间增加了一个network adapter,所以只需要通过路由表就可以进行转发。对于http/socket proxy通道,如果application支持proxy,则可以自动转发;反之则需要利用iptables将http/https连接通过transparent SOCKS proxy转成socket proxy。
当加密中转连接到到服务器端时,还需要在服务器端做一些设置以便进行中转。openvpn/l2tp/pptp是通过iptables在内核实现转发。ssh即可以利用-D选择转发socket,或者利用端口映射将socket转发至socket proxy或者http proxy。l2tp和pptp是大多数android设备都默认支持的VPN。但很多router或者firewall不支持pptp,常常会遇见一些莫名其妙的问题。openvpn需要android内核支持tun.ko模块。同时android还需要有binary openvpn application。整个安装过程较为复杂。
sshtunnel/gaeproxy是socket/http level的加密中转,因此需要利用到android中的iptable及相应的kernel module。
Ten3由于没有iptable相应模块。所以无法使用ssh。 pptp和/l2tp的binary application貌似有问题,无法连接pptpd服务端。但万幸的是tun.ko模块原生自带,只要在市场下载openvpn installer和openvpn setting就可以使用了。为避免dns污染,还需要装一个改变dns的软件。