Total Pageviews

Thursday, 7 April 2016

Netgear WNDR4300路由器翻墙手册(openwrt+shadowsocks)






该文仅仅适合程序员阅读,除非你至少明白什么是telnet和ssh,否则就去找更适合的教程吧

1.背景介绍:什么是gfw

gfw的定义可以参见维基百科。最直观的感受,就是google,facebook等一票网站访问不了。但是作为程序员,我们有必要知道为什么这些网站访问不了?当然这些网站被阻止访问了,但是是如何阻止的??
作为程序员,你可能会首先想到,不就是这个网站ip被阻止访问了嘛。但实际上,这只是原因之一,gfw手段中最不起眼的一个。因为google和facebook这样的大公司有成千上万的ip,且每天都在变化,因此,封ip根本来不及。其实,更大的原因是:DNS污染
来做个实验(在家中,在单位代理上网的情况下无法进行),调出终端,打入以下命令
nslookup twitter.com
nslookup是用来查看某个域名真实ip的命令
各系统返回稍有不同,但基本上都是如下:
Server: 172.25.23.1
Address: 172.25.23.1#53
Non-authoritative answer:
Name: twitter.com
Address: 37.61.54.158
可以看到twitter.com被解析到了37.61.54.158,如果进一步用whois跟踪,你会发现这个地址的详细信息






keyvalue
IP LocationAzerbaijan Azerbaijan Bakixanov Baktelekom
ASNAzerbaijan AS28787 BAKINTER-AS Baktelekom,AZ (registered Feb 24, 2003)
Whois Serverwhois.ripe.net
IP Address37.61.54.158
那么问题来了,你觉得twitter.com这样的公司,会使用一个阿塞拜疆的ip地址吗,这就是问题所在,gfw把要屏蔽的网站的域名都解析到了类似于37.61.54.158这样的空地址上,且在你家的宽带,手机等等所有设备上蔓延。
程序员可能会想到,不是可以指定dns地址嘛,我用第三方的dns是不是就没有问题了,那我们再来做个实验
nslookup twitter.com 8.8.8.8
nslookup可以指定第二个参数,强制使用这个dns解析
8.8.8.8是google提供的公共dns服务
但返回结果依然是
Non-authoritative answer:
Name: twitter.com
Address: 37.61.54.158
这是为什么,还是这个地址。原因是dns使用的是udp的协议,基本逻辑是本机先发往本机的53端口进行查询,如果本机不知道,就向dns查询,依次向上。upd协议是不建立连接的,且是明文传递,非常容易被伪造。gfw就利用了这一点,你发向8.8.8.8的dns查询,gfw先给你一个假回执,就诱骗了你的机器。(实际上,8.8.8.8的回执稍后也会到来,但是本机会认为已经拿到回执,就把它忽略了)
其实从这里就可以看出,在一些公共wifi下,如果你忽略证书有问题的警告,被钓鱼是一件多么容易的事情,亲们
程序员可能会想,那有没有办法用tcp协议查询,答案是肯定的:
nslookup -vc twitter.com 8.8.8.8
你会得到如下应答
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: twitter.com
Address: 199.59.150.7
Name: twitter.com
Address: 199.59.150.39
Name: twitter.com
Address: 199.59.149.198
Name: twitter.com
Address: 199.59.149.230
这才是真实的ip
亲们看完是不是一身冷汗,其实网络世界确实挺可怕的,小白被骗钱简直分分钟的事情,所以,程序员们有必要学习有关知识

开始我们的实践吧,基于以上的认识,我们要科学上网,至少需要做两件事情

  • 解决ip被阻断问题
  • 解决dns污染问题

我们的使用的方法:将被墙的站点通过dnsmasq+ipset打标记,然后通过iptables的路由功能将这些ip通过shadowsocks转发出去,其中这些名词,下面一步一步做完,你就会熟悉


2.准备工作

  • 我们需要一个shadowsocks服务帐号,用来通过加密通道访问网站。我目前使用的http://my.ssh91.net 的服务,一个月10RMB,可以流畅看720p的youtube。购买后,会收到确认邮件,内含密码等信息。几个节点自己选一个,我目前使用ss02台湾节点。
  • 一台路由器,理论上能刷openwrt的内存足够的路由器都可,但这里针对Netgear wndr4300写的。我在京东活动时购买的,299RMB
  • 一个adsl上网环境,或者静态ip的也可以,再复杂的上网认证方式,我就不保证有效了
  • 一根网线,openwrt刚刷好时,是关闭wifi的,只能通过网线连接
  • 没有了

3.刷新ROM

首先从openwrt官网下载适合wndr4300的rom,openwrt的官网下载地址是:http://downloads.openwrt.org , 在写该文时,最新的版本是14.07,因此对应的下载地址是http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/nand/openwrt-ar71xx-nand-wndr4300-ubi-factory.img ,注意一定不能下载错了,否则就变砖了。下载好了之后,就可以通过路由器控制台的系统更新,将该ROM刷进去。正常情况下,路由器自动重启后,就刷新完毕了。
这里要注意一下,带有factory的版本是从官方固件升级时使用的,而带有sysupgrade标志的,是给已经刷了openwrt的用户升级用的

4.设置openwrt上网环境

刚刷好openwrt,系统默认关闭了wifi,只能通过网线连接。插好网线,浏览器输入http://192.168.1.1
即可进入控制台。默认的用户名为root,密码为空,因此直接点击login就可以进入了。进入后,注意到上半部分有change password的提示,点击进入后,就可以设置新的登录密码。设置时,只需要填写好密码并点击Save & Apply保存幷应用设置即可。
登录密码设置后,默认系统终端就从telnet转为了ssh登录方式
设置好之后,重新进入http://192.168.1.1 ,就来到了主界面。主界面显示的都是当前路由器的状态。接下来我们设置wifi。找到wireless部分,应该可以看到两个disabled的节点。上面一个是2.4GHz的,下面一个是5GHz的。首先设置上面一个2.4GHz的,点击默认的SSID(一般为openwrt),设置新的SSID,第二个Security页签,Encryption建议选择WPA2-PSK,Cipher选择Force CCMP,Key填写您的密码。以上是标准部分设置,接下来我们再进行一些优化设置。页面上半部分有个Advanced Setting,其中HT Mode选择40MHz,Force 40Mhz选中,Country选择US。好了,点击Save & Apply保存幷应用设置。最后,点击页面上半部分中的General Setup中的Enable,打开wifi就可以了。5GHz的设置一模一样,只不过SSID不同即可。
现在wifi应该已经正常工作了,可以拔掉网线,连接wifi使用。接下来设置宽带pppoe。菜单中选择Network-Interfaces,点击WAN端的Edit进行编辑。首先选择protocol为PPPoE,再点击Switch Protocol进行应用。出现了username和password字段,填入您的宽带帐号和密码,点击Save & Apply保存幷应用设置。过一会,回到主页面,应该可以在WAN Status看到宽带分配的IP等信息,证明联网成功了。好了,暂时可以享受正常的上网生活了。

5.尝试ssh登录

Windows默认没有ssh命令,因此需要下载其它软件登录,推荐PuTTY,其它系统ssh肯定是内建命令。Windows下,打开PuTTY,输入192.168.1.1,用户名root,密码是你刚才设置的登录密码。其它系统下,直接命令行输入ssh root@192.168.1.1即可。这时候,你就进入了openwrt的系统,openwrt是基于Linux的系统,因此,什么ls,vi等命令都是直接可以用的,你可以先把玩把玩

6.升级dnsmasq

Dnsmasq 提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以为局域网电脑提供内网ip地址和路由。
默认的dnsmasq为base版本,该版本不能对特定的域名地址进行标记操作(因为我们需要对一些特定域名如twitter等进行标记),因此,首先我们需要升级为更高版本的dnsmasq-full,运行如下命令即可重新安装高级版的dnsmasq:
#更新软件列表

opkg update

#运行remove命令后,会提示有一个文件被改动,无法删除,请手工删除

opkg remove dnsmasq

#安装新软件

opkg install dnsmasq-full

#重新启动dnsmasq

/etc/init.d/dnsmasq restart
opkg是openwrt的包管理器,如果只熟悉WIndows的同志,你就理解为360软件中心吧。update命令刷新最新的软件列表,一般重启路由器后,要使用opkg安装包,都需要先运行update。remove就是删除已经安装的软件。install是安装软件
之后,运行如下命令
dnsmasq -v
确认版本信息中有ipset字样

7.安装chinadns

chinadns项目主页:https://github.com/clowwindy/ChinaDNS-C ,该项目就是为了阻止dns污染而开发的。
因为chinadns并没有登记到opkg软件列表中,因此只能手动下载安装。从http://sourceforge.net/projects/chinadns/files/dist/ 找到属于ar71xx的最新版本并下载,之后上传到路由器的/tmp目录下。Windows下,可以用WinScp软件进行上传;其它系统,可以直接用scp命令上传。当然,也可以在路由器用wget命令直接下载到/tmp目录。之后运行如下命令进行安装
cd /tmp

opkg install chinadns-xxx.ipk
安装好了之后,用vi编辑/etc/init.d/chinadns文件,找到含有iptables字样的两行,删除或者用#注释掉
之所以要删除iptables两行,是因为默认chinadns利用路由表直接拦截dns请求,但是因为我们要用dnsmasq配合chinadns打标记,因此要禁用其iptables功能
之后运行如下命令
#启动chinadns

/etc/init.d/chinadns restart

#设置chinadns为开机自动启动

/etc/init.d/chinadns enable

#确认chinadns已经启动

netstat -an|grep 5353
之后配置dnsmasq,让其用chinadns作为上游dns。vi编辑/etc/dnsmasq.conf,在最后加入如下内容
no-resolv
server=127.0.0.1#5353
log-queries
这三行的意思是:1.禁用宽带提供商提供的dns 2.设置上游dns为127.0.0.1#5353 3.开启日志功能
之后,重启dnsmasq
/etc/init.d/dnsmasq restart
好了,可以试一试dns是不是有污染了,在路由器上运行
nslookup twitter.com
看看是不是得到了真实的ip
再来试一试局域网内的机器。首先需要清除本机的dns缓存。Windows下输入
ipconfig /flushdns
其它系统可以关闭wifi再打开即可

有问题如何调试

  • 确认chinadns已经启动,netstat -an|grep 5353
  • 确认chinadns可以工作,电脑上运行如下命令,nslookup -p 5353 twitter.com 192.168.1.1,确认得到正确解析
  • 确认dnsmasq可以工作,电脑上运行如下命令,nslookup -p 53 twitter.com 192.168.1.1,确认得到正确解析
  • 清楚本机缓存,或者重启

8.安装ipset

我们一直说要把特殊的域名打标记,但是至今还没有做什么嘛。是的,这就做起,就用ipset。首先安装他
opkg install ipset iptables-mod-nat-extra 
安装时,可能会提示如下
kmod: failed to insert /lib/modules/3.10.44/ip_set.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ip.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ipmac.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_port.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ip.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ipport.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ipportip.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_ipportnet.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_net.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_netiface.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_hash_netport.ko

kmod: failed to insert /lib/modules/3.10.44/ip_set_list_set.ko

kmod: failed to insert /lib/modules/3.10.44/xt_set.ko  
这个没有关系,需要重启一下路由器,再重启前,我们先把ipset初始化命令加入开机启动
编辑/etc/firewall.user,加入ipset -N setmefree iphash
之后运行reboot命令重启即可
重启好之后,登录路由器,然后运行
ipset list 
可以看到一个名为setmefree的节点,但是members为空
是时候加入需要打标签的域名了,vi编辑dnsmasq.conf,再到后面加入以下内容
#Google

ipset=/.google.com/setmefree

ipset=/.google.com.hk/setmefree

ipset=/.google.com.tw/setmefree

ipset=/.google.com.jp/setmefree

ipset=/.gstatic.com/setmefree

ipset=/.ggpht.com/setmefree

ipset=/.googleusercontent.com/setmefree

ipset=/.appspot.com/setmefree

ipset=/.googlecode.com/setmefree

ipset=/.googleapis.com/setmefree

ipset=/.google-analytics.com/setmefree

ipset=/.youtube.com/setmefree

ipset=/.googlevideo.com/setmefree

ipset=/.youtube-nocookie.com/setmefree

ipset=/.ytimg.com/setmefree

ipset=/.blogspot.com/setmefree

ipset=/.blogger.com/setmefree



#FaceBook

ipset=/.facebook.com/setmefree

ipset=/.thefacebook.com/setmefree

ipset=/.facebook.net/setmefree

ipset=/.fbcdn.net/setmefree

ipset=/.akamaihd.net/setmefree


#Twitter

ipset=/.twitter.com/setmefree

ipset=/.t.co/setmefree

ipset=/.bitly.com/setmefree

ipset=/.twimg.com/setmefree

ipset=/.tinypic.com/setmefree

ipset=/.yfrog.com/setmefree

#Flickr

ipset=/.flickr.com/setmefree

ipset=/.staticflickr.com/setmefree



#Wordpress

ipset=/.wordpress.org/setmefree

ipset=/.wordpress.com/setmefree

ipset=/.w.org/setmefree

ipset=/.wp.com/setmefree



#Others

ipset=/.dropbox.com/setmefree

ipset=/.github.com/setmefree

ipset=/.hk/setmefree

ipset=/.tw/setmefree

ipset=/.btdigg.org/setmefree

ipset=/.keepvid.com/setmefree

ipset=/.feedly.com/setmefree

ipset=/.godaddy.com/setmefree

ipset=/.digicert.com/setmefree

ipset=/.gravatar.com/setmefree

ipset=/.live.com/setmefree

ipset=/.zdassets.com/setmefree

ipset=/.cloudfront.net/setmefree

ipset=/.instagram.com/setmefree

ipset=/.playstation.net/setmefree

ipset=/.akadns.net/setmefree  
这些域名包括了经常访问的域名地址
解释一下ipset规则,该规则为泛域名结构,即如果.google.com会包括www.google.com,mail.google.com等一切子域名,所以如果你不爽,甚至可以.com,哈哈
你可能注意到google部分没有gmail,因为我的shadowsocks服务商,似乎不支持gmail的imap协议,导致邮件客户端无法访问gmail。因此我把它拿掉了,如果要访问gmail,可以用mail.google.com
重新启动dnsmasq
/etc/init.d/dnsmasq restart
之后,我们再来试一试
#查询一次域名查找

nslookup twitter

#看看ipset里面有什么

ipset list
如果不出意外的话,已经可以看到members下面有twitter.com的ip了

有问题如何调试

  • nslookup twitter.com后,确认ipset list结果中有ip
  • ipset flush setmefree,可以清除列表

9.配置shadowsocks

shadowsocks客户端主页: https://github.com/aa65535/openwrt-shadowsocks
有了打标记的ip,我们只需要将这些ip的访问通过shadowsocks转发出去即可
shadowsocks同样不在opkg软件列表中,需要手动下载,下载地址http://sourceforge.net/projects/openwrt-dist/files/shadowsocks-libev/ ,找到最新版本的ar71xx下的shadowsocks-libev-polarssl-xxx.ipk,下载并上传路由器并安装,方法同chinadns
默认该客户端是代理模式(socks5),我们需要使用转发模式
因此,编辑/etc/init.d/shadowsocks,将两行ss-local用#注释掉,再将ss-redir两行前的注释拿掉
编辑shadowsocks的配置文件 /etc/shadowsocks.json,按照服务提供商提供的信息,配置它,如
{

        "server": "ss02.8ke.co",

        "server_port": xxx,

        "local_port": 8964,

        "password": "xxxx",

        "method": "rc4-md5"

}
记录你的local_port,可以尝试启动一下
ss-redir /etc/shadowsocks.json
如果没有报错,就说明shadowsocks启动正常,ctrl-c杀掉他,用如下命令启动shadowsocks
#启动

/etc/init.d/shadowsocks restart

#加入开机启动

/etc/init.d/shadowsocks enable

#确认已经启动

netstat -an|grep 8964
有些版本的shadowsocks依赖有问题时,会报错缺少libpolarssl.so.5的错(版本有时候不是5),这时候只需要做一个符号链接即可
ln -s /usr/lib/libpolarssl.so /usr/lib/libpolarssl.so.5
最后,设置路由规则,让打标记的ip都去shadowsocks端口,运行如下命令
iptables -t nat -A PREROUTING -p tcp -m set --match-set setmefree dst -j REDIRECT --to-port 8964
注意端口用你配置的端口
然后将该命令加入/etc/firewall.user,让其随着开机一起启动

有问题如何调试

  • 确认shadowsocks已经启动,netstat -an|grep 8964
  • 确认路由表规则已经加入,iptables -t nat -L

到这里,所有的工作都完成了,打开浏览器,访问一下www.facebook.com,世界应该被还原了。

其实就是将被墙的站点通过dnsmasq+ipset打标记,然后通过iptables的路由功能将这些ipset通过shadowsocks转发出去。明白原理,一步一步弄,应该没有问题,如果有问题,看看每一步的如何调试,确认问题是出在哪里。总归,openwrt是个伟大的系统,自己动手,搭个站点在路由器上,也没有问题。感谢程序员们。
from https://story.tonylee.name/netgear-wndr4300-fan-qiang-shou-ce/ 
------------------

在WNDR4300路由器上,安装Openwrt,使用shadowsocks配置透明代理,使用chinadns+dnscrypt-proxy处理DNS污染

1 wndr4300刷openwrt固件

wndr4300在openwrt的官方支持列表中,但官方固件可使用空间只有12M,所以需要打一些补丁。本文所用固件来自我也分享 WNDR4300 14.07 固件,官方 ImageBuilder 编译,完全使用 128M flash,集成中文 Luci ,具体链接:openwrt-ar71xx-nand-wndr4300
刷机说明:
netgear原厂刷openwrt,必须刷结尾是factory.img的那个文件。由于无线网络缺省是关闭状态,必须使用网线,ip分配为dhcp自动分配,执行ping命令。返回成功后,可以使用telnet登录,没有密码。登录成功后,使用passwd命令改变root密码。然后使用ssh root@192.168.1.1 重新登录。也可以用 http://192.168.1.1,进入 luci web配置页面,此时的密码就是刚才设置的root密码。
ping 192.168.1.1
telnet 192.168.1.1
进入web页面后,在网络-无线菜单下,设置wifi ssid,密码,启动WIFI,然后就可以无线登录了。在网络-接口-LAN 下,选择修改,可以设置路由器的静态IP。如果多个串联,需要把地址设置为192.168.2/3/4.1等非192.168.1.1的情况。【!!!必须设置为静态IP,千万不要选dhcp等其他选项,否则后面无法登录系统】

wndr4300变砖后,通过tftp重新刷固件的恢复方法。
1、通过网线连接计算机和路由器的lan接口
2、在计算机上,ip地址设置为手工设定为 192.168.1.2 掩码255.255.255.0
3、关闭路由器电源开关。使用大头针或者类似工具,戳路由器背面的红色小孔(恢复出厂设置的孔),不要松开。
4、打开路由器电源开关,观察电源指示灯从黄色-变成绿色闪烁状态,然后可以放开大头针
5、在计算机上,进入存放待刷固件的目录(openwrt-ar71xx-nand-wndr4300-ubi-factory.img),使用tftp客户端 连接路由器。 mac os x命令如下:(-e 参数表示二进制模式)
tftp -e 192.168.1.1  
put openwrt-ar71xx-nand-wndr4300-ubi-factory.img
6 另开一个终端窗口,持续ping 192.168.1.1,等待连续ping连续成功后10秒以上,断开路由器电源开关。等待5秒钟,再打开路由器电源。继续观察ping结果。等待ping持续成功后,可以telnet 192.168.1.1,进入正常设置程序。

2 安装shadowsocks+chinadns

获取 shadowsocks忽略表
wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > ignore.list
注意:在luci配置的时候,要指定ignore.list文件的存放位置
获取chinadns 国内IP列表
curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt
在Luci中切换至“网络”-“DHCP/DNS”设置,如下图,在”DNS转发”中填入127.0.0.1#5353
然后切到HOSTS和解析文件选项卡,勾中“忽略解析文件”,忽略上级dns
安装dig工具
opkg install bind-dig
dig www.twitter.com

3 shadowsocks支持udp转发

1 服务器侧必须使用shadowsocks-libev版本,且启动参数中有-u
netstat -an | grep udp
已经有udp端口8888的监听
udp        0      0 0.0.0.0:8888            0.0.0.0:*
2在iptables中添加一条允许udp 8888端口通过的规则
sudo iptables -I INPUT -p udp --dport 8888 -j ACCEPT
3 在openwrt luci shadowsocks服务中,启用udp转发,端口5300,转发地址8.8.8.8:53 (google public dns)
/usr/bin/ss-tunnel -c /var/etc/shadowsocks.json -l 5300 -L 8.8.8.8:53 -f /var/run/ss-tunnel.pid -u
使用dig测试一下:
root@OpenWrt:~# dig @localhost -p 5300 www.twitter.com
;; ANSWER SECTION:
www.twitter.com.    354    IN    CNAME    twitter.com.
twitter.com.        1    IN    A    199.59.149.198
twitter.com.        1    IN    A    199.59.150.39

;; Query time: 274 msec
;; SERVER: 127.0.0.1#5300(127.0.0.1)
4 检查服务器侧数据,UDP包已经转发过来了
sudo iptables -L -v -n
464 39550 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:8888
5 配置chinadns,加上shadowssocks的UDP转发源
共配置4个dns服务器,分别是是阿里dns,114 dns,dnscrypt-proxy,shadowsocks udp转发端口
223.5.5.5,114.114.114.114,127.0.0.1:2053,127.0.0.1:5300

4 安装dnscrypt-proxy

添加软件源
src/gz exopenwrt http://exopenwrt.and.in.net/barrier_breaker/ar71xx/packages/exOpenWrt

opkg update
opkg install dnscrypt-proxy

启动
/etc/init.d/dnscrypt-proxy enable
/etc/init.d/dnscrypt-proxy start

配置文件是:
/etc/config/dnscrypt-proxy
缺省端口为2053

修改chinadns的国外源,缺省是8.8.4.4,建议修改为dnscrypt-proxy提供的源
127.0.0.1:2053

比较常用的几个服务器
208.67.220.220 https://www.opendns.com Cisco OpenDNS
180.131.144.144 http://www.nawala.id nawala Indonesia
106.185.41.36 http://meo.ws/dnsrec.php opennic-fvz-rec-jp-tk-01

5 使用shadowsock+gfwlist的方式翻墙

和利用ignore.list的方法的差别在于:前面的方法,只要IP不在国内,那么就需要启动代理,这种情况下,很多没有屏蔽的海外网站访问也通过代理,速度会下降很多。
而通过gfwlist的方式,只有针对在gfwlist限制范围内IP地址,才启动代理。
1.首先卸载前面已经安装但后面不再需要的包,注意shadowsocks-libev-spec 这个包是不需要的
opkg remove ip resolveip iptables-mod-tproxy shadowsocks-libev-spec
安装新的包(shadowsock-libev 没有spec后缀):
opkg install iptables-mod-nat-extra 
opkg install shadowsocks-libev
卸载dnsmasq,安装dnsmasq-full,full版本才支持需要用到的ipset特性
opkg remove dnsmasq && opkg install dnsmasq-full
2 配置/etc/shadowsock.json,和服务器配置一致。
修改/etc/init.d/shadowsocks, 启用ss-redir/ss-tunnel两个命令,关闭ss-local命令,注意ss-tunnel的监听端口5300不要和现有的端口冲突
SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
SERVICE_PID_FILE=/var/run/shadowsocks.pid
CONFIG=/etc/shadowsocks.json

start() {
#service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0  -f $SERVICE_PID_FILE
service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l 5300 -L 8.8.8.8:53
}

stop() {
#service_stop /usr/bin/ss-local
service_stop /usr/bin/ss-redir
service_stop /usr/bin/ss-tunnel
}
3 启动shadowsocks
/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks start
4 增加防火墙规则,并加入到/etc/rc.local,保证开机执行
ipset -N gfwlist iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080
5 修改 /etc/dnsmasq.conf ,在最后加入 conf-dir=/etc/dnsmasq.d ,新建并进入目录 /etc/dnsmasq.d ,下载dnsmasq_list.conf后放入该目录

6 挂载u盘,格式是fat32

需要执行的命令如下:
opkg update
opkg install kmod-usb-storage 
opkg install kmod-fs-vfat
opkg install kmod-nls-cp437
opkg install kmod-nls-utf8
opkg install kmod-nls-iso8859-1

#然后就可以
mount -t /dev/sda1 /mnt

7 定时任务

每天自动重启:
59 02 * * 1-7 /sbin/reboot 
每10分钟重启chinadns
*/10 * * * * /etc/init.d/chinadns restart >> /dev/null 2>&1
--------------

LINKSYS WRT1900ACS 刷机记


说一说LINKSYS WRT1900ACS这货吧,心仪很久了。AC的网络就不说了,双核1.6G的CPU,128M的闪存+512M的内存,简直牛逼的不要不要的。另外要说WRT1900系列一共有三个型号:V1,V2,S,S是目前最高的。AC系列之所以入法眼,除了其配置之外,还因为其厂家明确表示支持OpenWrt,因此不会存在驱动无法解决的问题,好评如潮。
到手后没有立即开箱,抱着侥幸的心里,挂在2淘宝上+200想试试能不能卖掉,结果一周后没有得偿所愿,遂开箱自用了。因为之前为NETGEAR WNDR4300写的教程有点老了,虽然里面有一个很有价值的部分是介绍国家防火墙的原理,但科学上网部分的教程明显跟不上新发展了,于是借此机会,重写教程,大致上所有路由器都通用。

1.刷OpenWrt

开机通电,原厂ROM竟然要填写一大堆初始化信息才给进入主界面。选择连接->手动升级,上传刚刚下载的ROM即可。这里最好用有线网络,因为无线传输万一发生问题可能就永远Goodbye了。等待几秒钟,路由器自动重启就好了。

2.初始化设置

OpenWrt初始化后,是只能靠有线连接进行设置的。输入192.168.1.1进入登录界面,因为此时还没有设置密码,直接点击登录即可进入主界面。此时⚠️界面上方的更改密码的提示。点进去更改密码。同时,因为我要经常用到SSH,所以把自己的公钥输入到界面下方。
做的第一件事情自然是开启WiFi了。在主页面WiFi名字处,可以看到有两个信号,一个是2.4G的,一个是5G的。按照自己的意愿点进去更改即可,注意三件事情:
  • 信道宽度选择40MHz,可以加快理论传输速度
  • 5G的默认信道我的Macbook连接不上,我更换了一个信道就好了
  • 增加功率可以扩大信号范围,反正我是直接选最大的
另外,我是将该路由器下挂到联通猫的下方,因此IP不能冲突,需要将该路由器网段设置为192.168.2.0/24

3.增加第三方源

以前安装科学上网模块,都是自己上传ipk文件来安装的,现在有了第三方源,就可以像安装系统模块一样直接联网安装了。但是科学上网的第三方源架设在sourceforge,经常被墙,在你还没有完成科学上网设置时,是无法正常访问的,因此我搭建了一个自己的镜像,http://openwrt-dist.tonylee.name/,欢迎大家使用。
因为第三方源没有签名,所以需要先关闭签名验证,否则无法安装科学上网模块。SSH进入路由器,编辑/etc/opkg.conf,注释掉signature的一行。然后按照http://openwrt-dist.tonylee.name/的提示,选择合适的架构和配置信息。LINKSYS WRT1900ACS属于mvebu架构。然后把源地址信息添加到/etc/opkg.conf末尾,运行opkg update进行更新即可。

4.更新网络驱动

If experiencing WiFi stability issues, verify installed WiFi driver version; update if newer version is offered, then verify if issue is still present:
我以为随着新版的OpenWrt已经集成了新版的驱动,或者至少已经没有这个问题了。但是,事实证明依然需要打补丁。通过几天的测试发现,5G信号在官方ROM下,过几个小时就开始出现性能问题,内核日志一大堆错误。看来补丁依然是要打得。
opkg update ; opkg install git-http ; cd /tmp ; git clone --depth 1 https://github.com/NemoAlex/mwlwifi-bin.git ; cd mwlwifi-bin/15.05.1 ; opkg install kmod-mwlwifi_3.18.23\+10.3.0.17-20160531-1_mvebu.ipk ; reboot  

5.设置无污染DNS

以前需要使用诸如chinadns之类的项目,才能做到国外的DNS解析无污染,国内的DNS解析正常。但是现在不用了,中科大LUG小组为大家公开了两组无污染的DNS服务器202.38.93.153 202.141.162.123。设置DNS服务器只需要登录web控制台,找到Network->DNS,然后把这两个值填写到DNS Forwardings里。另外,我设置了/.cn/192.168.1.1是想让.cn的域名通过联通自己的DNS解析,这样对于中国网站,可以路由到正确的CDN上。
另外,宽带拨号成功后,都会自动获取DNS服务器。保险期间,我们还要禁用联通下发到本路由器的DNS服务器地址。在第二个页签,Resolv and Hosts Files,勾选Ignore resolve file。这样,就完成了DNS的改造设置。

6.安装和设置科学上网模块

尽然已经添加了第三方源,我们就可以直接安装第三方模块了。SSH登录路由器,运行以下命令安装三个科学上网模块
opkg update  
opkg install ChinaDNS  
opkg install shadowsocks-libev  
opkg install luci-app-shadowsocks  
不是说不需要chinadns了吗,为什么还安装?因为SS模块需要根据chinadns的chinaroute列表来做动态规划,让国外的域名走代理,国内的直连,因此需要安装该模块,算是一种依赖吧。
之后重现刷新web页面,就可以看到Service->ShadowSocks配置页面了。这里的配置比较简单,配置好服务器再启用即可了。

7.配置NAS

配置NAS,首先要讲OpenWrt对于不同文件系统的支持力度,talk is cheap,上图自然明了.
可以看到,毕竟OpenWrt属于Linux,对于ext的分区系统支持都比较好,对于ntfs系统,读取,还行吧,写入,那个可怜的2M速度,不要表了……。对于exfat,看内核,至少目前最新的OpenWrt是无法支持扩展的,15.05似乎可以。对于WRT1900ACS的官方OpenWrt系统来说,USB驱动都是现成可用的,不需要单独安装,只需要安装扩展需要的文件系统支持就可以了

7.1增加对ntfs的支持

通过安装ntfs-3g,即可支持对于ntfs的读写
opkg install ntfs-3g  
对于ntfs格式的热插拔自动挂载,我一直没有搞定,因此不表了……,谁研究透了告诉我。因此我每次只能手动挂载
ntfs-3g /dev/sda1 /mnt/usb-ntfs -o rw,sync  
第一个参数是设备地址,第二个目录是挂载地址。我如何知道我的设备地址呢?可以安装blkid,命令行运行blkid即可看到设备的地址信息
当然开机自动挂载还是可以实现的,在/etc/rc.local中增加如下脚本即可
sleep 3

ntfs-3g /dev/sda1 /mnt/usb-ntfs -o rw,sync

exit 0  

7.2增加对ext4的支持

说对ext分区支持的好,不仅是因为其读写都是全速,更是因为其自动挂载等功能都是全都支持的,甚至可以在web界面进行配置。 首先通过opkg install kmod-fs-ext4安装对于ext4分区的支持,然后通过opkg install block-mount来增加自动挂载的配置功能。安装完block-mount需要运行一下block detect > /etc/config/fstab去生成fstab列表,不知道这是不是个bug。总之这样子就可以在web界面进行配置了。
从菜单System->Block Mount即可进入block-mount的配置界面。首页显示的是已经挂载的磁盘列表,点击新增即可配置还未挂载的磁盘.
可通过多种方式匹配,一般来说UUID是最好的。然后再填入Mount Point,即挂载点,即可实现插入磁盘自动挂载了

7.3开启Windows共享(Samba)

挂载了磁盘,自然是为了在局域网中自由存取。目前最广泛通用的网络共享协议,居然还是Windows网络共享,即Samba。通过以下命令,即可安装Samba模块
opkg install samba36-server  
opkg install luci-app-samba  
之后通过菜单Services->Network Shares,即可进入配置界面。但首先,如果你需要严谨的用户权限体系,而不是只是简单的Guest用户分享的话,你需要先配置Samba用户名密码。SSH进入后台,用命令smbpasswd -a xxx增加你需要的用户。注意,用户必须是系统中已经存在的。然后使用命令smbpasswd xxx来更改xxx用户的访问密码。之后就可以开始配置共享磁盘了。在页面点击新增,输入共享目录地址,共享名称,选择是哪个用户的访问权限,是否只读等,就可以启用了。有几点需要注意的:
  • 默认情况下,guest用户即使选择了非只读,也无法写磁盘。原因是guest默认是映射为nobody用户,而磁盘是root用户挂载的,因此无法写入。处理方法是在template页签中,将guest的映射用户改为root。
  • 如上所述,samba的用户密码不是系统的用户密码,必须通过smbpasswd来设置

7.配置远程下载

目前比较流行的下载方式,都是在网盘中下载好东西后,利用插件倒出配置,在通过aria2进行下载。因此,如果要做到远程下载,就需要配置aria2

7.1安装配置aria2

2016年12月30日更新。因为遇到aria2奔溃退出的问题,为了解决奔溃后能够自动恢复下载进度,增加新的选项
首先,通过opkg install aria2安装软件 。其次,创建aria2所需的记录会话进度的空文件/etc/aria2/aria2.session
然后用命令
aria2c --enable-rpc \  
--rpc-listen-all \
--rpc-allow-origin-all \
--dir /mnt/public/WDHDD \
--continue=true \
--disable-ipv6=true \
--input-file=/etc/aria2/aria2.session \
--save-session=/etc/aria2/aria2.session \
--save-session-interval=60 \
--rpc-listen-port=6800 \
--max-concurrent-downloads=3 \
-D
启动即可
有几点需要注意的:
  • --dir参数配置的是默认的下载路径,设置为自己的下载路径
  • 把以上命令放入/etc/rc.local即可实现开机自动启动

7.2 安装配置yaaw

有了aria2的后台服务,基本上通过浏览器插件,就可以把115或者百度云的资料,直接甩到路由器上进行下载了。甚至你家的路由器如果有公网入口,直接可以实现在单位控制路由器下载想要的东西了。如果你还需要安装一个可视化的监控窗口,那么你就需要yaaw——一个简单的界面。yaaw的工程在这里。因为是个git工程,我们最简单的办法是通过git下载。首先安装支持https的git模块
opkg remove git  
opkg install git-http  
然后在/www目录下运行
git clone https://github.com/binux/yaaw.git  
下载好之后,不需要过多配置,直接在浏览器中访问http://192.168.2.1/yaaw即可访问web控制台

8.结束语

至此,配置完毕,应该可以愉快的耍了。用了差不多两周,总结一下:
  • 不用担心稳定。NETGEAR WNDR4300都那么稳定,一千块的路由器还能不稳定?!两周内没有死机过。期间正常上网,翻墙,看1080p的电影。
  • NAS性能实测:ntfs的盘,挂USB3.0接口上,读取10Mb/s,写入2Mb/s;ext4的盘,挂USB2.0的接口上,读取20Mb/s,写入10Mb/s。应该还有优化空间。但是读写过程中,CPU负荷只有10%,非常强悍。
  • 信号强度。据说刷了OpenWrt的路由器,信号都没有原厂的好。没有进行对比,但是我家100平,所有角落5G信号都能正常连接,肯定够用
  • 信号稳定度。在5G信号下,用mac系统,尝试往ntfs盘写入10G数据。smb无论如何无法正常完成。改用sftp,中断一次,第二次完成。2.4G信号未测试过,下次可以尝试。

9.后记

2016年12月18日补充
发现WIFI或者IO还是有一些问题,表现是几天不重启,明显就出现了Plex的卡顿,一重启就好了。因此,在System->Scheduled Tasks中加入定时重启任务,每天临晨4:30自动重启一次,如下:
# Reboot at 4:30am every day
# Note: To avoid infinite reboot loop, wait 70 seconds
# and touch a file in /etc so clock will be set
# properly to 4:31 on reboot before cron starts.
30 4 * * * sleep 70 && touch /etc/banner && reboot  
看来OpenWrt还是任重道远
好了,基本就这样。 
from:https://story.tonylee.name/2016/12/08/linksys-wrt1900acs-shua-ji-ji-2/
-----------------------------------------------

netgear R7000 shadowsocks客户端

各种不爽,最近拿到款netgear r7000路由器几个月,竟然无法翻墙。

第三方dd-wrt,刷了之后却无法安装软件,等于废了120%,还各种不稳定。 至于openwrt,不用提了,满脸伤心泪,早知道当初就弄个openwrt列表中的了。 后来实在受不了openwrt raspberry pi的各种问题(虽然最后有可能是个伤心的误会),决 定试试tomato了。刷了之后,还是一堆问题,最后却没办法直接刷回去了。

既然tomato也是开源的,那就找找源代码吧,结果竟然找到了完整的源代码,感谢shibby

我之前也找了dd-wrt源代码,由于不在官方列表中,各种不爽,各种缺失,最后不了了之。 在和GFW的激烈战斗中,终于下完整了所有源代码。首先编译检查,没有任何问题。我并不 想将shadowsocks编译到固件中,这样不利于更新,因此,我决定放到jffs2中。

结果与使用方法

shadowsocks客户端 将jffs挂载到opt下,我的这个版本的选项在Administration->JFFS中,对tomato不熟悉, 没有发言权,enable JFFS, 然后format/erase, 填入”当挂载的时候执行命令”以下内容
mount -o bind /jffs/opt /opt && /opt/bin/start_cron.sh
start_cron.sh在压缩包的bin目录下,之所以这样弄是为了将检查shadowsocks和pdnsd的脚 本加入到定时任务中,这样一旦由于某种原因挂了之后,可以自动的重新启动。之所以这样 弄是因为在我的这个版本中,计划任务的这个无论如何都无法启动执行,不知道tomato的这 个问题原因在那儿,而tomato又使用的是cru,并非常用的cron,反正就这样,能用就行。 pdnsd和shadowsocks的配置都在etc中,自己酌情配置,pdnsd中我配置的是google的dns,走 tcp。

自己编译

我编译出来的shadowsocks可能比较老旧,如果你想自己编译的话,这里就是方法了:
  1. 将shadowsocks和pdnsd的源代码放置到源代码的router目录下。
  2. 在router/Makefile中添加如下内容:
obj-y += shadowsocks-libev
obj-y += pdnsd

shadowsocks-libev:
    cd shadowsocks-libev && CC=$(CC) STRIP=$(STRIP) \
        CPPFLAGS="-Os -Wall $(EXTRACFLAGS) -ffunction-sections -fdata-sections -I$(TOP)/zlib" \
        LDFLAGS="-L$(TOP)/zlib -ffunction-sections -fdata-sections -Wl,--gc-sections -fPIC" \
        $(CONFIGURE) --prefix=$(INSTALLDIR)/shadowsocks-libev

shadowsocks-libev-install: shadowsocks-libev
    $(MAKE) -C shadowsocks-libev install

pdnsd: 
    cd pdnsd && CC=$(CC) STRIP=$(STRIP) \
        CPPFLAGS="-Os -Wall $(EXTRACFLAGS) -ffunction-sections -fdata-sections -I$(TOP)/zlib" \
        LDFLAGS="-L$(TOP)/zlib -ffunction-sections -fdata-sections -Wl,--gc-sections -fPIC" \
        $(CONFIGURE) --prefix=$(INSTALLDIR)/pdnsd --with-cachedir=$(INSTALLDIR)/pdnsd

pdnsd-install: pdnsd
    $(MAKE) -C pdnsd install
  1. 编译路由器代码,在我这边是这样子的:
make r7000e
  1. 编译后的那两个软件包在arm-uclibc/install下的各自的目录中.
from  https://4096.info/2015/02/16/netgear-r7000-shadowsocks%E5%AE%A2%E6%88%B7%E7%AB%AF/
---------

OpenWrt-dist

http://sourceforge.net/p/openwrt-dist/wiki/Home/

目录列表:

目录简介
chinadnsDNS 反劫持及线路优化 - @GitHub
dnsmasq添加 DNS 反劫持功能 - @GitHub
shadowsocks-libevOpenWrt 的优化版本 - @GitHub
shadowvpn适合 OpenWrt 设备使用的 VPN 方案 - @GitHub
luci-app适用于本项目的 LuCI 配置界面 - @GitHub
depends-libs相关依赖库, 大部分可以在更新源安装

架构列表:

架构CPU型号
ar71xxAR7xxx/AR9xxx/QCA9xxx
atherosAR231x/AR5xxx
bcm53xxBCM47xx/53xx (ARM CPU)
brcm47xxBCM47xx/53xx (MIPS)
brcm63xxBCM63xx
ramips_24kecRT3x5x/RT5350/MT7620a/MT7620n/MT7621
注1: 使用 opkg print-architecture | awk '{print $2}' 查看支持架构
注2: 被支持的 at91 x86 x86_64 未在上表中列出

安装说明:

注: 下文中 packagename 请根据实际情况修改
opkg 命令参数请参考 OpenWrt Wiki
更多安装方式请参考 项目首页
  • OPKG安装
    1. 将下载的IPK上传至路由器, 或者直接在路由器使用 wget 下载;
    2. SSH 到路由器, 使用 opkg install {packagename}.ipk 命令完成安装;
    若 ramips_24kec 包安装时出现 incompatible with the architectures configured 错误,
    可编辑 /etc/opkg.conf 调整架构支持, 在文件末尾添加(也可以通过 LuCI 设置页面添加):
    arch all 100
    arch ramips 200
    arch ramips_24kec 300
    添加完成后使用 opkg update 命令更新一次
    再次使用 opkg install {packagename}.ipk 命令安装
  • 手动安装
    1. 解压 ipk 包: tar xzf {packagename}.ipk
    2. 解压 data 包完成安装: tar xzf data.tar.gz -C /
    3. 删除临时文件: rm control.tar.gz data.tar.gz debian-binary
    注: 上面 3 条命令注意复制完整并替换 packagename
    手动安装后没有卸载信息, 建议只在自动安装失败时使用
    如需要卸载, 可以直接删除步骤 2 中解压出的文件

使用说明:

DNS 配置请参考 防DNS劫持
命令行下设置请参考 UCI系统 
---------------------------------------------

新的基于OpenWrt路由器的(不完全)自动翻墙方案


下面这个方法,需要一些人工维护工作,不完全自动。

方案

这个方案使用如下的技术手段:
  • OpenWrt路由器软件
  • Shadowsocks加密Socks5代理
  • iptables geoip模块
  • shadowsocks tunnel转发DNS请求
  • iptables u32或string模块过滤错误的DNS结果(已经失效)
  • dnsmasq带国内CDN列表,这个列表需要经常更新。
  • ChinaDNS-C智能分流DNS请求

特点

这个自动翻墙方案有如下特点:
  • 本方案基于路由器,所以任何连接该路由器的主机都可以自动翻墙。
  • 本方案使用shadowsocks翻墙,速度优于VPN和SSH。
  • 本方案基于目标IP的地理位置,决定是直接连接目标IP还是翻墙连接。对于所有中国IP会直接连接,所以不影响访问国内网站的速度。 即使是根据DNS查询做优化的网站也不会有影响,因为该方案优先使用国内DNS服务器的结果。所有非中国的IP都会选择翻墙连接。 有人觉得这样不是最有效率的因为不是所有国外IP都是被封的,但是我觉得凡是流过GFW的流量,都要翻墙加密才是安全的, 否则就有可能遭遇各种不幸。
  • 这个方案最大优点是可以使你完全感觉不到GFW的存在,这会使你的上网习惯有很大的变化。
  • 缺点是UDP包不能翻墙。这是Shadowsocks的特性决定的。

准备工作

开始前我们需要做的准备有:
  • 在路由器上安装OpenWrt。OpenWrt支持这些硬件。以TP-LINK TL-WDR4300为例, 在硬件列表上可以找到它的链接,点击后有详细的安装步骤。
  • 配置OpenWrt可以正常上网。这里有刚安装进行第一次登录的帮助。 这里有基本配置帮助。
  • 准备一台安装了Shadowsocks的国外服务器。如果没有的话,可以去任何VPS提供商那里买一台廉价的VPS,在上面装上shadowsocks。 安装步骤在这里有。
  • 要会用基本的VI编辑器操作,会最简单的打开编辑保存功能就可以了。

安装步骤

接下来我们开始动手安装
  1. 远程登录OpenWrt路由器。如果不知道如何登录,看之前的第一次登录帮助。
  2. 下载安装ShadowSocks for OpenWrt。在这里(可能需要翻墙才能打开)可以找到源代码和编译好的安装包(只支持部分架构)。比如我的路由器是ar71xx架构,直接下载编译好的shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk就可以了,可以运行:
    wget  http://shadowsocks.org/nightly/shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk
    opkg  update
    opkg  install  libpolarssl
    opkg  install  shadowsocks-libev-polarssl_1.4.6_ar71xx.ipk`
  3. 尝试在路由器上运行ss-redir命令,如果打印出一堆帮助信息,说明安装正确了。如果打印出类似下面找不到链接库的错误:
    ss-redir: can't load library 'libpolarssl.so.5'
    这时就需要创建一个符号链接来解决这个问题:
    cd /usr/lib
    ln -s libpolarssl.so.1.3.4 libpolarssl.so.6
  4. 配置shadowsocks。编辑配置文件/etc/config/shadowsocks.json,将shadowsocks服务器参数写在这个配置文件里面。修改/etc/init.d/shadowsocks,把所有ss-local替换为ss-redir。
  5. 然后重启shadowsocks。
    /etc/init.d/shadowsocks enable
    /etc/init.d/shadowsocks restart
  6. 下载中国CDN域名列表,放在/etc/dnsmasq.d/目录下。(如果没有这个目录,先创建它。)
  7. 在/etc/dnsmasq.conf文件中加入如下一行:
    conf-dir=/etc/dnsmasq.d
  8. 重启dnsmasq:
    /etc/init.d/dnsmasq restart
  9. 创建一个新文件/etc/init.d/ss-tunnel,带如下内容:
    #!/bin/sh /etc/rc.common
    
    START=95
    
    SERVICE_USE_PID=1
    SERVICE_WRITE_PID=1
    SERVICE_DAEMONIZE=1
    
    CONFIG=/etc/shadowsocks.json
    
    start() {
        service_start /usr/bin/ss-tunnel -c $CONFIG -l 5353 -L 8.8.4.4:53 -u
    }
    
    stop() {
        service_stop /usr/bin/ss-tunnel
    }
  10. 运行下面这个命令来启动ss-tunnel:
    /etc/init.d/ss-tunnel enable
    /etc/init.d/ss-tunnel start
  11. 安装iptables nat-extra、geoip模块。
    opkg update
    opkg install iptables-mod-geoip
    opkg install iptables-mod-nat-extra
  12. 生成IP国家信息数据库。在某台Mac或者Linux上下载并解压缩xtables-addons源码,然后按照这篇文档的步骤生成IP数据库。
  13. 将中国的IP信息(CN开始的文件)拷贝到路由器/usr/share/xt_geoip/BE或者/usr/share/xt_geoip/LE。是BE还是LE取决于你的路由器的CPU架构是Big Endian还是Little Endian。如果你不确定你的路由器是什么架构类型,可以两个目录都放进去。
  14. 将如下防火墙规则写入 /etc/firewall.user 。将TCP流量重定向到shadowsocks。(假设shadowsocks的本地端口是1080)
    iptables -N fuckgfw -t nat
    iptables -F fuckgfw -t nat
    
    #bypass DNS servers
    iptables -A fuckgfw -t nat -p tcp -d 8.8.8.8 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 8.8.4.4 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 208.67.222.222 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 208.67.220.220 -j RETURN
    
    #bypass local connections
    iptables -A fuckgfw -t nat -p tcp -d 192.168.0.0/16 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 172.16.0.0/12 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 10.0.0.0/8 -j RETURN
    iptables -A fuckgfw -t nat -p tcp -d 127.0.0.0/8 -j RETURN
    
    #bypass iOS notification, PPTP and other connections
    iptables -A fuckgfw -t nat -p tcp -d 17.0.0.0/8 --dport 5223 -j RETURN
    iptables -A fuckgfw -t nat -p tcp --dport 1723 -j RETURN
    
    #Redirect all others to Shadowsocks
    iptables -A fuckgfw -t nat -p tcp -j REDIRECT --to-port 1080
    
    #goto fuckgfw chain if the destination is not China IP
    iptables -A prerouting_rule -t nat -m geoip -p tcp ! --destination-country CN -j fuckgfw
  15. 重启firewall
    # /etc/init.d/firewall restart
  16. 这时可以测试自动翻墙功能是否工作。可以打开 http://icanhazip.com/ 这个网页,看看现在IP是不是你的国外ShadowSocks服务器的IP。然后打开 http://pv.sohu.com/cityjson 这个网页,看显示的是不是ISP提供的国内IP地址。测试是否能打开facebook和youtube。如果都可以,大功告成!

变化

本方案可以有以下一些变化的方案
  • 可以用SSH Tunnel代替ShadowSocks。优点是国外的SSH服务器更容易找到,缺点是速度不如ShadowSocks。
  • 可以用VPN代替Shadowsocks。优点是UDP也能翻墙,缺点是,速度较慢,配置比较复杂。
  • 可以在ShadowSocks之上架设HTTP Proxy(比如polipo),然后在浏览器和其它应用中手动配置代理翻墙。
  • 可以配置自动代理发现,让浏览器不复杂配置就可以自动翻墙。路由器上添加一个主机名wpad,指向路由器的IP。 在路由器 /www/ 目录下添加一个wpad.dat文件,内容类似:
    function FindProxyForURL(url,host) {
        if( isPlainHostName(host) ||
             isInNet(host, "10.0.0.0", "255.0.0.0") ||
             isInNet(host, "192.168.0.0", "255.255.0.0") ||
             isInNet(host, "127.0.0.0", "255.0.0.0") ||
             dnsDomainIs(host, ".cn")
         )  return "DIRECT;";
         return "SOCKS 192.168.1.1:1080; PROXY 192.168.1.1:3128;";
         //shadowsocks地址和http代理地址
     }
    IE、Mac或者iPhone上都可以打开自动代理配置选项来自动发现这个配置。
  • 可以在ShadowSocks和Http代理之间,加一个`smartproxy `_,功能类似iptables geoip,让目标IP是国外的走上层ShadowSocks,否则就直连。