路由器刷openwrt系统,打造翻墙路由器

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

我们使用的方案是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可执行文件。在服务器上运行:

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

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

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的配置文件。内容写上:

{
    "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:

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的文件。 内容如下:

#!/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。我这里转载过来:

#!/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脚本后, 路由器就应该能够透明的为我们翻墙了。

如果要新增一个网站,我会去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。  执行完后应该就不能翻墙了,iptables的规则都清掉了。

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

 

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

#!/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。 我们的路由器翻墙稳定的运行了3天没有问题。 看来shadowsocks还是挺稳定的。

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

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

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

《路由器刷openwrt系统,打造翻墙路由器》有3个想法

  1. 我自己的一点想法哦,,用来iptables,是不是就不用chinadns, dnsmasq啦?
    因为流量已经通过ss-redir过去啦. 剩下的再靠ss-tunnel去解析,不是有点浪费时间么?

    请指正.

  2. 我想问一下,你写的“注意,shadowsocks分为服务器端和客户端两个。 在方墙外的一个vps上安装服务器端,好像服务器端有提供node.js版本等多个版本。 我是下载代码进行编译安装的。”这个要安装在自己的路由器上吗?

    1. 这篇文章写的时候我也没有完全弄清楚。 楼上指出的问题是存在的。

      但是用shadowsocks翻墙是个不错的选择,这个是没错的。

      shadowsocks的服务端要在服务器上安装。 客户端在路由器上安装。
      客户端安装:
      shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk上传到路由器上,opkg install 安装它。

发表评论

电子邮件地址不会被公开。 必填项已用*标注