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. yueduz 回复

    方案三也要填写DNS转发
    帮助 将指定的域名DNS解析转发到指定的DNS服务器(按照示例填写) .不填好像就不能上列表外的网站了.但是文章里没有提到

    1. ooo 回复

      我的也是这种情况,这样是不是所有解析都要送chinadns处理一遍,从而会导致速度比较慢?

      1. cokebar 文章作者 回复

        不在列表里的是走ISP的DNS的。dnsmasq会读取/tmp/resolv.conf.auto文件的配置,这个文件包含的是wan口收到的自动配置的DNS,也就是isp的DNS。确保DHCP/DNS设置里没有勾选忽略解析文件

  2. yueduz 回复

    而且我觉得三步曲 3 要比1快,

  3. yueduz 回复

    步曲1的域名解析总感觉没有3快,我在1和3 都使用了chinadns

    1. kylinxms 回复

      1的原理是说GFW现在只会干扰53端口的DNS查询,当然你opendns这种有名的会重点关注,你如果是用自己的VPS搭建DNS,找个不是53的端口GFW就不会干扰域名解析

    2. cokebar 文章作者 回复

      gfwlist的方案 只有list中的才会转发到特定的DNS 不在列表中的还是走ISP的DNS 速度很快 而chnroute那种方案 每个dns解析都是转发到chinadns的 chinadns在获得国内和国外两个解析结果后才能经一定算法判断后返回最终结果 如果你的国外DNS延迟较高 确实会慢一些 可以考虑换用aa65535编译的dnsmasq修改版(可调整TTL cache大小等) 或者换用pdnsd改善一下(其实就是加强缓存功能)

  4. lee 回复

    刚新弄了下,跟你的内容不同,不知从何改起。。。

    1. cokebar 文章作者 回复

      这个是原版 非spec版本

      1. lee 回复

        OK呢,非常感谢!

  5. lee 回复

    另外
    下载 dnsmasq_list.conf 后放入该目录
    这个要改名字吗,看你后面写的是
    那么使用替换功能将 /etc/dnsmasq.d/gfwlist.conf 里面的 127.0.0.1#5353 全部替换成 3.4.5.6#5050 即可。
    两个名字不同

    1. lee 回复

      因刚接触不久,基本全是按本博客设置,请帮忙看看以下自动更新功能有无问题,此条是参照博客和google自已弄的,谢谢
      0 1 * * * wget -O- –no-check-certificate https://cokebar.info/wp-content/uploads/secured_files/dnsmasq_list.conf | sed ‘s/127.0.0.1#5353/xxx.xxx.xxx.xxx#1212/g’ > /etc/dnsmasq.d/dnsmasq_list.conf
      DNS服务器已隐藏

      1. cokebar 文章作者 回复

        检查一下输出文件内容就行了 话说应该是两道英文短杠: –no-check-certificate

        1. lee

          谢谢,换了个思路,按你的格式手动自己弄这个文件了,目前就只加了常用的几个站。

        2. lee

          每次更新gfwlist.conf内容后都需要 /etc/init.d/dnsmasq restart 来重启dnsmasq然后才有效,不知有无更好的方法

  6. zk 回复

    请问一下我想选用方案三,路由器的选择方面是不是只要是openwrt支持的路由器都可以,

    1. lee 回复

      应该可以吧,都支持openwrt了,ss应该也支持

      1. zk 回复

        你用的什么路由

        1. lee

          hg255d, 马云那买的

        2. lee

          出于网上很多教程提到的东西不是很容易装上去(提示内核版本依赖什么什么版本。。。)
          所以是自己根据需要编译的,只用了ipv6,mwan3及ss这三个东西,其它的等有需要及兴趣时再弄。

      2. zk 回复

        恩 谢谢

  7. pu 回复

    ipset -N gfwlist iphash
    iptables -t nat -A PREROUTING -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080
    iptables -t nat -A OUTPUT -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080

    请问这几个规则是直接粘贴在自定义路由的页面里么?

    1. kylinxms 回复

      写在 /etc/rc.local 里面可以开机自启动
      记得用全路径或者你一开始就设置好PATH

    2. cokebar 文章作者 回复

      自定义防火墙规则里面

  8. 砼拌饭 回复

    博主,按照 gfwlist的方法设置好了。其他都没有问题,脸书小鸟微博都行。唯独google,youtube不能用。已经手动修改了list增加了这些地址。重启还是不能用。不知道什么原因,求排查问题思路。

    1. cokebar 文章作者 回复

      是用我的那份list文件么? 你用的哪种DNS方案?尽量不要用第三种

      1. 砼拌饭 回复

        使用第二种DNS方案。用的你的list。开始不能用,自己增加了/.google.com还有YouTube的项目,增加以后还是不能翻。fb和小鸟和反革命网站都正常使用。google旗下的都不行。

      2. 砼拌饭 回复

        已查明原因:之前在电脑上使用goagent这货在host里面写了google全家的地址和ip,当然现在失效都连不上了。当然无论怎样弄都不行。取消电脑host中的信息解决问题。另:2.1.1的sspolar貌似经常停止工作,,稳定性差点。

  9. zasl 回复

    博主,我想问一下,如果用方案3,师傅能添加自定义的网站来翻墙?如果可以,请问添加的格式是怎么弄的?

    1. cokebar 文章作者 回复

      三种方案添加自定义站点的步骤都是一样的,都是修改dnsmasq_list.conf

      1. zasl 回复

        博主,现在在吗?在尝试用方法3遇到问题了。

      2. zasl 回复

        博主,
        1:我按照你的方法操作到/etc/init.d/shadowsocks 修改配置文件的时候,我的ss内容不是这样的,我就把你的内容全部复制到这个文件里面,不知道这样是否可行,安装的是非spec的版本
        2:你第二部的3行内容是不是直接复制到网络→防火墙→自定义规则里面最下复制进去就好了?
        3:启动开机运行ss是不是直接在putty里面执行这2行就ok了?

        这样做了,但是无法翻墙出去,看到上面的一位朋友说dns要指定127的哪个也试了,也是不行的。我原来是按照你的ss和chinadns图文教程做的,那2个软件都有luci,方便操作,这次我真的不会了,请麻烦腾出时间帮忙解决一下,谢谢了

    2. cokebar 文章作者 回复

      1、随着版本更迭,作者对启动脚本可能有改动,直接粘贴我的过去,如果软件没有对启动参数大改的话是没有问题的。
      2、是的
      3、是的
      这个方式和chnroute方式完全不同请不要更改luci里面的DHCP/DNS设置,不要忽略解析文件,不要添加no-resolve,不要在luci的DNS设置里填127.0.0.1,只添加dnsmasq_list.conf文件并确保/etc/dnsmasq.conf里面加入了conf-dir=/etc/dnsmasq.d。同时你要保证正确的安装了ipset和dnsmasq-full,可以访问一个被墙站点后,执行ipset list看看有没有相应的IP加进去;如果为空就表示dnsmasq-full并未成功将相应的IP加进去,此时检查dnsmasq的配置,如果加进去了,就检查shadowsocks是否正常,检查自定义防火墙规则是否生效。

      1. zasl 回复

        这个是没有问题的,我是重新刷了openwrt,然后尽量按照你的教程来做的了,所以不会做到更改dns和dhcp那些的,我可以非常确定的是昨天我用这个方法是无法翻墙的,但是今天打开电脑却莫名其妙可以翻墙了,昨天操作的时候也重启过路由社么的,就是不行,刚才执行了ipset list,但是看到很多的ip地址,哪个地址是对应我访问的网址的,这个怎么查呢?还有检查自定义防火墙应该如何检查?如果可能,你是否可以帮助我远程看一下?我非常需要这种方式来上网。

        1. zasl

          看来还是不行,手机不能翻。。。。

        2. zasl

          还有,你的文件发现个问题,就是google.co.jp这个有错误
          顺便加上这个吧?
          server=/203.195.174.41/127.0.0.1#5353
          ipset=/203.195.174.41/gfwlist
          server=/203.195.174.41/127.0.0.1#5353
          ipset=/203.195.174.41/gfwlist
          Evernote国际版的同步地址

        3. cokebar 文章作者

          google.co.jp是没有问题的 google日本就是这个域名不是com
          其他内容请自行添加 本人只是利用gfwlist自动生成 不维护额外的列表

  10. kszym2002 回复

    请问作者 有没有办法把一个或多个内网IP排除在这个列表里呢?
    就是假设 192.168.1.20 我想让他全部流量走SS 如何才能实现呢?

    1. cokebar 文章作者 回复

      自行修改iptables规则即可

      1. ppss 回复

        请问能帮忙写一下吧,不会写iptables

发表回复

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

请输入验证码 *