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

    非常感谢你的三篇文章,感觉是网上总结得最全面和清楚的了。也感谢你分享的dnsmasq的列表,省得我们自己折腾了。请问能否加上 .blogspot.com 以及 .blogspot.hk 呢?如果服务器在香港的话,访问的是后者,不知为何gfwlist现在没有包含blogspot的域名。谢谢!

      1. wyf88 回复

        多谢!

      2. wyf88 回复

        呃,博主把 Google.com 那几条从你的 dnsmasq_list.conf 里删掉了?
        看到了你在 github 发的那个脚本,可惜路由器装不下 python 呢,不然也能自己生成这个列表,给你服务器减轻点负担。
        另外我上次说的把 Google IP 全都加进去的方法我试成了,可以弥补 gfwlist 有时的遗漏,也不麻烦。在 firewall.user 里加入:
        ipset -N gfwlist2 nethash
        ipset -A gfwlist2 74.125.0.0/16
        ipset -A gfwlist2 173.194.0.0/16
        iptables -t nat -A PREROUTING -p tcp -m set –match-set gfwlist2 dst -j REDIRECT –to-port 1080
        iptables -t nat -A OUTPUT -p tcp -m set –match-set gfwlist2 dst -j REDIRECT –to-port 1080
        用这个 nethash 可以加入整段的 IP。

        1. cokebar 文章作者

          操作失误 现在修复了

        2. cokebar 文章作者

          这列表基本万年不变。。。 不适合路由器上更新 适合自己手动更新 几个月更一次就行了

  2. wyf88 回复

    试用了几天,发现 Gfwlist 果然还是不太全面,比如 Google 的某些项目的域名,或者某些 CDN 的域名都不在里面。其实有 IPset 的话,可以把域名的 list 和 IP 的 list 结合一下吧,比如已知 173.194.0.0/16 和 74.125.0.0/16 这两段都是 Google 的 IP 且都被墙了,就干脆先加到一个 IPset 里,这样就算 Gfwlist 里少了很多 Google 的域名都没关系了。这些 IP 的 list 虽然不那么容易找,但是假如只涵盖 Google 或者常见 CDN 的话,他们的 IP 还是比较固定的。维护这些 IP list 的人不多,找到了两个:https://github.com/pragbyte/gfw-butter/tree/master/ip-ranges 以及 https://github.com/SteamedFish/gfwiplist/blob/master/gfwiplist.txt
    不知你怎么想?

    1. cokebar 文章作者 回复

      请使用chnroute方案

      1. wyf88 回复

        你说的有道理,上面说的方法太折腾,不如 chnroute 效果好。不过我总怕所有国际流量都通过 shadowsocks 会增大服务器被认证的概率。另外用 chnroute 对服务器稳定性要求比较高,假如服务器挂了一会,那么这段时间所有国际网全都上不去了,这点略蛋疼。

        1. cokebar 文章作者

          我这个站点服务器 加上我室友有近10个在用ss吧 每个月跑300G流量 基本没啥事儿 你想想非被墙国外站点常去的很少 流量你能跑多少? 不多的 大部分都是被墙站点流量 除非你比较特殊 大多数人就是U2B啦 Google+啦 FB啦 Twitter啦 而且我这服务器真心可以加速国外访问
          弊端当然是有的 但是GFWList那个列表实在折腾。。 不行你可以试试GFWList结合Redsocks 算是比较折腾的方法。至于稳定性,服务端加一个watchdog能满足基本需求了。这种东西就得折腾

  3. 引用: _(┐「ε:)_生命在于折腾╮(╯∀╰)╭ | 红红火火红红火火哼哼哈嘿恍恍惚惚

  4. zhuxiaopengster 回复

    Shadowsocks + GfwList 实现 OpenWRT 路由器自动翻墙,这个方案可以装shadowsocks-libev-spec吗?
    装了shadowsocks-libev-spec后dnsmasq_list.conf和/etc/shadowsocks/config.json谁优先啊?能实现被墙的走代理吗?

      1. zhuxiaopengster 回复

        谢谢我知道了。

      2. zhuxiaopengster 回复

        这种方案不需要设置DHCP/DNS里的DNS转发吗?我不设置国内的网站访问不了,被墙的可以访问。

        1. cokebar 文章作者

          不需要 保留默认即可 如果你不设置解析不了说明你使用了忽略解析文件(no-resolv)忽略了从WAN口获得的DNS服务器配置

        2. ppss

          那这种情况怎么修改呢?

  5. zhuxiaopengster 回复

    那DHCP/DNS的 DNS forwardings默认是什么呀?是不是把DNS forwardings里面的内容删除就可以了啊?

    1. zhuxiaopengster 回复

      非常感谢楼主的解答,我问题解决了,谢谢!

      1. ooo 回复

        怎么解决的呢?

  6. cokear fans 回复

    我在上面看到,GfwList方案不能装shadowsocks-libev-spec版本?这是为什么……难道非得用shadowsocks-libev_2.1.4-1_ar71xx.ipk这个?shadowsocks-libev-spec_2.1.4-1_ar71xx.ipk不行吗?

    1. cokebar 文章作者 回复

      spec是定制版本 本身就是chnroute方案 不是说spec不能用 但是装了的话也只是用了共有的ss-redir可执行文件 而spec版本的ss-rules和它的启动脚本都不能用 因为那是chnroute方案的脚本 你只能用这里的启动脚本 还不如装非spec版本
      你要是想要两种方案快速切换的话 就比较麻烦了 可以装一个spec版本但不启用 然后再建立一个自启动脚本 换个名字 脚本内容则参考本篇里的修改 本篇有启动脚本 有增加规则的操作却没有删除规则的操作 也就是 如果你想共用 就不能在防火墙自定义规则里填规则 而是需要在启动脚本里增加规则 并在停止脚本里面清空这些规则 要改的还是很多的
      切记 chnroute和gfwlist方案完全冲突不能共用请勿同时启用(一个是白名单一个是黑名单当然冲突)

      1. cokebar fans 回复

        非常感谢啊……我喜欢第三个方案,据说ipset方案性能是最好的

      2. cokebar fans 回复

        忘记问了,电脑端也是dns转发吧?以前用樱花,tomato路由可以跑满速,现在用搬瓦工的vps,电脑端可以满速,用tt路由只能800KB,刚入了个网件3800,正在路上,好期待啊,到时候再试试……

  7. cokebar 回复

    我太蠢了,没发现键盘的b键位不太灵……

  8. zhuxiaopengster 回复

    为什么我的shadowsocks不能启动啊?用spec版本是可以启动的。

    root@OpenWrt:~# ss-local -c /etc/shadowsocks.json
    2015-02-12 13:32:59 INFO: initialize ciphers… aes-256-cfb
    2015-02-12 13:32:59 ERROR: bind: Address already in use
    2015-02-12 13:32:59 ERROR: Could not bind
    2015-02-12 13:32:59 ERROR: bind() error

    1. cokebar 文章作者 回复

      端口被占用 话说这两个方案冲突 别同时

      1. zhuxiaopengster 回复

        谢谢回答,能启动了,但ipset里面的ip不能走代理出去,是为什么啊?google上不去,郁闷啊

    2. cokebar 文章作者 回复

      停用spec版本并卸载 使用ipset list检查ipset增加ip的情况 使用iptables -t nat –list检查iptables规则是否正常

  9. cokebar fans 回复

    大神,这个ss-tunnel转发的方案,服务端需要设置什么吗?

    1. cokebar 文章作者 回复

      服务端支持UDP转发即可 shadowsocks-libev和shadowsocks-python都是支持的且默认开启

      1. cokebar fans 回复

        感谢解惑!非常感谢,不过GO版本呢?是否也支持?

      2. 第十七维 回复

        我用的是aws服务器,udp转发,服务端需要开启哪个端口?谢谢

        1. TheFirstCurse

          服务端ss配置哪个端口就开哪个端口就可以了。

        2. cokebar 文章作者

          加入 -u 参数即可,和tcp同端口

      3. 第十七维 回复

        服务器开放所有udp能够转发成功,但只开5353或53不行

      4. TheFirstCurse 回复

        那可能是你的服務器配置有誤,iptables -L -n查看一下你的配置。

      5. TheFirstCurse 回复

        還有規則順序問題。

  10. 波波杨 回复

    文中给出的 dnsmasq_list.conf太坑了,包含了各种各样的被墙网站,结果唯独没有google.com,可怜我测试时用的google,修改设置无数次,google始终无法打开,最后无意中打开了facebook,然后心中起疑,打开一看,我勒个去……当场撞墙的感觉……

    1. cokebar 文章作者 回复

      上次更新脚本时候不小心改错了 操作失误不消息删了去 现已修复

    2. cokebar 文章作者 回复

      如果依然没有 应该是浏览器缓存作用 清下缓存就好了 或者用硬刷新

发表回复

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

请输入验证码 *