OpenWRT 配合Shadowsocks+ChinaDNS实现科学上网

来源:网页教学基地 时间:2016-12-13 09:07:27  浏览次数:0

本站发布的三种shadowsocks在openwrt上的自动翻墙方案:

1、Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙
2、Shadowsocks + Redsocks 实现 OpenWRT 路由器自动翻墙
3、Shadowsocks + GfwList 实现 OpenWRT 路由器自动翻墙

这篇文章介绍的方法基于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

写在前面:由于近期2.2.3版本,aa65535调整了软件的配置文件安排,导致多处配置改变,从2.2.3之前版本升级以及安装2.2.3版本的用户请多加注意两个版本的不同,避免遇到错误。升级到2.2.3的用户升级shadowsocks-libev-spec版本的同时一定不要忘记升级luci-app-shadowsock-spec和luci-app-chinadns。由于此次更新出现多处前后版本不同,故暂时保留了新老版本两种截图并且配置(如端口号)可能有区别,请自行注意保持前后一致。

一、shadowsocks 安装

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

1 opkg update

shadowsocks有openssl(文件名是shadowsocks-libev-spec-X.XX.ipk)和polarssl(文件名是shadowsocks-libev-spec-polarssl-X.XX.ipk)两个版本选择,ROM空间吃紧的就选择后者吧。

如果要用普通版本(openssl)的shadowsocks,那么(openssl兼容性更好):

1 opkg install ip ipset libopenssl resolveip iptables-mod-tproxy

先安装必要的包,如果要用polarssl版本的shadowsocks(polarssl体积更小):

1 opkg install ip ipset libpolarssl resolveip iptables-mod-tproxy

期间可能会遇到类似以下的错误提示:

1 2 3 4 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包后需要重启,我们此时先重启一次路由器。

注:部分ISP访问download.openwrt.org可能会非常缓慢甚至下载失败,此时需要自行在PC上下载上面的依赖包以后自行上传至路由器目录手动安装

然后下载下面四个包,前两个ipk包需要根据自己CPU型号选择:

下载链接

接着将下载的包通过WinSCP之类的工具上传至路由器的/tmp目录。

接着安装shadowsocks和chinadns,一步步执行:

1 2 3 4 5 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

2.2.3版本用户新步骤:2.2.3需要自行下载忽略列表文件,该命令将文件下载至/etc/ignore.list:

1 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/ignore.list

升级到2.2.3版本的用户注意,以前忽略列表的位置默认放在/etc/shadowsocks/ignore.list,然而新版本中并不包含这个文件,升级后建议删除原有文件并执行上面的命令重新下载该文件。需要注意,本文新版本截图中统一放至/etc/ignore.list,和之前版本位置不同。这个位置在etc目录下可以按自己喜好放置,但要保证在shadowsocks和chinadns的luci配置界面中正确填写文件位置否则无法启动。

安装完成后,shadowsocks和chinadns应该会被配置成开机启动(可以在luci的启动项页面中查看状态),如果发现没有生效,运行:

1 2 /etc/init.d/shadowsocks enable /etc/init.d/chinadns enable
二、shadowsocks 配置

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

点击shadowsocks,取消勾选“使用配置文件”,新的选项就出来了,我们把服务器信息填进去,代理方式选择“忽略列表”,然后保存并应用(选项不要留空)。服务器地址请尽量填入IP,否则容易出问题! 全部完成后,刷新页面,确保shadowsocks是已启动状态,否则请检查配置。(左图为老版本图,右图为新版本luci-app)新版本请填写忽略列表文件完整路径

shadowsocks settingsss new 1

 

(2.2.3新)下图配置UDP中继,打开后开启TCP+UDP协议的透明代理,禁用后仅开启TCP协议的透明代理。想用shadowsocks代理玩外服游戏的可能用得到。顺带说一下不少ISP环境下,代理的UDP连接远不如TCP稳定。而且shadowsocks的超时机制断开连接可能导致你闲置时候掉线,所以不大建议用ss做代理玩外服游戏,还是加速器或者VPN好些。最后一个自定义的功能可以为UDP中继配置一个不同的服务器地址,具体作用和用法不在本篇范围内讨论。

udp-relay

 

然后看一下ChinaDNS的配置界面,此时可以先按照默认的配置来,确保ChinaDNS可以正常启动,也可以参考下面(右侧是新版luci-app-chinadns界面),:

\chinadns new

做出说明:

ChinaDNS参数说明

然后,在Luci中切换至“网络”-“DHCP/DNS”设置,如下图,在”DNS转发”中填入127.0.0.1#35353

dnsmasq

其中,35353是ChinaDNS的端口,如果你在之前设置界面里端口号不是35353,这里记得和前面保持一致。

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

4

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

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

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

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

4、对于一些UDP方式被干扰或屏蔽的情况,可以使用:TCP 方式查询解决 DNS 污染问题

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

方案一

chinadns1

2

方案二

5

chinadns2

方案三

chinadns3

由于ChinaDNS机制的缺点,可能存在部分站点的误判,如国内站点却使用国外DNS结果解析到国外IP,本人已经更新了改善此种情况的方法,详细见:《OpenWRT 自动翻墙路由器 DNS 解析的改善》


所有的步骤完成后,可以尝试一些额外的步骤,比如:

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

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

具体参考此篇文章:《Shadowsocks for OpenWRT 拾遗》

PS1:ignore.list的定期更新以匹配最新IP段分配,长时间不更新可能导致部分国内IP走代理或者国外不走代理,可以使用下面的命令,注意将最后的/etc/ignore.list替换成你想保存的位置,注意和shadowsocks和ChinaDNS的忽略列表保持一致:

1 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/ignore.list

PS2:如遇到别的被墙站点没问题但YouTube, Facebook, Twitter打不开,应该是DNS污染造成,请用dig命令排查。

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

PS4:发现dnsmasq有时候会占用5353等非标端口,导致ChinaDNS无法启动,这种情况可以将ChinaDNS的端口改成10000-65535的高端口来规避,取多少随意,比如35353


相关文章:

  • Shadowsocks + GfwList 实现 OpenWRT 路由器自动翻墙
  • 玩转 Shadowsocks – 本博客文章合集目录
  • Shadowsocks + Redsocks 实现 OpenWRT 路由器自动翻墙
  • Shadowsocks for OpenWRT 拾遗
  • TCP 方式查询解决 DNS 污染问题
 chinadns,chnroute,openwrt,shadowsocks,科学上网,翻墙,路由器
最近相关