使用 redsocks 作强制的系统全局代理
本文介绍利用 redsocks 做强制的系统级全局代理,在Ubuntu 以及Android 系统上实现SSH翻墙。Ubuntu 上可以设置系统的网络代理,但是这只是一个系统配置,是否使用这些配置还是由应用层决定(如Firefox可以选择 “直接连接” 或者”使用系统代理设置”)。强制80、443端口走代理,可以省去应用层设置,这种方案可以用于 android 系统翻墙。本文主要介绍的PC上的安装方法,但是这种方案对于普通PC用户而言,对比简单ssh socks代理并无优势;本文的目的主要是为Android 系统翻墙提供一个可行的方案。
可以认为本文是 @bjin 的 redsocks on android指南(墙 外) 的补充(我建议大家先看一遍原文再回来),针对原文中提到的 redsocks 方案中 dns解析问题,提供一个解决方法,并能够在PC上进行演示。我认为redsocks 方案中,不论何种代理类型,dns解析问题都会存在,因为是透明代理,dns解析都会在浏览器上直接进行。另外,“国内干净无污染的dns”很难找,不会 有公共的,只能自己搭建一个。此前我特地考察了下 v2ex dns,是放在linode 上的,也不行(dns污染的原理,大概是监控所有出国的dns请求,如果发现“非法”域名的dns,gfw会抢先返回一个错误的结果,所以仅仅换用国外的 dns 不能解决问题。详情参考:深入理解GFW:DNS污染, 墙外)
安装 redsocks
首先说下 redsocks 以及 iptables 安装、配置。编译 redsocks 过程很无痛的,仅仅依赖于 libevent:
mkdir /opt/src cd /opt/src git clone https://github.com/bjin/redsocks cd redsocks sudo apt-get install libevent make
控制脚本(参考原文做了些改动)redsocks.sh:
#! /bin/sh case "$1" in start|"") cd /opt/src/redsocks if [ -e redsocks.log ] ; then rm redsocks.log fi ./redsocks -p /opt/src/redsocks/redsocks.pid #set daemon = on in config file # start redirection iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to 12345 iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to 12345 ;; stop) cd /opt/src/redsocks if [ -e redsocks.pid ]; then kill `cat redsocks.pid` rm redsocks.pid else echo already killed, anyway, I will try killall killall -9 redsocks fi # stop redirection iptables -t nat -F OUTPUT ;; start_ssh) ssh -NfD 1234 user@example.cc #TODO: change it!!! ;; stop_ssh) ps aux|grep "ssh -NfD 1234"|awk '{print $2}'|xargs kill ;; clean_dns) iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -m gfw -j DROP -m comment --comment "drop gfw dns hijacks" *) echo "Usage: redsocks start|stop|start_ssh|stop_ssh|clean_dns" >&2 exit 3 ;; esac
配置文件 redsocks.conf:
base { // debug: connection progress & client list on SIGUSR1 log_debug = on; // info: start and end of client session log_info = on; /* possible `log' values are: * stderr * file:/path/to/file * syslog:FACILITY facility is any of "daemon", "local0"..."local7" */ log = stderr; // detach from console daemon = on; /* Change uid, gid and root directory, these options require root * privilegies on startup. * Note, your chroot may requre /etc/localtime if you write log to syslog. * Log is opened before chroot & uid changing. */ // user = nobody; // group = nobody; // chroot = "/var/chroot"; /* possible `redirector' values are: * iptables - for Linux * ipf - for FreeBSD * pf - for OpenBSD * generic - some generic redirector that MAY work */ redirector = iptables; } redsocks { /* `local_ip' defaults to 127.0.0.1 for security reasons, * use 0.0.0.0 if you want to listen on every interface. * `local_*' are used as port to redirect to. */ local_ip = 127.0.0.1; local_port = 12345; // `ip' and `port' are IP and tcp-port of proxy-server ip = 127.0.0.1; port = 1234; // known types: socks4, socks5, http-connect, http-relay type = socks5; }
启动:
./redsocks.sh start_ssh ./redsocks.sh start
关闭:
./redsocks.sh stop ./redsocks.sh stop_ssh
start_ssh 和 stop_ssh 两个动作是相对独立的,用于开关代理。只需要保证 redsocks 运行时,代理正常工作即可。android 手机上,ssh 隧道应该可以直接用 connnectbot 建立。
安装西厢的反DNS污染模块
redsocks 启动之后上国内网站基本没问题了。但是 twitter 可能还上不去。原因在于浏览器不知道你设置了代理,于是自己去解析dns,而dns解析用的53端口没有通过代理。因此我们还需要把dns 的问题解决掉。
目前来看,西厢计划中的反dns污染模块还是可以工作的。我们装上这个模块给装上,就不需要自己架无污染的dns服务器,绿色环保。
PC安装西厢,我今天自己做了一次,参考我的tumblr:记录一下Ubuntu 10.04 上西厢的安装过程。
我把开启的命令也写在上面的控制脚本里了:./redsocks.sh clean_dns 。这一步建议做成开机自启动,因为一直开着也没坏处。
scholarzhang 项目的android 移植,参考 @tewilove 的 liujinyuan 项目,以及 @tewilove 这篇总结(为避免一些可能的麻烦,我把内容复制出来了;tumblr 上有原文链接)。另外,我希望能有人把西厢中的反dns污染代码单独抽离出来,放在github上单独维护,或许能简化安装过程,有志于参与开发的同学们也更容易理解。
原文:http://liruqi.wordpress.com/2011/04/07/redsocks-for-global-proxy/