VPS购买地址

以下所有叙述均来自互联网上已有文章, 本人只做收集和整理工作.

写在前面的话: 一直想把家里的树梅派做成一个fq路由器, 期间也看过很多GitHub上的开源项目: Redsock, ChinaDNS等等, 都感觉不怎么尽如人意, 而且OpenWRT用起来也不怎么顺手. 最终还是回到最简单的Linux, 使用iptables, ss-libev和国家IP段轻轻松松搞定了. 个人觉得这是目前网上最简单的方案了.

1. 所需工具: 一台q外的vps, raspbian(打开转发功能), shadowsocks-libev(这个基于C的版本支持ss-tunnel, 可用来UDP转发), IP地理位置库(用到了里面的不同国家的IP地址段), DNSMasq(用来接替家里的磊科Q3充当DNS和DHCP服务器).

2. 安装shadowsocks-libev, 根据官方文档, 你可以添加shadowsocks源, 通过apt-get的方式直接安装, 但是由于这个源的地址在q外, 所以此法行不通, 只能通过编译源代码的方式进行. 过程比较顺利, 唯一要注意的是编译之前需要安装libssl-dev, libpcre3-dev, 然后依次执行./configure --disable-documentation, make, make install即可.

3. 安装完之后在/etc/rc.local中添加如下两行代码(具体参数意义可以通过--help获得):

sudo ss-redir -c /etc/shadowsocks-libev/config.json -f /var/run/ss-redir.pid &
 -L 8.8.4.4: -u -f /var/run/ss-tunnel.pid &     #让5353端口产生的流量走隧道, 5353端口干什么用的请见下文

附上/etc/shadowsocks-libev/config.json

{
    "server":"1.2.3.4",
    ,
    "local_address":"0.0.0.0",
    ,
    "password":"XXXXXXX",
    ,
    "method":"aes-256-cfb"
}

4. 接下来就要对iptables进行设置了.

4.1 首先创建一个新链, 将私有和你vps的地址都执行RETURN动作, 然后将剩下所有通过树莓派的数据包的目的端口重定向到本机1080端口(即local_port), 如下:

稍稍解释一下这一段iptables规则(这里只涉及到nat表)

iptables -t nat -N SHADOWSOCKS #首先创建一条新链
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS #很多文章把这条放在最后并称为"Apply the rule", 但是我觉得把它放在第二条并称为"在PRE-ROUTING时先reference SS链"更易理解
iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS #让路由器本身的应用也能够fq
iptables -t nat -A SHADOWSOCKS -d your_vps_ip -j RETURN #若遇到目的地址是自己的vps, 局域网私有地址, 中国IP段的话, 回到主链(不继续在SS链中向下执行)
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
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080 #若目的地址不在前面那些范围内, 则将去往目的地址的流量转发到本机1080端口

4.2 参见我另一篇博文里面的办法获得中国所有IP地址段, 然后编辑成如下模式(注意, 此处我用了插入-I, 而非追加-A, 是因为你要确保这些规则必须在4.1的倒数第一条规则之前, 换句话说就是不将国内和私有局域网的流量转发到1080端口):

iptables -t nat -I SHADOWSOCKS -d  -j RETURN

4.3 导入所有规则之后, 使用iptables-save > /home/pi/smart.iptables命令生成配置文件, 然后在/etc/rc.local中加入sudo iptables-restore < /home/pi/smart.iptables以实现每次开机自动加载所有规则.

5. 客户端的设置. 客户端的网关和DNS需要改成树莓派的IP地址.

6. 测试. 需要测试两个地方: 1. DNS是否被污染; 2. 国内国外地址是否被分流.

6.1 DNS是否被污染可以使用阿里巴巴的DNS解析一下被q网站, 然后再用你的DNS解析一下, 如果结果一样则说明你的配置没有成功, 反之则成功.

6.2 可以通过http://ip138.com/和https://www.whatismyip.com/来检测国内国外流量是否被分流.

7. 最后一步设置DNSMasq, 关闭DNS, 开启DHCP. 这一步的DNS设置是后加的, 因为我在实际使用中发现, 使用Google DNS解析国内诸如JD, taobao这样的网站会得到它们的国外IP, 这直接导致浏览体验非常差. 所以我让国内域名通过树莓派自身的dns-nameservers中设置的DNS服务器解析, 国外域名通过本机5353端口再转发到Google DNS进行解析.

7.1 在/etc/rc.local中加入sudo dnsmasq -C /etc/dnsmasq.conf (如果没有该文件可以通过这里下载)

#### DNS ####
port=53 #启用DNSMasq的DNS功能
conf-dir=/etc/dnsmasq.d #在这个目录下维护一张serverlist.conf列表, 将指定的域名通过本机的5353端口向国外DNS转发查询, 这样做的目的是让q外的地址不受DNS污染, 国内的地址可以使用国内DNS的CDN加速
listen-address=192.168.1.2,127.0.0.1
cache-size=1024
no-hosts
resolv-file=/etc/resolv.dnsmasq.conf  #nameserver 223.6.6.6

#### DHCP ####
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
dhcp-range=192.168.1.101,192.168.1.150,12h
dhcp-option=1,255.255.255.0
dhcp-option=3,192.168.1.2
dhcp-option=6,192.168.1.2

serverlist.conf (更多网址按照自己需要添加)
server=/bbc.com/
server=/google.com/

2016年3月12日更新:

以上的方案使用了很长一段时间了,但最近发现一个问题:DNS对于q外的域名解析有问题。最直观的表现就是Chrome第一次无法打开被q网页,报DNS无法解析的错误,但是过几秒钟再去刷新就可以打开了。不知道为什么,希望谁能解释一下。不过解决办法倒是找到了,附在下面。

使用的工具:unbound(用来将DNS请求通过TCP传输)

1. 安装unbound. 我是编译安装1.5.8版本,开始之前请安装libexpat1-dev,然后./configure && make && make install

2. 安装完后配置文件在/usr/local/etc/unbound/unbound.conf,修改其中的几项内容

interface: 127.0.0.1
interface: 192.168.1.2
port:
tcp-upstream: yes
forward-zone:
    name: "."
    forward-addr: 8.8.8.8
    forward-first: no

3. 在运行unbound之前还需要通过useradd unbound创建用户,否则无法执行

4. 修改/etc/rc.local,设置其为开机启动,同时注释掉通过ss-tunnel的方式

sudo unbound -c /usr/local/etc/unbound/unbound.conf
#  -L  -u -f /var/run/ss-tunnel.pid &

参考:

https://github.com/shadowsocks/shadowsocks-libev

https://github.com/1265578519/pac

在树莓派上使用ss和iptables实现fq功能的更多相关文章

  1. 在树莓派上部署InfoPi

    如果仅仅想试用InfoPi,请参照此文在Windows上试用.在Windows上部署比在树莓派上部署简单得多. 先说明一下,我用的系统是Raspbian(2014-06-20发布的). 用户pi,工作 ...

  2. 树莓派上Java程序作为linux服务并开机自动启动

    http://www.iigrowing.cn/shu_mei_pai_shang_java_cheng_xu_zuo_wei_linux_fu_wu_bing_kai_ji_zi_dong_qi_d ...

  3. 如何在树莓派上运行雷神之锤III

    昨天在树莓派上尝试运行了一下雷神之锤III,流畅运行,效果不错~~~ RPI这个小身板的东东总是可以给你带来惊喜,这里记录一下步骤以备后续再用 先确保RPI的程序和固件都已经更新 sudo apt-g ...

  4. 使用Qmake在树莓派上开发Opencv程序

    Qt 安装 PC 端  下载安装即可 https://mirrors.ustc.edu.cn/qtproject/official_releases/qt 树莓派:Qt开发套件和opencv安装sud ...

  5. 在树莓派上 搭建sqlite数据库

    最近找工作需要学习一些数据库方面的知识,所以就在实验室的树莓派上准备装个数据库试试,刚开始准备装一个mysql数据库,出现了很多问题,放弃了,后来查了一些资料原来还有很多可以用的小巧实用的数据库,sq ...

  6. 在树莓派上部署asp.net

    今天成功的在树莓派上部署asp.net呢.之前在unbuntu上测试成功了,结果今天操作的时候又不会操作了,主要对Linux太不熟悉了,找资料,资料又不多,这次赶紧记录下来,以备下次查阅. 我用的mo ...

  7. 树莓派上搭建基于Python+web.py+fastcgi+lighttpd的网站

    最近在网上淘了一个树莓派,什么是树莓派?这里是他的官方网站你可以去看看. 简单的说就是一块使用了ARM11的CPU,具有256MB或512MB内存的具有两个USB接口,一个RJ45接口,HDMI输出和 ...

  8. Windows 10 IoT Serials 4 - 如何在树莓派上使用Cortana语音助手

    从Windows 10 IoT Core 14986版本开始,微软已经加入Cortana语音助手功能.之前,我们只能使用本地语音识别,需要编写应用程序,下载到设备中才能实现.从现在开始,微软已经从系统 ...

  9. 树莓派上搭建arduino开发环境

    -------------还是博客园上面的格式看这舒服,不去新浪了------------- 为什么要在树莓派上开发arduino呢?总要把树莓派用起来嘛,不然老吃灰. 树莓派使用SSH时没有图形界面 ...

随机推荐

  1. 【回溯】图的m着色问题

    问题 C: [回溯]图的m着色问题 时间限制: 1 Sec  内存限制: 128 MB提交: 1  解决: 1[提交][状态][讨论版] 题目描述 给定无向连通图G=(V, E)和m种不同的颜色,用这 ...

  2. FZU 2148 moon game (计算几何判断凸包)

    Moon Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  3. mysql php nginx 源码包下载地址

    http://mirror.cogentco.com/pub/mysql/MySQL-5.5/ http://mirrors.sohu.com/php/ http://nginx.org/downlo ...

  4. Java Hour 57 Java Architecture

    Java 的架构中有4个重要的组成部分: 1 Java programming langrage 2 Java class file format 3 Java API 4 Java virtual ...

  5. Enter直接登录

    2.2  按Enter键调用登录按钮 [实例描述] 为了方便用户操作,在登录邮箱或论坛时,如果用户输入了用户名和密码,按Enter键时,都会自动调用登录按钮.本例学习如何实现此功能. [实现代码] & ...

  6. 关于遍历javascript 中的json串浏览器输出的结果不统一的情况

    我们在做项目的时候经常会用到javascript的json. 首先说一下javascript的json串是什么,json串属于javascript的一个对象,有键和值对应的对象. 一般的格式是: a ...

  7. http://blog.sina.com.cn/s/blog_5f103c9c0101atny.html

    http://blog.sina.com.cn/s/blog_5f103c9c0101atny.html http://www.oschina.net/question/117304_51525

  8. POJ3581 Sequence(后缀数组)

    题意:给一个串,串的第一个字符比后面的都大,要把它分成三段,然后反转每一段,求能得到的字典序最小的串是什么. 首先,第一段是可以确定的:把原串反转,因为第一个字符是最大的,它是唯一的,不存在反转串的后 ...

  9. C#抽象类及其方法的学习

    在C#中使用关键字 abstract 来定义抽象类和抽象方法. 不能初始化的类被叫做抽象类,它们只提供部分实现,但是另一个类可以继承它并且能创建它们的实例. "一个包含一个或多个纯虚函数的类 ...

  10. 【BZOJ】2802: [Poi2012]Warehouse Store(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2802 自己yy了一下... 每一次如果够那么就买. 如果不够,考虑之前买过的,如果之前买过的比当前花 ...