最近学校网络中心疯狂查封小路由器,我们实验室不幸被查封。看来以后用路由上网是不太可能了。解决方法可以用 iptables 做个路由器,然后根据学校查路由的方法写防查规则,但是查路由的方法有很多种,也不知道学校是如何查的,于是这种方法就放弃了。用 squid 搭代理服务器也是很有可能被查出来的,目前比较方便的解决方法就是用 ssh 隧道方式作代理了,这种发法应该室查不出来的。
不过对于 ssh -D 所得到的 socks5 代理肯定是没有路由上网方便。毕竟不是全局代理,有些软件是用不了代理的,这就需要把 socks5 代理转换成全局的代理。对于 windows 来说很简单,装上 Proxifier 就可以了。
对于 Linux 则麻烦一些,需要? 这个程序。安装后,在 redsocks 目录下,建立 redsocks.conf 文件:
base {
log_debug = on;
log_info = on;
//日志文件,调试时可指定为标准错误"stderr"
log = "file:/home/hedaors/redsocks/socks.log";
// 是否以后台模式运行
daemon = on
redirector = iptables;
}
redsocks {
//local_ip设置为0.0.0.0则可共享,设备为127.0.0.1则只能在本机使用
local_ip = 0.0.0.0
local_port = 12345;
// 本来有的代理的IP和端口,可能是由ssh -D指定的
ip = 127.0.0.1;
port = 1080;
// known types: socks4, socks5, http-connect, http-relay
type = socks5;
}
建立个 iptables 规则脚本, tpsocks.sh
#!/bin/sh
# iptables路径
IPTABLES="/usr/sbin/iptables"
# redsocks路径
REDSOCKS_DIR="/home/hedaors/redsocks"
REDSOCKS="$REDSOCKS_DIR/redsocks"
# 配置文件中指定的端口
REDSOCKS_PORT="12345"
# socks代理IP和端口
SOCKS_HOST="127.0.0.1"
SOCKS_PORT="1080"
# 运行redsocks
if [ "$USER" != "root" ]; then
echo -n 'Restarting redsocks... '
pkill -U $USER redsocks 2>/dev/null
sleep 1
cd $REDSOCKS_DIR && $REDSOCKS
if [ $? -eq 0 ]; then
echo Done
else
echo Error
fi
exit 0;
elif [ "$1" != "iptables" ]; then
exit 0
fi
$IPTABLES -t nat -D PREROUTING -p tcp -j REDSOCKS_FILTER 2>/dev/null
$IPTABLES -t nat -D OUTPUT -p tcp -j REDSOCKS_FILTER 2>/dev/null
$IPTABLES -t nat -F REDSOCKS_FILTER 2>/dev/null
$IPTABLES -t nat -X REDSOCKS_FILTER 2>/dev/null
$IPTABLES -t nat -F REDSOCKS 2>/dev/null
$IPTABLES -t nat -X REDSOCKS 2>/dev/null
# Create our own chain
$IPTABLES -t nat -N REDSOCKS
$IPTABLES -t nat -N REDSOCKS_FILTER
# Do not try to redirect local traffic
$IPTABLES -t nat -I REDSOCKS_FILTER -o lo -j RETURN
### 以下是iptables策略配置,包括白名单和黑名单,默认开启白名单
### 你应该至少修改一行配置,也很简单
## Do not redirect LAN traffic and some other reserved addresses. (blacklist option)
# 黑名单选项:指定的分组通过默认路由转发,其它的都转向SOCKS代理
$IPTABLES -t nat -A REDSOCKS_FILTER -d 0.0.0.0/8 -j RETURN
$IPTABLES -t nat -A REDSOCKS_FILTER -d 127.0.0.0/8 -j RETURN
$IPTABLES -t nat -A REDSOCKS_FILTER -d 169.254.0.0/16 -j RETURN
$IPTABLES -t nat -A REDSOCKS_FILTER -d 172.16.0.0/12 -j RETURN
$IPTABLES -t nat -A REDSOCKS_FILTER -d 192.168.0.0/16 -j RETURN
$IPTABLES -t nat -A REDSOCKS_FILTER -j REDSOCKS
# Redirect all traffic that gets to the end of our chain
# 将未指定的转发到SOCKS代理,实际上不会用到
$IPTABLES -t nat -A REDSOCKS -p tcp -j REDIRECT --to-port $REDSOCKS_PORT
## Filter all traffic from the own host
# 将分组转到REDSOCKS_FILTER,以保证对分组的区分处理,作用于本机
## BE CAREFULL HERE IF THE SOCKS-SERVER RUNS ON THIS MACHINE
$IPTABLES -t nat -A OUTPUT -p tcp -j REDSOCKS_FILTER
# Filter all traffic that is routed over this host
# 将分组转到REDSOCKS_FILTER,以保证对分组的区分处理,作用于子网
$IPTABLES -t nat -A PREROUTING -p tcp -j REDSOCKS_FILTER
echo IPtables reconfigured.
打开redsocks
./tp-socks.sh
加载iptables策略
sudo ./tpsocks.sh iptables
好了,现在就可以傲视学校的网络中心了。
PS: 因为redsocks 不能把 dns 在远端解析,所以还要在 主机上做个 dns 转发,要安装 bind9 软件包。在 /etc/bind/named.conf 里的 options 字段里加入:
forwarders { 8.8.8.8; ?}
forward only;
Leave a Reply