本文介绍利用 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上单独维护,或许能简化安装过程,有志于参与开发的同学们也更容易理解。
—————————————————————————————————————————
需要翻墙利器赛风? 请阅读和关注中国数字时代。
推特用户请点击这里免翻墙上推特
请点击这里下载翻墙软件
更多翻墙方法请发电邮(最好用Gmail)到:fanqiang70ma@gmail.com
请阅读和关注中国数字时代、翻墙技术博客GFW BLOG(免翻墙)
没有评论:
发表评论