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. DLL工程没有生成对应的lib文件

    要至少导出一个函数/变量才能产生lib 也就是说得用到__declspec(dllexport)

  2. 【读书笔记】读《JavaScript设计模式》之门面模式

    一.前言 门面模式,也称Facade(外观)模式.核心的两点作用—— 1> 简化类的接口(让接口变得更加容易理解.容易应用.更加符合对应业务),来掩盖一个非常不同或者复杂的实现 2> 消除 ...

  3. mysql_4(解决中文乱码问题)

    mysql> create database if not exists xdb default character set utf8;Query OK, 1 row affected (0.0 ...

  4. linux中的解压,压缩命令

    tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

  5. 关于WM_CTLCOLOREDIT的处理的一些问题

    在为duilib封装系统控件的过程中, 再一次遇到了系统EDIT控件文字颜色/文字背景颜色的处理问题. 不要小看这个消息, 她很可能不会让你如愿以偿. 其实我要的目的很简单: 1. 改变文字颜色    ...

  6. WordPress主题制作函数

    WordPress基本模板文件 一套完整的WordPress模板应至少具有如下文件: style.css: CSS(样式表)文件 index.php: 主页模板 archive.php: Archiv ...

  7. hdu 2444 二分图判断与最大匹配

    题意:有n个学生,有m对人是认识的,每一对认识的人能分到一间房,问能否把n个学生分成两部分,每部分内的学生互不认识,而两部分之间的学生认识.如果可以分成两部分,就算出房间最多需要多少间,否则就输出No ...

  8. hdu 4292 最大流 水题

    很裸的一道最大流 格式懒得排了,注意把人拆成两份,一份连接食物,一份连接饮料 4 3 3 //4个人,3种食物,3种饮料 1 1 1 //食物每种分别为1 1 1 1 //饮料每种数目分别为1 YYN ...

  9. C/C++中extern关键字详解

    转自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 1 基本解释:extern可以置于变量或者函数前,以标示变 ...

  10. Struts2 Convention插件的使用

    转自:http://chenjumin.iteye.com/blog/668389 1.常量说明 struts.convention.result.path="/WEB-INF/conten ...