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

    非常感谢,终于找到了对应的ipk文件了。看教程上的说明LEDE系统需要装的依赖包似乎比openwrt少,我有空试一下,看看能不能成功只让gfw列表中的地址经ss走服务器。到时候如果有问题再来请教,再次感谢!

  2. bitpump 回复

    非常感谢博主分享!
    几篇相关的文章反复读了好几遍。
    gfwlist这个方案,折腾了3-4次都没成功,今天终于搞定了。
    有几点补充
    1. 采用gfwlist方式,shadowsocks的接入控制中,WAN部分依然可以选ChinaDNS,转发部分切记要写上为防止DNS污染而设置的IP地址,如8.8.8.8, 8.8.4.4 否则在gfwlist中的域名无法解析
    2. 接入控制的LAN部分,应该选择直接连接,这样没被墙的并且不再ChinaDNS内的IP才能实现直连,如果选择Normal,这些地址仍然通过SS
    3. WAN的DNS没必要设置为127.0.0.1,因为除去gfwlist中的域名仍期望用ISP的或者国内的DSN解析,尤其是PPPOE,建议使用IPS的或者114.114.114.114,因为在gfwlist中的域名已经明确指出了解析的端口。我这里是在ChinaDNS基础上增加gfwlist的,原理同博主那张DNS解析的图示一样, dnsmasq->CHinaDNS->dns-forwarder->SS-redirect->8.8.8.8实现TCP防污染
    4. DHCP配置页面的DNS forwording也删了。不在gfwlist中的域名要走常规的ISP域名解析
    5. SS的sock5,和转发都没有启用。透明代理的端口设置为iptables中制定的转发端口,实现定向流量控制,
    6. 最后把3个iptables的设置写入启动项中

    wget 测试墙后的https网页还不同,有一个回头继续。要么是路由器本身翻墙没通,要么是https包没装全

    1. cokebar 文章作者 回复

      你是想使用aa65535的luci-app-shadowsocks来实现gfwlist方式吧?那就不要参照本文,参照aa65535写的wiki:
      https://github.com/shadowsocks/luci-app-shadowsocks/wiki/GfwList-Support

      本文的GFWList方案,只有GFWList中的域名才会交由防污染DNS解析,且只有这一部分的IP才会走代理,其他都会走默认DNS(从WAN口获取的DNS)。另外,本文的方案不适用luci-app-shadowsocks。你用的方式和本文不同,不过因为你没有详述我也看不出来。

      直接使用ChinaDNS的问题是:①部分ISP直接劫持8.8.8.8 导致ChinaDNS直接无法使用 ②某些比较恶心的劫持和污染下ChinaDNS无法正常工作 ③当不代理UDP流量时,大陆通常会连接到HK的8.8.8.8,导致解析结果为香港优化,当代理服务器在其他地区时,反而造成来回绕,影响速度;DNS解析最好转交代理服务器发出。

      1. bitpump 回复

        原理同博主那张DNS解析的图示一样, dnsmasq->ChinaDNS->dns-forwarder->SS-redirect->8.8.8.8

        1. cokebar 文章作者

          GFWList方案用不到chinadns,直接发到dns-forwarder即可

  3. mlm 回复

    请问专家,我用你的地址http://openwrt-dist.sourceforge.net/packages/LEDE/base/,想下载我路由器(wndr4300)对应的cpu版本的shadowsocks,发现链接点不开,我的cpu版本应该是mps-24kc,有些内核的可以瞎子啊,有的不行。

    1. cokebar 文章作者 回复

      部分ISP可能无法访问sourceforge 挂上ss

      1. mlm 回复

        感谢,我按照方法一整体都做完了,不能翻墙,列表以外的不走ss的网站一切正常,求问一下什么原因。去年的时候按照楼主的帖子加上自己的一些理解成功运用方法1,在vps上安装pdnsd做dns服务器成功翻墙,但是这次把openwrt换成lede按照更新的方法来作就不行了……

        1. cokebar 文章作者

          检查一下是否正常启动了:
          netstat -lnp | grep ss-redir
          如果未能正确启动,尝试手动执行,看看报什么错:
          ss-redir -c /etc/shadowsocks.json -b 0.0.0.0 -v

        2. mlm

          网上搜了一下好像libsodium版本太低问题,我路由器好像没有装这个程序。。

        3. mlm

          已搜索解决,感谢楼主,方案完美,请问后续升级固件版本的话,只要保留设置是不是就不影响继续使用

      2. mlm 回复

        补充一下,是用的gfwlist的方式,安装配置都反复核实了跟楼主的一样。

      3. mlm 回复

        /usr/bin/ss-redir: crypto_aead_xchacha20poly1305_ietf_decrypt: symbol not found,刚刚试了一下,报的这个错。

  4. djkang 回复

    请问博主 我照着你的教程做下去 无法成功 求指教

    openwrt 15.05.1
    ss版本我选的aa65535大神的libev 不带spec 在他的git里面下载的 不是opwrt-dist里面的版本
    dnsmasq系统自带
    启动以后 wifi 无法连接 dhcp不分配地址 怎么办

    1. cokebar 文章作者 回复

      请确认dnsmasq的配置是否正确 应该是dnsmasq启动失败

  5. djkang 回复

    博主 好了 又来请教 照着你的教程做下去 成功了
    可是能打开utobe 视频却播放不了 还有问下方案2的ss-tunnel 转发udp存在被劫持的可能性吗 方案2的启动脚本为什么又少了一些变量申明 比如pidfile 是不是必须少 ?问得有点多 实在是为难

    1. cokebar 文章作者 回复

      v2ex上的讨论:
      https://www.v2ex.com/t/368608

      近期使用路由器翻墙,chrome浏览器Youtube无法观看视频的解决方法(初步测试得出的结论,待验证):

      1. 如果你用的阿里云,服务器改hosts可解决,客户端这边也可可通过路由器上改解决,hosts文件见v2ex的讨论

      2. 路由器翻墙用户,使用chrome浏览器无法浏览,但使用客户端和手机可以,IE也可以,原因在于chrome独有的QUIC协议是属于UDP协议,路由器上没有代理udp流量的话就会导致quic直连,youtube可以取到用户的真实IP,大陆IP会直接封杀。
      解决方法:
      路由器上打开代理udp流量的开关;或者chrome浏览器地址栏输入
      chrome://flags/#enable-quic 把QUIC协议改成已停用

      本次封杀行为应该是Youtube自己封的。

  6. dragon 回复

    感谢分享,但是最后没有成功,浏览器访问google显示timeout。从2.1开始有点问题,首先2.1的iptables如何加入开机启动呢?貌似会重启丢失规则?另外 dnsmasq 是自动启动的对吗?我是从PC上的ubuntu用你的脚本生成了 ipset 的文件,保存成 gfwlist 放在/etc/dnsmasq.d下面。

    1. cokebar 文章作者 回复

      2.1请加到: luci→网络→防火墙→自定义规则中,不要直接执行;
      dnsmasq肯定是自动启动的,它负责路由器的DHCP、DNS功能

  7. dragon 回复

    *接上一条
    netstat -lnp | grep ss-* 的结果是:
    root@OpenWrt:/etc/dnsmasq.d# netstat -lnp | grep ss-
    tcp 0 0 0.0.0.0:5353 0.0.0.0:* LISTEN 1171/ss-tunnel
    tcp 0 0 0.0.0.0:1080 0.0.0.0:* LISTEN 1167/ss-redir
    udp 0 0 0.0.0.0:5353 0.0.0.0:* 1171/ss-tunnel

  8. 唐虾饺 回复

    楼主您好,有个问题想咨询
    用的是潘多拉的最新系统,CPU为MTK7621
    ssr版本地址http://www.right.com.cn/forum/thread-204802-1-1.html
    现在的问题是,路由器挂载之后,电脑使用114DNS就能访问google,自动获取就不行,所以,手机也是不能访问
    设置如下,DNS转发:127.0.0.1#1053
    chinaDNS设置: 本地端口 1053 上游服务器114.114.114.114,127.0.0.1:5300
    SSR设置:启用隧道DNS转发,转发端口 5300

    1. 唐虾饺 回复

      采用的是ip路由的模式

    2. cokebar 文章作者 回复

      第三方的版本使用了不同的代码,和我文中使用的版本不同,所以我就不清楚原因了。

  9. tporwx 回复

    iptables-mod-nat-extra, ipset这两个包有什么用?
    不安装好像也能正常使用啊。

    1. tporwx 回复

      ipset是必须的

  10. dover 回复

    gfwlist2dnsmasq.sh: line 7: syntax error: unexpected newline

    请问这是什么问题?

    1. cokebar 文章作者 回复

      检查换行符

发表回复

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

请输入验证码 *