1. 1. 一、shadowsocks 安装
  2. 2. 二、shadowsocks 配置
    1. 2.1. 方案一
    2. 2.2. 方案二
    3. 2.3. 方案三
Table of Contents ▼

Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙

原文地址:https://cokebar.info/archives/664#method1

这篇文章介绍的方法基于aa65535的shadowsocks-spec for openwrt,介绍了如何在OpenWRT下配置自动翻墙,新版本支持在Luci下图形化配置,大大简化了配置过程。配置完成后,路由器本身获得自动翻墙能力,所有连入该路由的设备都可无障碍访问被墙的站点。是运行于路由器的透明代理。


方案根据IP判断是否代理,国内IP不代理,国外IP走代理。代理通过shadowsocks所带ss-redir做TCP转发实现,分国内外IP通过国内IP段列表文件chnroute来区别,并通过iptables规则分别处理(这些功能已经全部集成到shadowsocks-spec里了无需额外配置)。由于是基于IP的判定,故需要解决DNS污染的问题,故搭配使用ChinaDNS来解决。

由于只要国外IP均走代理,而不是被墙才走代理,那么本方案的优缺点也就很明显了。

优点:基本不会有漏网之鱼,保证所有被墙站点能访问;能够一定程度改善国内访问一些国外网站缓慢的问题,如果你的服务器速度很好,那么甚至可以起到加速国外站点访问的作用。

缺点:如果服务器速度一般,访问一些网站甚至会减速;对一些限制IP的站点和软件应用可能会造成麻烦。总之,请酌情选择。

本方案主要涉及到的开源项目

https://github.com/aa65535/openwrt-shadowsocks

https://github.com/aa65535/openwrt-chinadns

https://github.com/aa65535/openwrt-redsocks2

https://github.com/aa65535/openwrt-dist-luci

https://github.com/madeye/shadowsocks-libev

https://github.com/clowwindy/ChinaDNS

一、shadowsocks 安装

次安装的话,先安装必要的包,确保路由器联网,先更新软件包列表(下载有问题的请手动到openwrt.org下载所有需要的包并上传到路由器上使用opkg install XXX.ipk命令安装):

opkg update
shadowsocks有openssl(文件名是shadowsocks-libev-spec-X.XX.ipk)和polarssl(文件名是shadowsocks-libev-spec-polarssl-X.XX.ipk)两个版本选择,ROM空间吃紧的就选择后者吧。 先安装必要的包,如果要用polarssl版本的shadowsocks(polarssl体积更小):
opkg install ipset libpolarssl resolveip
如果要用普通版本(openssl)的shadowsocks,那么(openssl兼容性更好):
opkg install ipset libopenssl resolveip
期间可能会遇到类似以下的错误提示:
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
...
没关系,这时因为安装ipset包后需要重启,我们此时先重启一次路由器。 > 然后下载下面四个包,前两个ipk包需要根据自己CPU型号选择: > > 下载地址: > > shadowsocks-spec: http://sourceforge.net/projects/openwrt-dist/files/shadowsocks-libev/ > > chinadns-openwrt: http://sourceforge.net/projects/openwrt-dist/files/chinadns/ > > > luci-app-shadowsocks: http://sourceforge.net/projects/openwrt-dist/files/luci-app/shadowsocks-spec/ > > > luci-app-chinadns: http://sourceforge.net/projects/openwrt-dist/files/luci-app/chinadns/ 接着将下载的包通过WinSCP之类的工具上传至路由器的/tmp目录。 接着安装shadowsocks和chinadns,一步步执行:
cd /tmp
opkg install shadowsocks-libev-spec_x.x.x-x_ar71xx.ipk
opkg install ChinaDNS_x.x.x-x_ar71xx.ipk
opkg install luci-app-chinadns_x.x.x-x_all.ipk
opkg install luci-app-shadowsocks-spec_x.x.x-x_all.ipk
特别提醒:2015.1.8,由于ChinaDNS-C更名为ChinaDNS,所以包名有变化,此前安装过ChinaDNS-C的,需要手动卸载并重新安装新版。 安装完成后,shadowsocks和chinadns应该会被配置成开机启动,如果发现没有生效,运行:
/etc/init.d/shadowsocks enable
/etc/init.d/chinadns enable

二、shadowsocks 配置

我们登陆Luci,指向“服务”,此时应该能够看到shadowsocks和chinadns了。

点击shadowsocks,取消勾选“使用配置文件”,新的选项就出来了,我们把服务器信息填进去,代理方式选择“忽略列表”,然后先把下面UDP转发功能关闭,然后保存并应用(选项不要留空)。服务器地址请尽量填入IP,否则容易出问题! 全部完成后,刷新页面,确保shadowsocks是已启动状态。否则请检查配置。

[caption id=”” align=”alignnone” width=”345”]shadowsocks shadowsocks[/caption]

shadowsocks

当然,你可以继续使用 config.json 进行配置,格式如下:

{
“server”: “X.X.X.X”,
“server_port”: “443”,
“password”: “password”,
“local_port”: “1080”,
“method”: “rc4-md5”
}

最后记得在Luci里面填把“使用配置文件”勾上,然后填写配置文件位置(不要留空):
config
然后看一下ChinaDNS的配置界面,此时可以先按照默认的配置来,确保ChinaDNS可以正常启动,也可以参考下面:
method3
做出说明:

ChinaDNS参数说明:

1、虚假IP列表:默认值:/etc/chinadns_iplist.txt

是GFW常见的DNS污染用IP列表,解析出列表中的IP结果时候,ChinaDNS会自动抛弃,保留默认即可;

2、chnroute文件:默认值:/etc/chinadns_chnroute.txt

此文件标识哪些IP属于国内。用于ChinaDNS判断解析结果。ChinaDNS要求解析结果与DNS要匹配,国内网站采用国内DNS解析的结果,国外网站采用国外DNS解析结果,等等规则;确保以上两个文件内容完整无误,否则会造成无法启动;

3、本地端口:默认值:5353

ChinaDNS所监听的端口。根据实际情况更改,注意不能和其他服务的端口重复(特别是dnsmasq和shadowsocks);

4、上游服务器:默认值:114.114.114.114,8.8.8.8

可填入一系列的上游DNS服务器,根据实际情况来,可以保留默认,注意逗号后面不能有空格。有些ISP会封杀公共DNS,此时请将114DNS改为ISP的DNS;此处必须至少填入一个国内IP的DNS和一个国外IP的DNS,否则会造成ChinaDNS启动失败。

4、等待时间: 默认值:0.3

为防止GFW的DNS污染抢答,而设置一个等待时间,请根据自己填写的国外DNS延迟值来填写,留下一定的裕度。GoogleDNS在国内延迟一般在100-200ms,留0.3比较合适。过大的值会造成DNS解析较大的延迟时间,过小的值可能导致无法接收正确的解析结果。

5、双向过滤: 默认:勾选

勾选时,当国外DNS服务器返回的查询结果是国内IP,或者当国内DNS服务器返回的查询结果是国外IP,则过滤掉这个结果(较为严格的模式);去掉勾选的话只是过滤国内DNS的国外IP结果。

6、启用压缩指针: 默认:不勾选

利用GFW遇到压缩指针时的一个bug来精确识别来自GFW的抢答污染,从而极大提高识别的准确性和识别的效率,推荐启用,启用后,IPList和等待时间将禁用(因为用不到了)。
然后,在Luci中切换至“网络”-“DHCP/DNS”设置,如下图,在”DNS转发”中填入127.0.0.1#5353
dnsforwarder

其中,5353是ChinaDNS的端口,如果你在之前设置界面里改了,这里记得别填错。

然后切到HOSTS和解析文件选项卡,勾中“忽略解析文件”

接下来的步骤会有区别,通过ChinaDNS进行防DNS污染及解析结果优化,方案有三:

1、对于shadowsocks是用自己服务器搭建的,推荐方案一,在自己服务器上搭建DNS服务;

2、如果没有这个条件,但服务器支持UDP转发(较新版本Shadowsocks均支持),那么方案二;

3、如果服务器Shadowsocks版本老,不支持UDP转发,那么可用方案三,要求版本>=1.2.0;

4、如果方案三不好用,可以考虑使用方案四:TCP 方式查询解决 DNS 污染问题

前两种方案,目前来说是绝对没有DNS污染现象的,此时ChinaDNS的作用完全就是为国外站点做解析优化,因为DNS查询由代理服务器转发,DNS查询的发起者相当于代理服务器,获得的解析结果都是就近于代理服务器的;而方案三则会直面DNS污染,此时ChinaDNS的防污染功能发挥作用,同时方案三无法做到国外网站解析结果优化,因为获得的IP是就近于你的位置的。方案四则可以有效的避免国外DNS的污染,不过同样也无法做到国外网站解析结果优化。

然而对于前两种方案,也可能存在一些问题(很少见)

方案一

在代理服务器上搭建DNS服务来解析国外网站,可用dnsmasq或者pdnsd,监听非53端口。

比如说服务器IP是:3.4.5.6,dns服务端口是5050,那么,把ChinaDNS的上游服务器更改为:

114.114.114.114,3.4.5.6:5050,等待时间改为0.1秒(视VPS延迟酌情增加);有些ISP使用114DNS可能效果不佳,此时可以将114DNS换成本地ISP的;

method12

也可以勾选“启用压缩指针”,这样就无需延迟时间了:

method11

最后,确保shadowsocks的设置页面里面的UDP转发是关闭状态。保存并应用,确认shadowsocks和chinadns都显示已启动后,就可以测试一下了~

方案二

使用shadowsocks代理DNS请求。首先开启shadowsocks的DNS转发,并确保端口号不和ChinaDNS的一样,比如说我们改成5151;转发地址留默认的GoogleDNS即可,你也可以自行更改,格式是“IP:端口”。

方案二

然后配置ChinaDNS的上游DNS服务器为: 114.114.114.114,127.0.0.1:5151,等待时间填0.1(视VPS延迟酌情增加),其他酌情填写;有些ISP使用114DNS可能效果不佳,此时可以将114DNS换成本地ISP的:

method22

也可以勾选“启用压缩指针”,这样就无需延迟时间了:

method21

保存并应用,确认shadowsocks和chinadns都显示已启动后,Enjoy~

方案三

首先确保shadowsocks配置页面的UDP转发关闭;并且确保你可以正常使用国外公共DNS服务。

切换至ChinaDNS界面,填入上游服务器地址,可以保留默认的114.114.114.114,8.8.4.4

勾选“启用压缩指针”:

method31

或者不勾选“启用压缩指针”,但要酌情填写延迟时间,默认0.3秒(视VPS延迟酌情增加或减小):

method3 (1)

双向过滤可以打开;有些ISP使用114DNS可能效果不佳,此时可以将114DNS换成本地ISP的。

确认shadowsocks和chinadns都显示已启动后,Enjoy~
所有的步骤完成后,可以尝试一些额外的步骤,比如:

使用作者提供的源来更加方便地更新shadowsocks和chinadns

定时检测代理状态遇到异常自动重启

PS1:ignore.list的定期更新,可以使用下面的命令:

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)) }’ > /etc/shadowsocks/ignore.list

curl ‘http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest‘ | awk -F| ‘/CN|ipv4/ { printf(“%s/%d\n”, $4, 32-log($5)/log(2)) }’ > /etc/shadowsocks/ignore.list

当然你也可以重新下载新版的shadowsocks重新安装。ChinaDNS的同样也需要更新,默认位置是 /etc/chinadns_chnroute.txt

PS2:ChinaDNS的 chinadns_chnroute.txt 和shadowsocks的 ignore.list 其实是重复的,此时你只需把luci配置界面里面ChinaDNS的chnroute改成 /etc/shadowsocks/ignore.list 就行了, chinadns_chnroute.txt 也就可以删除了,这样一来省点空间,而且免去要同时更新两个文件的麻烦。

PS3:如遇到别的被墙站点没问题但YouTube, Facebook, Twitter打不开,应该是DNS污染造成,请用dig命令排查,并尝试更换DNS转发方案。方案一和方案二可以配合这个dnsmasq配置文件使用效果更佳:dnsmasq_list.conf ,具体用法我就不详细说了,总之去掉ipset=/…/…的行,然后把127.0.0.1#5353改成你的相应地址。

PS4:有些ISP会禁用外部DNS,只能用ISP的,此时不要使用114DNS等公共DNS而要使用ISP的DNS;有些ISP做了DNS劫持,可能会导致指针压缩失效;有些ISP封杀国外UDP端口,会造成三种方案全部失效,请考虑方案四。