原博地址:http://www.thinkingquest.net/article/466
我们都需要使用google提供的搜索,gmail等优质服务。但是由于方墙的存在,使得大家各自搞各自的FQ办法。 其实还有一个不错的办法,那就是在路由器这一层FQ,对路由器用户透明。
我们使用的方案是openwrt系统, *,chinadns。 *是一个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
接着我们需要下载*,chinadns的安装包,上传到路由器上,安装它们。(如果scp搞不定当然也可以在路由器上wget,一样的)。
去*官网http://*.org/下载最新版的*安装。注意,*分为服务器端和客户端两个。 在方墙外的一个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是密码。(这个貌似是惯例通用密码?)
然后是安装客户端。同样把下载到的*客户端安装包*-libev-polarssl_1.4.6_ar71xx.ipk上传到路由器上,opkg install 安装它。
安装完成之后,需要写配置文件。在/etc/下建立一个名为*.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
} |
安装完*后,可以用可执行命令 ss-local测试一下。 运行:
ss-local -c /etc/*.json
有可能会报告一个这样的错误:
ss-local: can’t load library ‘libpolarssl.so.6’
其实在opkg install安装*的时候,opkg包管理器会发现*依赖于libpolarssl库,是自动下载安装了的。 这个错误只是缺少一个软链接。做上就好:
ln -s /usr/lib/libpolarssl.so.1.3.8 /usr/lib/libpolarssl.so.6
运行ss-local后不报错,系统开始监听1080端口。 这样就验证了*是正常工作的。 此时应该可以在本地浏览器上设置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和*两个文件。
这里我们还需要编辑 /etc/init.d/*文件。 把其中的ss-local都改为ss-redir,一共只有2处。
启动chinadns和*:
/etc/init.d/chinadns start
/etc/init.d/* start
让它们开机自动启动:
/etc/init.d/chinadns enable
/etc/init.d/* 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 * iptables -t nat -N * #Redirect what you want #Google iptables -t nat -A * -p tcp -d 74.125.0.0 /16 -j REDIRECT --to-ports 1080
iptables -t nat -A * -p tcp -d 173.194.0.0 /16 -j REDIRECT --to-ports 1080
#Youtube iptables -t nat -A * -p tcp -d 208.117.224.0 /19 -j REDIRECT --to-ports 1080
iptables -t nat -A * -p tcp -d 209.85.128.0 /17 -j REDIRECT --to-ports 1080
#Twitter iptables -t nat -A * -p tcp -d 199.59.148.0 /22 -j REDIRECT --to-ports 1080
#*.org iptables -t nat -A * -p tcp -d 199.27.76.133 /32 -j REDIRECT --to-ports 1080
#slideshare iptables -t nat -A * -p tcp -d 216.52.242.0 /24 -j REDIRECT --to-ports 1080
iptables -t nat -A * -p tcp -d 108.174.0.0 /20 -j REDIRECT --to-ports 1080
#wordpress iptables -t nat -A * -p tcp -d 192.0.78.17 /32 -j REDIRECT --to-ports 1080
iptables -t nat -A * -p tcp -d 192.0.78.9 /32 -j REDIRECT --to-ports 1080
#vimeo.com iptables -t nat -A * -p tcp -d 74.113.233.128 /32 -j REDIRECT --to-ports 1080
#Anything else should be ignore iptables -t nat -A * -p tcp -j RETURN # Apply the rules iptables -t nat -A PREROUTING -p tcp -j * |
把需要的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 * iptables -t nat -N * # Ignore your * server's addresses # It's very IMPORTANT, just be careful. iptables -t nat -A * -d YOUR-SERVERS-IP-ADDRESS -j RETURN # Ignore LANs IP address iptables -t nat -A * -d 0.0.0.0/8 -j RETURN iptables -t nat -A * -d 10.0.0.0/8 -j RETURN iptables -t nat -A * -d 127.0.0.0/8 -j RETURN iptables -t nat -A * -d 169.254.0.0/16 -j RETURN iptables -t nat -A * -d 172.16.0.0/12 -j RETURN iptables -t nat -A * -d 192.168.0.0/16 -j RETURN iptables -t nat -A * -d 224.0.0.0/4 -j RETURN iptables -t nat -A * -d 240.0.0.0/4 -j RETURN # Ignore Asia IP address iptables -t nat -A * -d 1.0.0.0/8 -j RETURN iptables -t nat -A * -d 14.0.0.0/8 -j RETURN iptables -t nat -A * -d 27.0.0.0/8 -j RETURN iptables -t nat -A * -d 36.0.0.0/8 -j RETURN iptables -t nat -A * -d 39.0.0.0/8 -j RETURN iptables -t nat -A * -d 42.0.0.0/8 -j RETURN iptables -t nat -A * -d 49.0.0.0/8 -j RETURN iptables -t nat -A * -d 58.0.0.0/8 -j RETURN iptables -t nat -A * -d 59.0.0.0/8 -j RETURN iptables -t nat -A * -d 60.0.0.0/8 -j RETURN iptables -t nat -A * -d 61.0.0.0/8 -j RETURN iptables -t nat -A * -d 101.0.0.0/8 -j RETURN iptables -t nat -A * -d 103.0.0.0/8 -j RETURN iptables -t nat -A * -d 106.0.0.0/8 -j RETURN iptables -t nat -A * -d 110.0.0.0/8 -j RETURN iptables -t nat -A * -d 111.0.0.0/8 -j RETURN iptables -t nat -A * -d 112.0.0.0/8 -j RETURN iptables -t nat -A * -d 113.0.0.0/8 -j RETURN iptables -t nat -A * -d 114.0.0.0/8 -j RETURN iptables -t nat -A * -d 115.0.0.0/8 -j RETURN iptables -t nat -A * -d 116.0.0.0/8 -j RETURN iptables -t nat -A * -d 117.0.0.0/8 -j RETURN iptables -t nat -A * -d 118.0.0.0/8 -j RETURN iptables -t nat -A * -d 119.0.0.0/8 -j RETURN iptables -t nat -A * -d 120.0.0.0/8 -j RETURN iptables -t nat -A * -d 121.0.0.0/8 -j RETURN iptables -t nat -A * -d 122.0.0.0/8 -j RETURN iptables -t nat -A * -d 123.0.0.0/8 -j RETURN iptables -t nat -A * -d 124.0.0.0/8 -j RETURN iptables -t nat -A * -d 125.0.0.0/8 -j RETURN iptables -t nat -A * -d 126.0.0.0/8 -j RETURN iptables -t nat -A * -d 169.0.0.0/8 -j RETURN iptables -t nat -A * -d 175.0.0.0/8 -j RETURN iptables -t nat -A * -d 180.0.0.0/8 -j RETURN iptables -t nat -A * -d 182.0.0.0/8 -j RETURN iptables -t nat -A * -d 183.0.0.0/8 -j RETURN iptables -t nat -A * -d 202.0.0.0/8 -j RETURN iptables -t nat -A * -d 203.0.0.0/8 -j RETURN iptables -t nat -A * -d 210.0.0.0/8 -j RETURN iptables -t nat -A * -d 211.0.0.0/8 -j RETURN iptables -t nat -A * -d 218.0.0.0/8 -j RETURN iptables -t nat -A * -d 219.0.0.0/8 -j RETURN iptables -t nat -A * -d 220.0.0.0/8 -j RETURN iptables -t nat -A * -d 221.0.0.0/8 -j RETURN iptables -t nat -A * -d 222.0.0.0/8 -j RETURN iptables -t nat -A * -d 223.0.0.0/8 -j RETURN # Anything else should be redirected to *'s local port iptables -t nat -A * -p tcp -j REDIRECT --to-ports 1080 # Apply the rules iptables -t nat -A PREROUTING -p tcp -j * |
这个脚本我没有测试,但是看起来它应该能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天没有问题。 看来*还是挺稳定的。
到此搞定。 但是看起来好像不那么的智能。 真正的智能是不需要这么一个配置,系统自动能够识别哪些需要FQ。 也许有更优的方案。
忽然想起了1963年美国总统肯尼迪在柏林墙下的演讲。其中的一句话:“*有许多困难,*亦非完美,然而我们从未建造一堵墙把我们的人民关在里面,不准他们离开我们。”
我不管它们有那些所谓的“罪”,在我看来,谷歌,facebook,twitter,都是非常优秀的互联网产品。不论从技术上还是产品设计上,值得我们学习。