使用 redsocks 作强制的系统全局代理

2011年4月8日 | 分类: 翻墙相关 | 标签: ,

本文介绍利用 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/

目前还没有任何评论.