智能翻墙: 树莓派 + shadowsocks

事出有因

        上次买了个二手路由,刷了openwrt,装了shadowsocks,dnsmasq,局域网内的终端不用任何设置就可以实现翻墙。用了一段时间,发现一个问题:在手机或者盒子上看u2b的时候,一开始速度很快,但如果中间卡一下,有时需要过很长一段时间才会恢复,有时候甚至不会恢复插入,一直卡在哪里,这个时候,我看过流量会基本是0,而如果使用网页端看,不会有这个问题。这本不是什么大问题,但总觉得不爽,因为使用电视看u2b的时间相对比较多,而使用u2b移动终端也比使用网页要来的舒服。我一开始以为是服务端的问题,因为vps在美帝,平时延时在200ms以上,而且用的是openvz, 15刀每年的那种,网上查了一下,确实其他人也遇到过类似的问题,也有一些文章介绍如何在openvz上做优化,我试过之后,问题依旧(可能他们用网页看u2b所以没这个问题)。折腾了几天后,有一次,我用手机上的影梭(shadowsocks的安卓客户端)翻墙看u2b,发现一点也不卡,而且下载速度非常稳定(家里用的是网通的宽带,800块3年,平时不玩游戏,完全可以应付我们全家的需求),这让我想到,问题可能出在openwrt上装的shadowsocks的问题。于是我就用树莓派弄了个网关,然后通过它上网。经过几天的测试,发现确实比openwrt要稳定。

配置网关

        前一段日子曾经脑子发热,用树莓派做了个小车,从那以后就一直放着不再使用。现在刚好派上用场。虽然家里不用和笔记本电脑也有好几台,但使用树莓派更省电,呵呵。开始折腾。。。。

        道具:树莓派一枚(普通电脑也行,但必须使用linux,因为要用到iptables),vps一枚(我用的是那种15刀一年的),软件需要:dnsmasq

        原理:使用dnsmasq,查询被污染的域名;使用iptables,将特殊的ip提交给shadowsocks

        shadowsocks怎么配置,安装就不说了。开启linux的转发功能:/etc/sysctl.conf, ip_forward置为1; 配置dnsmasq: /etc/dnsmasq.conf, 将最后一行的注释取消,这样可以在/etc/dnsmasq.d里面添加多个配置文件。这里使用dnsmasq将一些被墙的域名提交到特定的dns进行查询,现阶段,gfw对非53端口的dns查询没有屏蔽(也可以在自己的vps上用dnsmasq或者pdnsd搭个dns服务),我根据shadowsocks的mac客户端的pac文件,得到的一大批被墙的网址修改: fuckgfw.conf, 将这些域名提交到opendns的5353端口查询。将fuckgfw.conf放到/etc/dnsmasq.d目录下,然后重启dnsmasq,编辑/etc/resolv.conf, 将127.0.0.1放置在最前面(别忘记这一步)。fuckgfw.conf的格式如下:意思是,这些域名到208.67.222.222:5353进行查询

server=/ggpht.com/208.67.222.222#5353 
server=/gimpshop.com/208.67.222.222#5353 
server=/directcreative.com/208.67.222.222#5353 
server=/speedpluss.org/208.67.222.222#5353 
server=/mingpaovan.com/208.67.222.222#5353 
server=/wikinews.org/208.67.222.222#5353 
server=/joachims.org/208.67.222.222#5353 
server=/maiio.net/208.67.222.222#5353 

然后,编辑iptables规则,将非中国的ip提交给shadowsocks.我写了两个脚本:

让树莓派变成一台路由器与nat

#!/usr/bin/sh

iptables -F
iptables -X
iptables -Z

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 1080 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

# dnat
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
iptables -t nat -N SS
# 过滤私有地址,vps地址
iptables -t nat -A SS -d 127.0.0.1 -j RETURN
iptables -t nat -A SS -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SS -d 172.16.0.0/21 -j RETURN
iptables -t nat -A SS -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SS -d vps-ip -j RETURN

# 过滤中国ip地址,网上搜一下“中国ip段"
iptables -t nat -A SS -d 58.14.0.0/15 -j RETURN
iptables -t nat -A SS -d 58.16.0.0/13 -j RETURN
iptables -t nat -A SS -d 58.24.0.0/15 -j RETURN
...

# 所有其他的ip,都提交给shadowsocks
iptables -t nat -A SS -p tcp -j REDIRECT --to-port 1080

# 使用SS链
iptables -t nat -A PREROUTING -p tcp -j SS

开启转发功能:

vim /etc/sysctl.conf,设置net.ipv4.ip_forward=1,让更新实时生效: sysctl -p /etc/sysctl.conf

到此基本大功告成,设置其他电脑的网关与dns为树莓派的ip(或者在dhcp中默认指定),就可以畅游freedom的网络了。


标签: none


    Validate Code