原博地址:http://www.thinkingquest.net/article/466

我们都需要使用google提供的搜索,gmail等优质服务。但是由于方墙的存在,使得大家各自搞各自的FQ办法。 其实还有一个不错的办法,那就是在路由器这一层FQ,对路由器用户透明。

我们使用的方案是openwrt系统, shadowsocks,chinadns。 shadowsocks是一个sock代理软件,而chinadns则好像为了解决天朝的dns污染。

这次没有边做边记录,现在是2,3天之后了,凭借一些记忆写下此篇文章,以供参考。

我们这次使用的设备是一台 netgear WNDR4300. 首先需要在openwrt的官网上查路由设备是否支持openwrt系统。 在这里查:http://wiki.openwrt.org/toh/start。 我们的设备没有在列表中,但是没关系,因为我们了解到,WNDR4300和WNDR3700v4几乎是一样的硬件配置,唯一的区别在于3700v4的5g是300Mbps的,4300好像是450Mbps。 下载对应版本的openwrt。在download页面我们发现了一个名为openwrt-ar71xx-nand-wndr4300-ubi-factory.img的文件。 看来虽然4300没有出现在支持设备列表中,但是却存在一个预编译的img文件。 (如果没有预编译好的,就需要下载源代码自己编译了)。

4300的刷机相对简单,不需要进入bootloader,直接登录原生的4300自带的web管理后台,更新固件版本,直接上传img文件,等待一会就可以了。

刷完openwrt之后界面(luci)是英文版的。在它的管理界面里找到更新。更新完成之后在界面中可以设置语言为中文。当然喜欢英文界面的话,这一步就可以省略了。

刷完openwrt,默认路由器是打开了ssh登录的,可以直接ssh到路由器上。 默认也是开启着scp服务的。(注意,这个不是sftp服务。我们 用的是windows上的winscp,在选择协议的地方需要选择scp而不是sftp,否则无法上传文件)。

给路由器插上网线,使它能够上网。(可以是自己拨号也可以是接上一本可以访问公网的网线,因为更新软件源,或者接下来安装软件的时候,如果缺少依赖的包,也会自动下载安装)登录到路由器上,先执行一下:

opkg update

接着我们需要下载shadowsocks,chinadns的安装包,上传到路由器上,安装它们。(如果scp搞不定当然也可以在路由器上wget,一样的)。

去shadowsocks官网http://shadowsocks.org/下载最新版的shadowsocks安装。注意,shadowsocks分为服务器端和客户端两个。 在方墙外的一个vps上安装服务器端,好像服务器端有提供node.js版本等多个版本。 我是下载代码进行编译安装的。 安装过程相对简单,就是autogen.sh, make, make isntall就行了。 安装完成后在/usr/local/bin目录下就拥有了ss-server可执行文件。在服务器上运行:

1
ss-server -p 9999 -s {server ip} -k fuckgfw

还有些其他参数,比如增加加密算法之类的:

1
ss-server -p 9999 -s {server ip} -k fuckgfw -m aes-256-cfb start --fast-open

服务就运行在9999端口了。其中的{server  ip}要替换成真实的ip。  -k参数后边的fuckgfw是密码。(这个貌似是惯例通用密码?)

然后是安装客户端。同样把下载到的shadowsocks客户端安装包shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk上传到路由器上,opkg install 安装它。

安装完成之后,需要写配置文件。在/etc/下建立一个名为shadowsocks.json的配置文件。内容写上:

1
2
3
4
5
6
7
8
{
    "server":"xxx.xxx.xxx.xxx",
    "server_port":9999,
    "local_port":1080,
    "password":"fuckgfw",
    "timeout":60,
    "method":null
}

安装完shadowsocks后,可以用可执行命令 ss-local测试一下。 运行:
ss-local -c /etc/shadowsocks.json
有可能会报告一个这样的错误:
ss-local: can’t load library ‘libpolarssl.so.6’
其实在opkg install安装shadowsocks的时候,opkg包管理器会发现shadowsocks依赖于libpolarssl库,是自动下载安装了的。 这个错误只是缺少一个软链接。做上就好:
ln -s /usr/lib/libpolarssl.so.1.3.8 /usr/lib/libpolarssl.so.6

运行ss-local后不报错,系统开始监听1080端口。 这样就验证了shadowsocks是正常工作的。 此时应该可以在本地浏览器上设置socks5代理, 路由器的ip,端口1080。

chinadns的项目地址是https://github.com/clowwindy/ChinaDNS-C。根据自己的平台下载,我们的是AR71xx,有预编译好的,我就直接下载了ChinaDNS-C_1.1.7_ar71xx.ipk。没有对应二进制版本的话就需要下载源码自行编译了。

上传到路由器上,opkg install ChinaDNS-C_1.1.7_ar71xx.ipk安装。
装完之后,根据chinadns官网上针对openwrt用户所写的建议。 建议使chinadns成为dnsmasq的一个upstream server,而不是直接使用chinadns。修改的办法按照官网缩写就可以。具体是:
1. 编辑/etc/init.d/chinadns这个文件,删除两行包含iptables命令的语句。
2. 编辑/etc/dnsmasq.conf这个文件,只使用127.0.0.1#5353:

1
2
no-resolv
server=127.0.0.1#5353

3. 启动chinadns, 重启dnsmasq。

安装完这两个软件后,/etc/init.d目录下就新增了chinadns和shadowsocks两个文件。
这里我们还需要编辑 /etc/init.d/shadowsocks文件。 把其中的ss-local都改为ss-redir,一共只有2处。

启动chinadns和shadowsocks:
/etc/init.d/chinadns start
/etc/init.d/shadowsocks start

让它们开机自动启动:
/etc/init.d/chinadns enable
/etc/init.d/shadowsocks enable
(openwrt系统会根据/etc/init.d/chinadns文件中开头定义的变量 START=95,在/etc/rc.d/下建立S95xxx文件。执行它的start)。

此时我们就需要iptables,把一些指定的ip给转到本地1080端口,让它们走代理。 当然不能把所有的流量都走代理。

我们在 /usr/bin下建立了一个名为 ss-black.sh的文件。 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/sh
 
#create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS
 
#Redirect what you want
 
#Google
iptables -t nat -A SHADOWSOCKS -p tcp -d 74.125.0.0/16 -j REDIRECT --to-ports 1080
iptables -t nat -A SHADOWSOCKS -p tcp -d 173.194.0.0/16 -j REDIRECT --to-ports 1080
 
#Youtube
iptables -t nat -A SHADOWSOCKS -p tcp -d 208.117.224.0/19 -j REDIRECT --to-ports 1080
iptables -t nat -A SHADOWSOCKS -p tcp -d 209.85.128.0/17 -j REDIRECT --to-ports 1080
 
#Twitter
iptables -t nat -A SHADOWSOCKS -p tcp -d 199.59.148.0/22 -j REDIRECT --to-ports 1080
 
#Shadowsocks.org
iptables -t nat -A SHADOWSOCKS -p tcp -d 199.27.76.133/32 -j REDIRECT --to-ports 1080
 
#slideshare
iptables -t nat -A SHADOWSOCKS -p tcp -d 216.52.242.0/24 -j REDIRECT --to-ports 1080
iptables -t nat -A SHADOWSOCKS -p tcp -d 108.174.0.0/20 -j REDIRECT --to-ports 1080
 
#wordpress
iptables -t nat -A SHADOWSOCKS -p tcp -d 192.0.78.17/32 -j REDIRECT --to-ports 1080
iptables -t nat -A SHADOWSOCKS -p tcp -d 192.0.78.9/32 -j REDIRECT --to-ports 1080
 
#vimeo.com
iptables -t nat -A SHADOWSOCKS -p tcp -d 74.113.233.128/32 -j REDIRECT --to-ports 1080
 
#Anything else should be ignore
iptables -t nat -A SHADOWSOCKS -p tcp -j RETURN
 
# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

把需要的ip加进去就可以了。
某位朋友还给出了另一个方案,就是把亚洲流量全部直接访问,非亚洲流量全部走代理,他的脚本在这里:https://gist.github.com/reee/fe174cfd8985273bc478。我这里转载过来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/sh
 
#create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS
 
# Ignore your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d YOUR-SERVERS-IP-ADDRESS -j RETURN
 
# Ignore LANs IP address
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
 
# Ignore Asia IP address
iptables -t nat -A SHADOWSOCKS -d 1.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 14.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 27.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 36.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 39.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 42.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 49.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 58.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 59.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 60.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 61.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 101.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 103.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 106.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 110.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 111.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 112.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 113.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 114.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 115.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 116.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 117.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 118.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 119.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 120.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 121.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 122.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 123.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 124.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 125.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 126.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 175.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 180.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 182.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 183.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 202.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 203.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 210.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 211.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 218.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 219.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 220.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 221.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 222.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 223.0.0.0/8 -j RETURN
 
# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080
 
# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS

这个脚本我没有测试,但是看起来它应该能work,没问题。

我们执行一下自己创建的ss-black.sh脚本后, 路由器就应该能够透明的为我们FQ了。

如果要新增一个网站,我会去dig或nslookup找到它的ip,把它添加到这个文件中。 可以借助APNIC的IP WHOIS工具:(http://wq.apnic.net/apnic-bin/whois.pl) 。

我不是很熟悉iptables,不确定新增的iptables规则是否能立即生效,也没去测试。我测试过的一种办法是这样的:

修改ss-black.sh文件,增加新增的ip或ip段。

执行 /etc/init.d/firewall restart。  执行完后应该就不能FQ了,iptables的规则都清掉了。

再次运行 /usr/bin/ss-black.sh。 搞定。

为了让路由器开机后能自动执行ss-black.sh,我仿照chinadns的方式,在 /etc/init.d下新建了名为ss-black的文件。内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org
 
START=96
 
start() {
    /usr/bin/ss-black.sh
}
 
stop() {
 
}

然后 /etc/init.d/ss-black enable。在/etc/rc.d下可以看到生成了S96ss-black文件。当然别忘了+x权限。

这个重启的过程我没有测试是否work。 我们的路由器FQ稳定的运行了3天没有问题。 看来shadowsocks还是挺稳定的。

到此搞定。 但是看起来好像不那么的智能。 真正的智能是不需要这么一个配置,系统自动能够识别哪些需要FQ。 也许有更优的方案。

忽然想起了1963年美国总统肯尼迪在柏林墙下的演讲。其中的一句话:“自由有许多困难,民主亦非完美,然而我们从未建造一堵墙把我们的人民关在里面,不准他们离开我们。”

我不管它们有那些所谓的“罪”,在我看来,谷歌,facebook,twitter,都是非常优秀的互联网产品。不论从技术上还是产品设计上,值得我们学习。

(转)开源OpenWRT知识的更多相关文章

  1. 开源GIS知识

    ---恢复内容开始--- 2.1.3组件层 数据库组件层按照功能可分为两类:数据管理组件和分析组件. 2.1.3.1数据管理组件 (1)GDAL GDAL(http://www.gdal.org/)是 ...

  2. Java开源框架知识整理

    1.Spring的了解     Spring是一个轻量级的IOC/DI和AOP容器的开源框架.可以实现Java模块化开发,贯穿表现层,业务层,逻辑层,实现各层之间的解耦合关系.     IOC,控制反 ...

  3. 我发起了一个 .Net 平台上的 开源项目 知识图谱 Babana Map 和 文本文件搜索引擎 Babana Search

    起因 也是 前几天 有 网友 在 群 里发了   知识图谱   相关的文章, 还有 有 网友 问起   NLog -> LogStash -> Elastic Search  的 问题, ...

  4. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  5. 2016年GitHub排名前20的Python机器学习开源项目(转)

    当今时代,开源是创新和技术快速发展的核心.本文来自 KDnuggets 的年度盘点,介绍了 2016 年排名前 20 的 Python 机器学习开源项目,在介绍的同时也会做一些有趣的分析以及谈一谈它们 ...

  6. 从拥抱开源到回馈开源,灵雀云助力CNCF中国区培训业务

    6月27日,全球首屈一指的开源盛会 2018 LinuxCon + ContainerCon + CloudOpen China (LC3)在中国北京国家会议中心落下帷幕.二度落地中国的LC3大会热度 ...

  7. knowledge-repo 知识管理简单试用

    knowledge-repo 是airbnb 开源的知识管理工具,只集成git 数据库等类型的存储 安装 pip install --upgrade "knowledge-repo[all] ...

  8. 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架

    20 个顶尖的 Python 机器学习开源项目 机器学习 2015-06-08 22:44:30 发布 您的评价: 0.0 收藏 1收藏 我们在Github上的贡献者和提交者之中检查了用Python语 ...

  9. 让这个Java语言的开源商城系统火起来

    Java是一门非常优秀的面向对象编程语言,功能强大且简单易用,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,凭借其简单性.面向对象.分布式.健壮性.安全性.平台独立与可 ...

随机推荐

  1. git配置config文件

    1.Git有一个工具被称为git config,它允许你获取和设置变量:这些变量可以控制Git的外观和操作的各个方面.这些变量以等级的不同可以被存储在三个不同的位置: (1) /etc/gitconf ...

  2. MySQL Transaction--事务无法正常回滚导致的异常

    问题表现:系统增删改操作明显变慢(由原来的几十毫秒变为几十秒) 查看未提交事务 ## 查看未提交的事务 ## SELECT p.ID, P.USER, P.HOST, p.DB, P.TIME, T. ...

  3. c# 数据类型可在在最后的带一个字母

    folat的后面要带F或者f: double的后面要带D或者d: decimal的后面要带M或者m: long的后面要带L或者l:

  4. 记录:禁用你的元素 bootstrap

    记录:禁用你的元素 bootstrap <script> $(document).ready(function() { $("#target1").css(" ...

  5. 突破本地离线存储的JS库 localforage

    localforage 简介 项目地址 https://github.com/localForage/localForage API中文地址 https://localforage.docschina ...

  6. java 子类父类相互转换

    子类转父类 (父类引用指向子类对象) 子类可以转换为父类,如下父类FruitTest与其子类AppleTest class FruitTest { String str = "FruitTe ...

  7. 利用Jmeter批量数据库插入数据

    1.   启动Jmeter 2.   添加 DBC Connection Configuration 右键线程组->添加->配置元件->JDBC Connection Configu ...

  8. 基于Eclipse搭建hadoop开发环境

    一.基础环境准备 1.Eclipse 下载地址:http://pan.baidu.com/s/1slArxAP 2.JDK1.8  下载地址:http://pan.baidu.com/s/1i5iNy ...

  9. 阿里云 持续集成环境自动部署cordova项目热更新脚本

    linux脚本: #!/bin/sh rm -rf /home/tomcat/xiecang_hybird_web/xiecang_hybird_web.zip rm -rf /home/tomcat ...

  10. 前端学PHP之面向对象系列第四篇-----关键字

    public public表示公有,它具有最大的访问权限,被定义为公有的类成员可以在任何地方被访问 如果属性用 var 定义,则被视为公有,如果方法没有设置关键字,则该方法默认为公有 <?php ...