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

618 条评论

  1. yaucy 回复

    为什么需要的是服务端版
    shadowsocks-libev-server_x.x.x-x_xxxx.ipk

    1. cokebar 文章作者 回复

      不好意思 笔误了 已修正

  2. dover 回复

    请问想把某一个IP走代理,是不是也是写到dnsmasq_list.conf里?

    1. dover 回复

      进入 Luci 界面 -> 访问控制 -> 外网区域
      「被忽略IP列表」 选择留空(/dev/null)
      「额外被忽略IP」 设置为 0.0.0.0/1 和 128.0.0.0/1

      对于 GfwList 中的域名, 新建一个 dnsmasq 的配置文件, 里面写入类似如下的内容
      # 使用不受污染干扰的 DNS 解析该域名
      server=/google.com/127.0.0.1#5353
      # 将解析出来的结果保存到名为 ss_spec_dst_fw 的 ipset 表中
      ipset=/google.com/ss_spec_dst_fw

      1. dover 回复

        用 Luci配置的这个方案,访问YOUTUBE,速度只有几百Kbps,但用博主这往篇文章的方法,访问YOUTUBE,速度就是几千Kbps
        还望博主能指点迷津。

        1. cokebar 文章作者

          猜测是DNS问题,速度慢的DNS没走代理服务器,导致解析结果按照你实际IP优化的结果,而不是根据代理服务器IP来的。

  3. dover 回复

    透明代理
    主服务器 x.x.x.x:443
    UDP服务器 x.x.x.x:443
    本地端口 1080

    端口转发
    服务器 x.x.x.x:443
    本地端口 5300
    目标地址 8.8.8.8:53

    1. dover 回复

      外网区域
      被忽略IP列表 留空-作为全局代理
      额外被忽略IP 0.0.0.0/1
      128.0.0.0/1
      走代理IP列表
      强制走代理IP 8.8.8.8
      8.8.4.4

      内网区域
      接口 桥接: “br-lan”
      代理类型 正常代理
      代理自身 正常代理
      附加参数 无

      1. dover 回复

        /etc/dnsmasq.d/dnsmasq_list.conf 里面配置是这样的:

        server=/google.com/127.0.0.1#5300
        ipset=/google.com/ss_spec_dst_fw

        1. dover

          以上是我的配置,不知道会是哪里没配置正确呢?
          还望博主指教,谢谢。

        2. dover

          晕死,把路由重启了一下,现在youtube的速度是几千Kbps了。。。。

          貌似对了

  4. urmyonly 回复

    为什么更新版把方案3删掉了?有什么问题吗?
    而且方案3 和第一种的优化方案其实没啥区别啊

    1. cokebar 文章作者 回复

      方案三通过ChinaDNS解析,解析是由客户机直接发起而非通过代理服务器转发,导致解析结果是根据客户机实际IP优化的结果,而非代理服务器IP优化的结果。
      举例:代理服务器在US,而通过ChinaDNS查询8.8.8.8,通常连接的是香港8.8.8.8服务器,因此解析结果很可能是香港服务器IP,而你的代理在US,代理速度必定大打折扣。

      1. urmyonly 回复

        但是你这样的话,导致国内网站的解析无法根据你的位置进行优化了啊

        1. cokebar 文章作者

          只有gfwlist中的域名才会走代理解析 其他走默认

    2. cokebar 文章作者 回复

      不要和chnroute方案的DNS解析方式搞混。此方案未改变默认dns设置,因此国内网站以及不在gfwlist中的国外网站还是走的自动获取的dns(isp的 dns)。只有gfwlist的域名进行特殊处理。

  5. urmyonly 回复

    十分奇怪,我在切换为这个gfwlist方案之后,服务器会发起大量的ssh连接到我的路由器,导致整个服务器被封了。想了半天百思不得其解,似乎没有什么服务需要从服务器连接我路由器的22端口啊…..而且我22端口也无法从WAN口访问。

    请问你能知道这是什么原因吗?

    1. urmyonly 回复

      另外还有一个问题,你的DNS方案1,似乎无法防止dns污染吧

      1. KuuDS 回复

        非53端口暂时不被污染

        1. urmyonly

          多谢。明白了。现在就是ssh的问题解决不了,搬瓦工把我的VPS封了-。-,在没想好怎么回事之前也不敢申请解封,一共就三次机会,已经浪费一次了,在浪费一次就要被彻底封了……
          以前用的chinadns方案没这个问题,现在把路由器切换成LEDE,用了这种方案,结果VPS的负载直线上升,最重要的是,谁在发起SSH连接啊…..难道是Port Forward用的?

        2. urmyonly

          多谢。明白了。现在就是ssh的问题解决不了,搬瓦工把我的VPS封了-。-,在没想好怎么回事之前也不敢申请解封,一共就三次机会,已经浪费一次了,在浪费一次就要被彻底封了……
          以前用的chinadns方案没这个问题,现在把路由器切换成LEDE,用了这种方案,结果VPS的负载直线上升,最重要的是,谁在发起SSH连接啊…..难道是Port Forward用的??

    2. cokebar 文章作者 回复

      和本篇的ss无关,请检查你的设置,以及服务器是否被黑

      1. urmyonly 回复

        其实我也觉得和SS无关,但就是找不到怎么回事,首先肯定不是被黑,服务器已经重置新OS了还一样。而且SSH是从我的VPS主动连到了我的路由器的22端口。之前用的openwrt的chinadns方案没有问题,切换到LEDE的GFWlist就有问题了。只好今天先切换回openwrt试下GFWList再说,如果还有问题就只能再改回chinadns了。
        便宜VPS就是服务太差,动不动就要封你帐号,也不给你调试的机会,真是@¥……!#&

  6. dover 回复

    请问 –key是怎么设置的?

    1. cokebar 文章作者 回复

      key和password二选一,key是直接密码,password则是在程序内经过转换后,把转换后的值作为key。直接使用key的话请确保key的强度

      1. dover 回复

        懂了,谢谢。

    1. cokebar 文章作者 回复

      以前8.8.8.8会直接返给你一组IP地址,现在是随机给一个

      1. dover 回复

        原来是这样,谢谢指点

  7. ZackXu 回复

    在小米路由器 mini 上安装 Shadowsocks 后无法启动它,不知道 Po 有无遇见类似的问题?

    1. ZackXu 回复

      安装 libsodium 后解决,Sorry~~

  8. Passenger 回复

    有一部分问题想请教:
    1.我按照方案一的教程部署,上网成功,但后来看介绍是所有境外网站都会过代理,感觉有些浪费。因为我的目的只是用代理上那些不“科学”不能上的网站。所以感觉方案三更符合我的需求。于是按照方案三的教程操作。但是试了几次都不成功,除了第一次为方案一之后修改之外其余每次都是openwrt重置路由之后重新部署的。处理器应该是MT7620,ramips的,之前有两个文件没找到:libev_x.xx-x_xxxx.ipk和libpcre_x.xx-x_xxxx.ipk。后来受方案一的启发,直接opkg install libev libpcre,安装成功,但是依然无法正常代理。查看系统日志,发现大量如下字段:
    daemon.info dnsmasq[1111]: using nameserver 127.0.0.1#XXXX for 。。。
    然后感觉这里有问题,即域名部署每次都不完全,从数字开始,a打头的没部署完就结束了,手动重启dnsmasq,系统记录有随机性,即最后一个域名不特定,但都是a的没处理完就没有系统记录了。想请教一下这个是怎么回事。另外,我dns转发主要用的方案一的forward。数次不成功也按照方案三的DNS方法二弄了一次,依然不成功。
    2. openwrt方案不成功,我就想换LEDE试试,下载了LEDE固件,开始找ramips对应的ipk包,结果发现没有对应的ramips目录。。。。外行完全不知道这是为什么,还望不吝指点。
    谢谢!

    1. cokebar 文章作者 回复

      lede下的包类型根据cpu内核架构区分

      1. Passenger 回复

        包类型我知道是根据cpu内核架构区分的,只不过我没找到自己路由cpu对应的内核而已。在openwrt下面找到了对应的ramips目录;openwrt插件ipk也有ramips目录;lede官方固件同样有ramips目录;但是lede的插件ipk就没找到相应的ramips目录,不知道是什么原因。路由cpu型号应该是MT7620。
        由于方案三一直不成功,我现在还是使用的openwrt方案一。现在就是不明白为什么方案三不成功。
        谢谢!

        1. cokebar 文章作者

          openwrt时候 包和固件均根据CPU型号划分。lede开始,固件根据cpu型号,而包根据cpu内核架构。个人猜测LEDE这么改的原因是:有不少cpu型号虽然不同但是内核架构相同,无需再为此再出多个包,重复了。 指令集、cpu型号、内核架构对应表格:https://lede-project.org/docs/targets/start
          ramips是指的MediaTek / Ralink公司出的mips架构的cpu系列,并不是内核架构,MT7620是具体的cpu型号,属于ramips系列;而MT7620的内核架构是mipsel_24kc

发表回复

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

请输入验证码 *