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



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


来源: https://cokebar.info/archives/664

方案简介


方案根据IP判断是否代理,国内IP不代理,国外IP走代理。代理通过shadowsocks所带ss-redir做TCP转发实现,分国内外IP通过国内IP段列表文件chnroute来区别,并通过iptables规则分别处理。由于是基于IP的判定,故需要解决DNS污染的问题,本方案使用优化的DNS解析方案,除过防DNS污染,同时具有良好的CDN兼容性,大部分情况下是最优的解析结果(缺点是配置过程稍繁琐)。
由于只要国外IP均走代理,而不是被墙才走代理,那么本方案的优缺点也就很明显了。

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


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

本方案主要涉及到的开源项目
写在前面

基于luci-app-shadowsocks v1.3.7版本撰写。目前的版本不带spec字眼,如果是从spec版本更新至此版本,需先卸载之前的spec版本,并删除配置文件(/etc/config/shadowsocks)后,再安装此版本。


一、安装

所需软件列表:



详细安装步骤

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


1. opkg update

shadowsocks有基于openssl和mbedtls的两个版本(这两个是开源加密算法库)。至于polarssl,是mbedtls的前身,不推荐使用。

如果要用基于openssl的shadowsocks,那么先安装依赖包,如下:(注:openssl有一定年头了,也最为出名,兼容更多的加密方式,不过历史久了,代码改的次数多了就会相对臃肿一些,出漏洞和bug也会相对多一些)

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

如果要用mbedtls版本的shadowsocks,那么先安装依赖包,如下:(注:mbedtls是ARM公司的TLS加密算法库,ARM处理器推荐使用。不支持部分加密方式,如RC4-MD5)


1. opkg install ip ipset libpcre libmbedtls iptables-mod-tproxy

期间可能会遇到类似以下的错误提示:
1. kmod: failed to insert /lib/modules/3.10.44/ip_set.ko2. kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ip.ko3. kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ipmac.ko4. ...
没关系,这时因为安装ipset包后需要重启,我们此时先重启一次路由器。

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

1. kmod-nfnetlink kmod-ipt-ipset kmod-ipt-tproxy libmnl libpthread


然后下载shadowsocks-libev和luci-app-shadowsocks,前者需要根据自己的CPU型号来进行选择。(下面这个地址也可以下载到mbedtls的两个依赖包libpcre和libmbedtls):

https://bintray.com/aa65535/opkg/shadowsocks-libev#files

另外,我们要顺道准备一下另外需要的软件ChinaDNS、DNS-forwarder等,可以分别在这些地方下载到:

ChinaDNS: https://github.com/aa65535/openwrt-chinadns/releases
DNS-Forwarder: https://github.com/aa65535/openwrt-dns-forwarder/releases
对应的luci-app: https://github.com/aa65535/openwrt-dist-luci/releases


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

安装shadowsocks, ChinaDNS以及dns-forwarder:

1. cd /tmp2. opkg install shadowsocks-libev*.ipk luci-app-shadowsocks*.ipk3. opkg install ChinaDNS*.ipk luci-app-chinadns*.ipk4. opkg install dns-forwarder*.ipk luci-app-dns-forwarder*.ipk

二、shadowsocks 配置

登录Luci,指向“服务”,此时应该能够看到shadowsocks(中文界面下显示“影梭”)了。接下来进行shadowsocks的配置。

详细配置步骤点击展开

I. 添加服务器

切换到“服务器管理”选项卡,点击“添加”来增加一个服务器配置信息。你也可以同时添加多个服务器配置信息,如下图:





添加一个服务器配置后,就要填写服务器配置(如下图),服务器地址、服务器端口、密码、加密方式是必须的。建议在别名中为当前配置文件起一个名字;填入信息后保存&应用;如果服务器支持一次验证,建议勾选,如果不支持则不要打开否则无法连接(有些服务器强制打开一次验证的话则必须勾选)。服务器地址需要填入IP地址。





II. 设置代理方案

接着切换到“访问控制”页面,如下图:





外网区域:可控制访问特定外网IP时,是否经过shadowsocks代理(内网区域为正常代理模式时生效)

忽略列表文件:访问在这个列表中的IP时,不经过shadowsocks代理。这个方案使用chnroute文件作为忽略文件,只有配置了这个文件,shadowsocks才可以自动区分国内和国外IP。由于我们安装ChinaDNS的带有这个路由表文件,我们就选择“ChinaDNS路由表”。

不过这个列表需要定期更新,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/chinadns_chnroute.txt

额外被忽略IP:这个列表中的IP强制绕过shadowsocks代理,按需添加。
强制走代理IP:这个列表中的IP强制走shadowsocks代理,按需添加。
内网区域:控制特定内网IP的代理方式。

共三种方式:

1.正常代理:使用外网区域设置的方式。

2.直接连接:忽略外网区域的设置,不走代理。

3.全局代理:忽略外网区域的设置,强制走代理。

网络接口:shadowsocks只作用于勾选了的网络接口。默认OpenWRT只有一个LAN区域,此处也只会显示一个接口,也就是:“桥接:br-lan”;一般情况勾选它就行。当路由配置了多个LAN区域时候,则会显示多个。在如下情况下很有用:

1. 多LAN环境,如额外的来宾网络。如上面图中,我额外配置了一个来宾用的GUEST网络,此网络属于额外的LAN_GUEST区域。此时我不想让连接来宾网络的用户使用shadowsocks,则不勾选这个接口即可。

2. 路由器作为VPN服务器,其他设备需要使用VPN连接路由并使用shadowsocks时,在此处勾选VPN连接对应的接口即可。

代理类型:内网区域默认的代理方式。三种:正常代理、直接连接、全局代理。

代理自身:路由设备自身的代理方式。

内网主机:单独配置内网特定IP的代理方式。

全部完成后,点击保存&应用。

III. 开启代理服务

最后切换到常规设置,来完成最终的配置:





运行状态:

透明代理: ss-redir的运行状态,shadowosocks代理的基础服务,提供TCP/UDP透明代理。

socks5代理:ss-local的运行状态,将shadowsocks转成socks5代理,路由器作为socks5服务器。

端口转发:ss-tunnel的运行状态,通常用作转发DNS。

透明代理:

主服务器:透明代理使用的默认服务器(TCP透明代理、端口转发两个功能会使用这里选择的服务器),此处从列表中选择你需要使用的服务器。

UDP服务器:UDP透明代理使用的服务器,可以和主服务器一致,也可以不同(也就是可以使用不同的服务器分别代理TCP和UDP连接)。在代理一些外服网络游戏的时候可能比较有用,其他多数情况下可以关闭。开启此项需要服务器支持,服务器端需要开启UDP功能。

本地端口:shadowsocks服务需要占用一个路由器端口,推荐保留默认,但不能和其他运行的程序有冲突,也不能和下面”socks5代理”和“端口转发”中的本地端口冲突。

socks5代理:有需要就开吧,不知道有用没的话就停用。

端口转发:DNS解析用得到,在后面DNS设置部分会有说明。

最后再次保存&应用,并刷新页面,看到“运行状态”中对应的项目显示运行中即表示成功。

IV. 额外的优化

这样配置的结果虽然国外IP自动走代理,但是可能遇到使用BT之类的下载软件时,出现连接国外Peer并走代理的情况,这种情况是我们想避免的。(P2P是许多网络服务器提供商明令禁止的,并且大部分代理提供者也禁止使用BT等下载软件)

解决方法还是有的。由于此类软件往往双端都使用高端口,因此使用源端口号或者目的端口号筛选即可。提供一个例子:

在/etc/config/shadowsocks中的config access_control字段下面加入一行并重启代理服务即可:

1. option ipt_ext '--dport 21:1024'

上面一行的作用是:只有21到1024的端口走ss。端口范围可以自行指定。也可根据需求使用源端口来筛选(dport改成sport)。当然,也可以在端口号前面加”!”(叹号)表示取反,这样的作用是排除一些端口不走ss,其他的走。


三、DNS配置

到此虽然shadowsocks配置完成,不过还没有进行DNS部分的配置,只有完成了DNS的配置才能解决DNS污染并优化DNS解析,接下来的部分来对DNS的配置进行说明。

(新版本的DNS配置部分未编写完毕,可先参考老版本以及《OpenWRT 自动翻墙路由器 DNS 解析的改善》)

发表评论