树莓派安装shadowsocks

树莓派怎么翻墙网上的教程一堆一堆的,不过过程中也是有些坎坷,记录一下吧。

安装shadowsocks

一开始不明白其中的区别,就安装了shadowsocks

sudo apt-get install shadowsocks

安装完发现多了两个命令,sslocalssserverssserver显然是给服务端用的,于是用了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-redirss-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