在路由器上使用ShadowsokcsR,可以使整个局域网实现科学上网,这种方式比在单台设备上安装SSR要更方便。
目前较为主流的路由第三方固件中,梅林固件和老毛子固件已经内置SSR及GFWList代理方式,使用时只要经过简单设置即可,也推荐刚接触的朋友使用可装这两种固件的路由器。有哪些路由器可用?可以参考这里
而第三方打包的OpenWRT及LEDE固件,虽然也大多内置Shadowsocks或ShadowsocksR,但是其中并没有内置GFWList上网模式。在默认情况下,是通过判断是否国内iP分流,即国内IP直接访问,国外IP走代理。这种模式虽然也可以实现科学上网,但是可能会导致访问国外正常网站时速度较慢,另外还会浪费SSR服务器的流量,尤其是下载国外资源时。那么如何为Openwrt或LEDE路由器添加GFWList实现智能分流呢?下面我们简单介绍一下。
路由器GFWList智能分流 实现原理
由于国内DNS解析被污染,默认情况下,GFWList列表域名解析得到的IP并不正确。
1.首先需要将GFWList规则写入路由器的dnsmasq中,列表中的域名不要直接解析,而是通过DNS转发解析。
2.将转发获取的真实IP通过ipset整合为IP列表,设置防火墙规则,使这部分IP走代理。
3.设置列表之外的域名仍然正常解析,并且不走代理,从而不影响正常网站的访问速度。
需要安装的模块
我们以路由器上已安装好SSR为例,为实现GFWList智能分流,其它需要安装的有:
- dnsmasq-full
- ipset
- dns-forwarder(DNS转发)
如何安装
1.dnsmasq-full
一般情况下,Openwrt或LEDE固件中,已经自带dnsmasq。但是自带的一般不是完全版本,所以需要先卸载自带,安装dnsmasq-full版本。
具体流程:
- 进入路由器的后台管理面板,点击菜单中的 系统 —— 软件包 ——点击刷新列表按钮。
- 刷新完成后,在过滤器处输入dnsmasq搜索,在已安装软件包中找到dnsmasq,如果不是如下图中的full版本,则切换到可用软件包中,找到full版本安装。
- 安装完成后,切换到已安装软件包中,卸载不带full版本。
2.ipset
与上文dnsmasq-full的查找方法一致,如果没有ipset,则在可用软件包中安装。
3.dns forwarder (DNS转发)
这个模块通过以上查找方法可能找不到,可以下载后通过Winscp上传至路由器安装。
分别下载以下两个文件
dns forwarder下载地址,进入页面后根据路由器的CPU架构,下载对应版本:
http://openwrt-dist.sourceforge.net/archives/dns-forwarder/1.2.1/
对应的Luci下载地址:
dns forwarder 安装流程:
- 将下载得到的两个ipk文件,上传至路由器的/tmp目录下。
- 分别输入以下命令安装,实际名称可能与以下命令不一致,注意将文件名替换为实际名称:
1 2 | opkg install /tmp/dns–forwarder_1.2.1–1_mipsel_24kc.ipk opkg install /tmp/luci–app–dns–forwarder_1.6.2–1_all.ipk |
以上各模块安装完成后,最好重启一下路由器。
GFWList智能分流设置
1.dnsmasq配置
1.1.下载GFWList 的 dnsmasq规则文件(包含ipset规则),下载地址:
https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist_ipset.conf
1.2.用Winscp连接路由器,打开/etc目录,在此目录下新建dnsmasq.d文件夹。
1.3.将刚才下载得到的规则文件,上传至新建的dnsmasq.d文件夹。
1.4.如果是OpenWRT固件,则:
打开/etc/dnsmasq.conf文件,在最后一行添加如下规则:
1 | conf–dir=/etc/dnsmasq.d |
如果是LEDE固件,则:
打开Putty连接路由器,运行:
1 | uci get dhcp.@dnsmasq[0].confdir |
如果返回结果为 uci: Entry not found 或者其他非 /etc/dnsmasq.d 的值,则分别运行如下两条命令:
1 2 | uci add_list dhcp.@dnsmasq[0].confdir=/etc/dnsmasq.d uci commit dhcp |
2.ipset及防火墙配置
2.1.打开路由器后台管理界面,点击菜单中的 网络——防火墙——自定义规则,在最下方加入以下代码:
1 2 3 | ipset –N gfwlist iphash iptables –t nat –A PREROUTING –p tcp –m set —match–set gfwlist dst –j REDIRECT —to–port 1234 iptables –t nat –A OUTPUT –p tcp –m set —match–set gfwlist dst –j REDIRECT —to–port 1234 |
注意:以上代码中的1234为SSR或SS的本地端口,请按实际填写,端口可以在路由器后台的SSR管理界面中查看:
2.2.以上设置完成后,点击防火墙界面的 重启防火墙 使设置生效。由于涉及防火墙规则变动,之后可能会出现网络卡死,关掉电源重启路由器即可。
3.DNS转发设置
3.1.打开路由器后台管理面板,菜单——服务——DNS转发,设置如下:
3.2.按照前文的说明,在防火墙的自义规则中添加如下一行,使8.8.8.8走代理解析,防止被污染:
1 | ipset add gfwlist 8.8.8.8 |
3.3.在路由器后台管理面板中,菜单——网络——接口——WAN——修改——高级设置,去掉下图勾选,并将DNS服务器设置为127.0.0.1:
3.4.打开 菜单——网络——DHCP/DNS——基本设置,将DNS转发设置为运营商分配的DNS,或者114.114.114.114之类的公共DNS也可以,用于正常域名解析:
4.Shadowsocks/SSR设置
通过以上的设置,路由器内部已经完成了GFWList的智能分流,这时候我们就不需要Shadowsokcs的内网代理了。
进入shadowsocks的后台管理界面,将内网代理类型由 正常代理 修改为 直接连接:
注意:Shadowsock管理界面的透明代理功能要正常开启。
验证GFWList智能分流是否生效
重启路由器,打开以下地址:http://www.ip111.cn/
以下图结果为例,前两个iP为你的真实IP,第3个IP为你的SSR服务器iP,这就说明只有访问被墙网站时,才会走代理,其它网站还是直连。
智能分流设置成功。