在路由器上使用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,这就说明只有访问被墙网站时,才会走代理,其它网站还是直连。
智能分流设置成功。
梅林里的GFWlist文件很久没有更新了,请问用什么方法才能更新
按楼主方法,确实搞定了路由器代理,之前不懂设置结果99%的时间不能用。
但是设置完有个问题啊,访问国外网站,不管是否被墙都走代理。
已确认不是dns缓存问题,使用IP111.cn和一个香港的自建服务器测试都是如此,请赐教!
另,本人做了一个可以方便管理用户规则的脚本,如楼主感觉有价值,可以无私分享。 具体功能:
[root@RainbowSignal-WRT ~]# ssrule help
ssrule help info
ssrule is a shadowsocks rules manager.
Usage: ssrule
OPTIONS:
check : Check HOSTNAME in both GFW and user rules.
add : Add HOSTNAME as user rule.
remove : Remove HOSTNAME from user rule.
status : Display status of relative services.
refresh : Update the rule file to the latest version.
list : Display rules currently using.
help : Display this help information.
[root@RainbowSignal-WRT ~]#
刚用best trace软件又测试一下,问题不大。
总体满足要求。
只是在gfw规则文件中添加自定义规则,并依次重启dnsmasq、firewall、dns-forwarder、shadowsocks后,貌似国外域名(含香港)依然不走代理,添加自定义域名仅对国内域名(如ip138)生效。
且无论是否手动添加ip111.cn,ip111.cn均显示访问国内域名使用的地址为ss服务器地址,很奇怪。
不过正常使用倒是问题不大了。