Shadowsocks + GfwList 实现 OpenWRT / LEDE 路由器自动科学上网

本站发布的三种 shadowsocks 在 openwrt 上的自动科学上网方案:

1、Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网
2、Shadowsocks + Redsocks 实现 OpenWRT 路由器自动科学上网 (停止更新)
3、Shadowsocks + GfwList 实现 OpenWRT / LEDE 路由器自动科学上网

本方案依靠GFWList,List中的域名站点走代理,不在List中的域名不走代理,根据域名判断。然而其实本质上依然是根据IP判断是否代理IP走代理,dnsmasq-full可以将解析域名得到的IP加到一个ipset中,利用这个ipset来判断走不走代理。实际是完成了gfwlist(域名列表)到dnsmasq的ipset规则再到IP地址的转换。同样,本方案依然可以搭配ChinaDNS搭配使用,也可以使用ss-tunnel,或者是自己的DNS服务器。

本方案的优点明确,只有被墙的站点才走代理,但是gfwlist并不能100%涵盖被墙站点,而且有些国外站点直连速度远不如走代理,特别是你代理服务器速度较快,希望通过代理加速国外访问时,此方案就不是那么好用了。请酌情选择你所使用的方案。

注:由于近期OPENWRT/LEDE的一系列变化,以及作者aa65535的一系列更改,本文需要更新,下面的步骤仅供参考!本人应该会在近期休假期间更新本文。不排除鸽的可能:)

一、安装

方法一: 添加作者的软件源,直接利用opkg命令安装 (此方式快捷方便,推荐!)

软件源位置:http://openwrt-dist.sourceforge.net/packages/

前提是所用网络环境直连sourceforge.net和downloads.lede-project.org没有问题。此处仅提供LEDE 17.X 的步骤。

首先添加 a65535 的 gpg key,只有这样,第三方的包才能通过签名验证。执行:

打开Luci,定位到“系统”-“软件包”-“配置”选项卡,在“自定义feeds”末尾加入两行并点击“提交”:

请根据自己的CPU架构(可以执行 opkg print-architecture 查看,或者参考“发行版软件源”里的URL里的文本),将mipsel_24kc替换成相应的文本,最后点击提交。

然后执行命令 opkg update 更新软件列表,然后执行下列命令安装依赖包以及shadowsocks相关的软件:


方法二: 手动下载软件包,上传至路由器后安装

依赖列表

右边注释为该包在官方软件源目录下划分到了哪一类 方便查找

LEDE 安装步骤

写在前面:由于LEDE官方软件源包含最新版本shadowsocks-libev软件包,但是官方包和本文使用的aa65535的包不同,并且不兼容,因此请一定要手动下载安装aa65535的软件包,避免装成LEDE官方软件源中的包。

首次安装的话,先确保路由器联网,并更新软件包列表:

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

首先,需要手动安装部分依赖包(并不是所有的依赖包,部分依赖包会自动从软件仓库安装)

接下来下载软件,注意需要根据自己的CPU型号来进行选择。

下载地址: http://openwrt-dist.sourceforge.net/packages/base/

需要下载的文件:

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

然后卸载dnsmasq并安装dnsmasq-full以及剩下的包:

注意不要装成LEDE官方源里的shadowsocks-libev包!

二、配置shadowsocks

1、配置 /etc/shadowsocks.json ,格式如下:

请自行修改好服务器IP、端口号、密码、加密方式。

新建文件: /etc/init.d/shadowsocks :

修改文件权限:

然后启动shadowsocks,并设置开机运行:

最后检查一下是否正常启动了:

如果未能正确启动,尝试手动执行,看看报什么错:

额外的优化:

开启 TCP Fast Open (TCP快速打开,缩略为TFO)

需求: 系统内核版本≥3.7,shadowsocks-libev≥3.0.4,shadowsocks服务端开启tcp fast open。

修改 /etc/sysctl.conf ,加入如下一行:

执行如下命令使之生效:

配置文件 /etc/shadowsocks.json 增加一行:

最后重启一下shadowsocks即可:

 

2、配置dnsmasq和ipset

2.1. 将如下规则加入到“网络→防火墙→自定义规则”中(最后的1080是shadowsocks的本地端口 酌情修改):

如果你需要

2.2. 修改dnsmasq配置:

OPENWRT:

修改 /etc/dnsmasq.conf,在最后加入 conf-dir=/etc/dnsmasq.d

LEDE:

执行:

如果返回值为 uci: Entry not found 或者其他非  /etc/dnsmasq.d 的值,则执行:

2.3 添加gfwlist和China-List配置文件:

新建并进入目录  /etc/dnsmasq.d ,下载 dnsmasq_gfwlist_ipset.conf 后放入该目录。

自动生成配置文件的脚本,本人放在这里:https://github.com/cokebar/gfwlist2dnsmasq

你可能需要自行修改这个文件,格式如下:

三、配置防污染DNS

1. 步骤一,有三个方案:

方案一 (由于不加密 所以有风险 不推荐):

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

比如说DNS服务器IP是:3.4.5.6,端口是5050,那么使用替换功能将 /etc/dnsmasq.d/dnsmasq_list.conf 里面的 127.0.0.1#5353 全部替换成 3.4.5.6#5050 即可。

最后重启路由器即可。

方案二 (如果此方案较稳定那么推荐这个方案 不过不少ISP会出现UDP方式不稳定的情况,如果遇到请用方案三):

使用ss-tunnel转发UDP的DNS请求,修改 /etc/init.d/shadowsocks 文件,如需修改上游DNS,请修改 DNS=8.8.8.8:53 字段,本地端口修改 TUNNEL_PORT=5353 :

最后重启路由器即可。

方案三:使用dns-forwarder将DNS转成TCP后走ss代理解析:

dns-forwarder的安装可参考:《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网》一文中的安装部分,到文中提到的地址,下载安装dnsforwarder_x.x.xx_xxxx.ipk,luciappdnsforwarder_x.x.xx_all.ipk即可。

配置也很简单,luci界面,“服务”→”DNS 转发”(英文界面是DNS Forwarder),如图配置:

最后需要在自定义防火墙规则里再增加一句,来确保8.8.8.8是走代理的:

其他TCP查询方式可以参考:

TCP 方式查询解决 DNS 污染问题


2. 步骤二

在WAN口配置中如图所示,将DNS手动指定为127.0.0.1:

ss222

最后在DHCP/DNS设置中将你的ISP的DNS填入(或者使用114DNS等公共DNS)

dnsmasq_localdns

 

最后你可能需要重启一下路由器,以及清空一下你的PC/PED设备的DNS缓存。


PS1:发现有不少人之前用过chnroute方案,然后改成gfwlist方案,此时记得把忽略解析文件的勾选去掉并把原来的设置填回去:

problem1

 

四、其他

一些强烈推荐的额外设置项(涉及到更新、维护)可以参考:《Shadowsocks for OpenWRT / LEDE 拾遗》

需要自己搭建服务器的,可以参考:shadowsocks – libev 服务端的部署

推荐的VPS商家见:https://cokebar.info/about

本博客有关 shadowsocks 文章合集目录

五、写在最后

本人作为一名普通使用者,水平有限,且文章也缺乏校审,肯定有错误存在,也有很多能改进的地方,如有意见或建议,请留言指出,万分感谢! 如果使用时遇到问题也欢迎留言,本人如果有空都会回复,不过请一定要将出错信息贴出来,有些错误信息需要到系统日志中查看。

 


参考文章:https//kyonli.com/p/18

617 条评论

  1. yy0c 回复

    我想问一下 ChinaDNS 是不是现在弃用了?为什么呢?

    1. cokebar 文章作者 回复

      对gfwlist方案来说,只要在gfwlist中的域名就让其走代理服务器解析即可,这样已经保证是无污染的DNS解析了,无需ChinaDNS。ChinaDNS虽然能防DNS污染,但其主要意义是区分国内国外网站,所以ChinaDNS在chnroute方案中更有意义,gfwlist方案中反而没啥用处了。

  2. 春夏秋冬 回复

    为什么我安装完shadowsocks-libev软件包后,在/etc/shadowsocks.json找不到这个文件

    1. cokebar 文章作者 回复

      本来就是没有啊,自己新建啊

  3. 春夏秋冬 回复

    谢谢指教,现在有两个地方提示出错请指点下
    运行netstat -lnp | grep ss-redir
    提示如下
    tcp 0 0 0.0.0.0:1080 0.0.0.0:* LISTEN 790/ss-redir

    运行ss-redir -c /etc/shadowsocks.json -b 0.0.0.0 -v
    有两个地方提示如错,怎么回事
    2018-02-22 17:46:38 ERROR: bind: Address in use
    2018-02-22 17:46:38 ERROR: bind() error

    1. cokebar 文章作者 回复

      你已经运行了ss-redir,并监听1080端口了了,再重复手动运行依然监听1080端口肯定会报端口被占用的错误(bind:address in use)

  4. Maxwell 回复

    感谢作者分享,但是我按照步骤来,最后还是全局代理,不能智能分流。以下是我的步骤,能否分析以下问题所在:
    1.配置shadowsocks步骤用的是luci-app界面,按照教程来走。
    2.配置dnsmasq和ipset完全按照步骤来。
    3.DNS防污染用的是方案三

    请问是否因为luci-app界面的配置而不是putty文字界面的配置导致来智能分流失败?

  5. Maxwell 回复

    感谢,今天仔细琢磨一遍,已经解决问题来,不算luci界面配置的问题,而是防火墙规则没放。

  6. Lucifer 回复

    请问三、配置防污染DNS部分的步骤二是啥意思啊?我不配置也能正常使用啊?配置了有啥好处吗?

    1. cokebar 文章作者 回复

      这个步骤对接入路由的设备无影响,但是对路由器自身有作用。不这样配置,路由器自身访问网络时候,还是会走WAN口自动获取的ISP的DNS,路由器还是会收到被污染的结果。一些情况,比如说你想在路由器上配置一个脚本,隔一段时间尝试连接google的服务器,看看ss通不通,此时就必须配置这个。

      1. Lucifer 回复

        感谢回复!但还是有点不明白,路由器自身访问网络时对Google服务器的解析难道不是经本地的dns-forwarder用tcp方式向ss服务器查询,而是向ISP的DNS查询?

    2. cokebar 文章作者 回复

      DNS防污染以及ipset的配置是在dnsmasq中造成的,LAN中设备被DHCP分配到的DNS是路由器LAN口IP,对应就是dnsmasq的服务,因此能够翻。然而对于路由器自身,其默认DNS是从wan口DHCP获取的ISP的DNS,会有DNS投毒。

  7. snake 回复

    非常感谢楼主的分享,我按照流程已完成除“三、配置防污染DNS”以外的操作,但是还是访问不了google、youtube,我想问下dnsmasq_gfwlist_ipset.conf文件里的127.0.0.1是必须得修改才行是吧?

  8. Lucifer 回复

    解释好详尽,非常感谢!大大的这篇教程给了我很大帮助,但我没有完全按教程操作,我用的是这个项目https://github.com/ywb94/openwrt-ssr提供的ssr软件,也没有用dns-forwarder,而是用的该项目支持的pdnsd,防火墙的自定义规则只设置了如下内容,用于解决chromecast投射问题(项目缺省设置的DNS查询端口也是5353):
    iptables -I PREROUTING -t nat -p udp -d 8.8.4.4 –dport 53 -j REDIRECT –to-ports 5353
    iptables -I PREROUTING -t nat -p udp -d 8.8.8.8 –dport 53 -j REDIRECT –to-ports 5353
    正如前面提到的,我也没有设置wan口的dns和dns转发。确实能正常翻墙,就是没搞懂是怎么实现的。我用putty在路由器上ping google.om得到的是正确的地址172.217.12.142,说明路由器的dns是没有污染的啊?而且这个ssr软件自带了一个检测ss服务器连接状态的按键,状态也是正常的啊?这个软件实现gwflist模式翻墙的原理应该和大大是一样的啊?还是没搞明白咋少了这么多设置也能用,不晓得是不是软件本身已经做好了很多设置

    1. cokebar 文章作者 回复

      1. 即使不配置wan的dns,也不影响LAN中的设备翻墙,只会影响路由器自身。
      2. 路由器上使用dig或者nslookup,与LAN中设备解析结果相同才对,如果不同,就有问题。并不是解析到google的IP就一定没有污染了,现在gfw会将google搜索的域名,解析到google其他服务的IP上去,虽然IP是google的,但是这个服务器上运行的并不是google搜索服务,导致用户还是连接不上。需要使用wget或者curl等工具尝试下载google的某个网页,看能否正常下载,如果可以就看一下下载下来的网页是否正确。
      3. 你使用的那个我不清楚,也没法细看,也有可能这个作者在他的代码中处理过这个问题了

      1. Lucifer 回复

        感谢大大,学到很多东西!前几日事情有点多,回复晚了,不好意思!
        我在LAN中设备nslookup google.com得到的结果如下:
        服务器: OpenWrt.lan
        Address: 192.168.1.1

        非权威应答:
        名称: google.com
        Addresses: 2404:6800:4008:800::200e
        172.217.24.14
        我在路由器nslookup google.com得到的结果如下:
        Server: 127.0.0.1
        Address 1: 127.0.0.1 localhost

        Name: google.com
        Address 1: 2404:6800:4008:800::200e tsa01s07-in-x0e.1e100.net
        Address 2: 172.217.24.14 tsa01s07-in-f14.1e100.net
        貌似路由器wan口并没有用ISP提供的DNS服务器?
        对于使用开源软件一直抱着既感激又担心的矛盾心理,主要是怕存在安全问题,所以想尽量理解它的实现原理。这个ssr软件的作者可能已经做了一些设置将wan口的dns解析指向了本地吧,羽大觉得有这种可能吗?

  9. asdjfa 回复

    我是lede,我猜这一步有问题: “配置dnsmasq和ipset”
    ——不是用dnsmasq-full吗? 但是除了方法2手动安装没相关步骤啊(我用的方法1)

    然后按方法3配置dnsmasq,结果dnsmasq服务起不来,53端口绑定不了,本地dns都出问题了.

    是我的问题还是博主?

  10. adfas 回复

    我是lede,我猜这一步有问题: “配置dnsmasq和ipset”
    ——不是用dnsmasq-full吗? 但是除了方法2手动安装没相关步骤啊(我用的方法1)

    然后按方法3配置dnsmasq,结果dnsmasq服务起不来,53端口绑定不了,本地dns都出问题了.

    是我的问题还是博主?

    1. cokebar 文章作者 回复

      安装部分的步骤,有卸载dnsmasq并安装dnsmasq-full的步骤;OpenWrt/LEDE的dnsmasq包是精简了部分功能的,full是完整版。执行这一步的时候请确保opkg update过,并且联网正常,否则会导致卸载了dnsmasq但没有安装full版,影响DNS解析,从而影响正常联网。如果发生此种情况,可能需要自行手工下载dnsmasq-full及其相关依赖包并手动安装。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

请输入验证码 *