树莓派怎么翻墙网上的教程一堆一堆的,不过过程中也是有些坎坷,记录一下吧。
安装shadowsocks
一开始不明白其中的区别,就安装了shadowsocks
sudo apt-get install shadowsocks
安装完发现多了两个命令,sslocal
和ssserver
,ssserver
显然是给服务端用的,于是用了sslocal
编辑了一下配置文件
sudo vim /etc/shadowsocks/config.json
{ "server":"你的服务端IP,如VPS的IP", "server_port": 服务端设置的端口, "local_address":"0.0.0.0", "local_port":1080, "password":"服务端设置的密码", "timeout":300, "method":"aes-256-cfb" }
后来才发现这个sslocal
只支持socks5协议,属于正向代理,ss-redir
才是我需要的透明代理,这个命令的名字就是 redirect 的缩写,也就是转发。
关于如何验证sslocal
的有效性,使用如下命令将socks5转成http:
# 安装 sudo apt-get install polipo
# 停止服务 service polipo stop
# 重新配置来源端口 sudo polipo socksParentProxy=localhost:1080 &
# 通过polipo默认的8123端口的http代理访问谷歌 http_proxy=http://localhost:8123 curl www.google.com
回到正题,现在的问题是如何安装ss-redir
了,找到官方的github,看了下README。网上所有教程都是说 clone 之后运行 configure make make install这一套,可下载一看目录里根本就没有可执行的 configure 文件。
最后在README中看到,推荐的方式不是自行编译(试了下在autogen这一步就走不下去了。。)而是通过源安装,具体如下:
sudo sh -c ‘printf “deb http://httpredir.debian.org/debian jessie-backports main” > /etc/apt/sources.list.d/jessie-backports.list’
sudo apt-get update
sudo apt-get -t jessie-backports install shadowsocks-libev
安装步骤中会提示你源不可信,别管它。
装完后就有了ss-redir
和ss-tunnel
两个命令,配置都不用改,执行命令开启:
ss-redir -u -c /etc/shadowsocks/config.json -f /var/run/shadowsocks.pid &
配置iptables
iptables 的思路是这样的,对于以下 IP 的访问直接返回(就是不做任何处理):
- shadowsocks 服务器端 IP(我的 VPS 地址)
- 内网地址
- 中国境内的 IP
对于其他的 IP 则转发到 shadowsocks 的1080端口,走代理。
基础概念
我也iptables的小白,这些知识都是通过man iptables
查到的
- 既然都叫 iptables 了,table 必然是一个最基础的元素,一共有五张表,分别是 filter,nat,mangle,raw 和 security。
- 其中我们需要关心的是 nat 这张表,它是在新链接建立时使用的。
- table 下有一层 chain 的概念,nat 这张表包含三个 chain,分别是:
- PREROUTING:当报文进来时触发修改
- OUTPUT:本地产生的报文在进行路由前触发修改
- POSTROUTING:当报文要出去时出发修改
具体步骤
在官方github的 Advanced usage 中有记录详细步骤,搬运一下(去除了UDP的部分,增加了中国境内IP段排除,增加了规则保存)。
# 创建一个新的 chain root@Wrt:~# iptables -t nat -N SHADOWSOCKS
# 跳过 shadowsocks 服务器端的地址 # 这个非常重要!!! root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN
# 跳过局域网和其他不想走代理的地址 root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN root@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
# 跳过中国境内的IP段 root@Wrt:~# wget -c http://ftp.apnic.net/stats/apnic/delegated-apnic-latest root@Wrt:~# cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print "iptables -t nat -A SHADOWSOCKS -d "$4 "/" 32-log($5)/log(2)" -j RETURN"}' > cmd.sh root@Wrt:~# sh cmd.sh root@Wrt:~# rm delegated-apnic-latest root@Wrt:~# rm cmd.sh
# 其他地址将会被转发到 shadowsocks 的本地端口 root@Wrt:~# iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080
# 应用规则 root@Wrt:~# iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS root@Wrt:~# iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
保存与启动加载
iptables的设置在重新启动时会清空,需要通过脚本加载。
保存设置
iptables-save > ~/iptables.rules
加载设置
iptables-restore < ~/iptables.rules
把加载设置的命令放到/etc/rc.local
中即可实现开机加载。
查看与清空
如果写错了,或者想看下是不是写对了,可以用以下命令
查看
iptables -t nat -L
清空
iptables -t nat -F
iptables -t nat -X