youland 发表于 2017-1-13 22:37

用树莓派做网关让局域网内所有设备无障碍访问被屏蔽网站

树莓派做一个网关,安装好shadowsocks后,可以让局域网内所有的设备不需要做任何设置访问被屏蔽的网站,包括手机,安卓盒子,台式电脑,只要能连上路由器就可以实现这种功能。

树莓派安装Debian系统,实现所有电脑不用任何设置自由访问被屏蔽的网站。简单的介绍下原理,一台树莓或一台虚拟机安装ss-redir(shadowsocks自带),然后进行iptables各种转发过滤。需要翻墙的电脑的网关设置为树莓的ip地址。加上cn的ip过滤,可以进行墙内外智能线路。如果路由器自动分配ip的,可将路由器里的hdcp的网关设置为服务器的ip,服务器的网关设置为路由器的ip。这种自动获取ip的手机的网关就是树莓派的了,就可以通过树莓的流量转发过滤。

一,安装包及编译工具
apt-get update
apt-get install --no-install-recommends build-essential autoconf libtool libssl-dev gawk debhelper dh-systemd init-system-helpers pkg-config asciidoc xmlto apg libpcre3-dev
二,下载,编译源码

1,用git下载源码,用源在线安装似乎行不通,因为ss的ip已被屏蔽了,所以只能用源码编译安装了。
git clone https://github.com/shadowsocks/shadowsocks-libev.git
2,编译生成deb安装包,进行安装
cd shadowsocks-libev
dpkg-buildpackage -b -us -uc -i
cd ..
dpkg -i shadowsocks-libev*.deb
3,在/usr/bin目录下面生成三个文件,分别是ss-server、ss-local、ss-redir。

三,按照示例进行shadowsocks-libev设置
修改/etc/shadowsocks-libev/config.json,格式如下

{
      "server":"server-ip",
      "server_port":8388,
      "local_address":"192.168.0.3",
                "local_port":1080,
      "password":"passwd",
      "method":"aes-256-cfb",
      "timeout":600
}


四,配置iptables进行转发和过滤
1,配置下面的iptables,简单的解释下这些iptables的含义。
第1行:在nat表中创建一个SHADOWSOCKS链
第2行:遇到vps的ip时直接放行,这里改成你自已的vps的ip
第3-10行:放行局域网等一些ip地址
第11行:放行中国的ip,就是中国的ip不走代理,后面会有7000多条中国的ip加到这里,如果不加,所有的流量都要走ss,那访问国内的网站会很慢的。
第12行:除了上面2-9行的地址外,其它的ip都转发到1080端口,就是ss的本地端口上
第13行:使用SHADOWSOCKS链,其他设备走PREROUTING链第
14行:使用SHADOWSOCKS链,树莓派自己走OUTPUT链
下面的iptables请按顺序来输入,不可打乱顺序
iptables -t nat -N SHADOWSOCKS
iptables -t nat -A SHADOWSOCKS -d server-ip地址 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
#中国ip
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
2,保存iptable
iptables-save > /etc/iptables.conf
3,配置iptables,让其能在重启时自动动行并生效
编辑 /etc/network/if-pre-up.d/iptables,加入下面两行
#!/bin/sh
iptables-restore < /etc/iptables.conf
执行
chmod +x /etc/network/if-pre-up.d/iptables
bash /etc/network/if-pre-up.d/iptables用命令测试一下iptables保存生效了没
iptables-save
4,打开转发
打开/etc/sysctl.conf,最后一行添加
net.ipv4.ip_forward=1

让更新实时生效
sysctl -p
五,启动ss-redie

ss-redir -u -c /etc/shadowsocks-libev/config.json -f /var/run/ss-redir.pid -b 0.0.0.0
可以用supervisor来守护这个进程,已测试可用。
测试,电脑的网关改为此树莓派的IP,就可以把树莓当做一个网关了。

六,过滤绕过国内的ip
curl http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest | grep 'apnic|CN|ipv4' | awk -F\| '{ printf("-A SHADOWSOCKS -d %s/%d -j RETURN\n", $4, 32-log($5)/log(2)) }' > cn_rules.conf
执行上面这一行,把生成的配置替换上面iptables里的
#中国ip这样就能绕过国内的网络。

到此,树莓派做为网关就算成功了,把电脑的网站设置为树莓的ip,关掉所有的ss,用任何浏览器打开谷歌,测试一下能不能访问。

七,设置路由器
我们的目的是局域网内所有的设置都要不用任何设置的访问特殊网站,所以还要在路由器上进行设置。

将路由器的HDCP网关设置为树莓派的IP(当手机连到路由器时,是自动分配的IP,这个时候默认的网关就是树莓派,而不是路由器了),把树莓派的网关设置为路由器的IP。电脑的网关设置为树莓派的IP,这样电脑的所有流量从树莓派这个网关进行转发或过滤,然后从路由器出去。

更多详情及讨论,请访问:yuln.com


youland 发表于 2017-1-15 10:57

如果使用ipset配合iptables也可以用以下操作
一,获取国内的IP列表
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt

二,设置ipset
1,创建ipset集合
ipset -N chnroute hash:net maxelem 65536

2,把上面得到的ip地址改写如下
ipset add chnroute 1.0.1.0/24
ipset add chnroute 1.0.2.0/23
ipset add chnroute 1.0.8.0/21
ipset add chnroute 1.0.32.0/19
ipset add chnroute 1.1.0.0/24每一行前面增加ipset add chnroute


3,在终端执行第1和2


三,保存ipset
由于ipset是存在内存里的,每次重启之后会消失清空,几千条记录,不可能每次都要重新执行一次。


ipset save > /etc/ipset.conf

四,配置重启启动ipset
由于ipset每次重启后会清空,所以重启的时候,我们要恢复ipset的设置
编辑 /etc/network/if-pre-up.d/iptables
#!/bin/sh
ipset restore < /etc/ipset.conf
iptables-restore < /etc/iptables.conf这一行加在iptables前面

五,配置iptables
由于国内的ip地址交由ipset过滤,所以iptables里的中国ip要删掉,用一条iptables规则来代替
iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN执行一下
bash /etc/network/if-pre-up.d/iptables以使生效
页: [1]
查看完整版本: 用树莓派做网关让局域网内所有设备无障碍访问被屏蔽网站