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. 千歲君 回复

    試過用 SS 的全局代理、忽略列表,以及 自建整理的 Dnsmasq GFWList,雖然是可以爬牆,但是好像用電腦 PING 被牆的網站的時候一概都是沒反映。

    1. cokebar 文章作者 回复

      socks5可以代理TCP/UDP ping默认是是ICMP echo request 不走代理 可以尝试TCP ping。VPN工作在IP层 可以包裹ICMP

      1. 千歲君 回复

        感謝苣苣的回覆,想問一個弱智的問題, Dnsmasq支持通配符嗎?譬如 Google 的後綴太多了,一個一個寫太麻煩,如果可以 google.* 這樣寫就好了,但是我試過這樣寫無效。但是網上說 Dnsmasq 是字符通配符的,想問下到底支持不?

        我安裝的是 Dnsmasq-full,系統環境是 OpenWRT。

        1. cokebar 文章作者

          很遗憾 不支持通配符 貌似有人有做修改版让dnsmasq支持正则表达式 如果谁有能力把那个适配到openwrt上的话就太好了。 socks5代理无法包裹ICMP,必须VPN

      2. 千歲君 回复

        還有就是能把 ICMP 也代理上嗎?
        強迫症逼死人系列 QAQ

      3. 千歲君 回复

        那沒辦法了,謝謝苣苣。
        如果我想要在 OpenWRT 掛在多個 SS 該怎樣實現?

  2. kirl 回复

    谢谢@cokebar回复,平板刷了下机,WiFi翻墙OK了。
    从这几天的状态看,除了频次不高的偶尔抽风无法翻墙外,其他基本正常,也不知道是不是这几天日子比较敏感。
    再次感谢!

    1. cokebar 文章作者 回复

      貌似GFW有时会对疑似目标进行特定端口上的短时间阻断 TCP会被RESET掉 一般持续1-2分钟。极个别情况下会发现某端口被阻断一整天。多端口还是有必要性的,服务器也要避免过大流量否则可能会被“认证”,这时候就不是临时阻断这么简单了,可能给你彻底封了。

  3. wyf88 回复

    貌似这个自动生成 dnsmasq_list.conf 的脚本没法处理正则表达式呢。我之前发现 Line 登陆不了,后来自己添加了 .line.naver.jp 这个域名就好了,开始还以为是 GFWList 里没有这个域名,后来发现是有的,不过是个正则表达式:/^http:\/\/[^\/]+line\.naver\.jp/。麻烦博主帮忙把这个域名加到 list 最后吧,多谢!

    1. cokebar 文章作者 回复

      正则表达式的话 很多情况是无解的 无法转换成完全等价的dnsmasq规则

      1. wyf88 回复

        恩恩,我明白,比如在一个网址里面出现也会匹配,不过至少对于 Line 来说,直接在规则里加上 .line.naver.jp 就已经足够了。

  4. RD 回复

    请教一下,按照方案3配置,有线可以翻,无线翻不了是什么原因。
    之前用redsocks2方案都能反,改为gfwlist方案WiFi就不能翻了。
    无线有线肯定是同一网段、同一防火墙区域。
    是否防火墙规则有问题?

  5. db 回复

    发现个问题电脑dns不能改其他,只能是路由的地址不然会出现无法“图强”。

    1. cokebar 文章作者 回复

      这是必然的 必须通过dnsmasq做解析才能将域名的IP加到ipset中

  6. 引用: Shadowsocks自动翻墙路由 | Samson's Ponder

  7. Niclau 回复

    感觉这个方案的问题就是不能区分解析出来的IP是否国内IP,如果国内IP则直连。例如dl.google.com。

    1. cokebar 文章作者 回复

      GFWList中的网址必然要走代理 局部个别的域名有国内服务器也无法改变整体被墙的情况 全部走代理才是稳定的方式 而且google的国内服务器已经非常少了 而且电信联通还好点 移动和其他小运营商很多都连不上

      1. Niclau 回复

        我并不会去找国内IP,而是google有好几个二级域名通过国内DNS服务器是解析到国内IP的,没必要绕地球一圈。我看了dnsmasq的文档,已解决这个问题。

        1. cokebar 文章作者

          移动的DNS也有的解析到国内比如说analytics脚本所在的服务器 但是连不上。。

    2. cokebar 文章作者 回复

      如果你需要强制使用国内IP 就要搜集这样的IP 直接用hosts不就行了

      1. Niclau 回复

        我确定我的电脑能连上就行了。PS,我用阿里的DNS。

  8. dover 回复

    Instagram的视频无法播放,请问要在GFwList加个什么IP才行呢

  9. dover 回复

    Instagram的部分图片也打不开。。。。。请问问题出在哪儿?

    1. cokebar 文章作者 回复

      应该是List中缺少了一些域名 站点、app使用的域名不会只有一个 特别是使用了CDN等服务时候就会有多个域名
      而且有的app直接访问IP的不走域名这就没办法了。。。 你只能考虑换用chnroute方案或者手机上额外开客户端了

      1. dover 回复

        之前试过chnroute方案,但有些能直接访问的国外IP也走了SS,降低了访问速度。。。。

        chnroute方案有没有什么办法能让一些国外IP不走SS呢?

        1. cokebar 文章作者

          纯按IP区分的 不可能去区分站点 IP流动性那么大 没种方案都有优缺点 chnroute适合代理速度比较快的

  10. 囧囧有神 回复

    大神,那个更新gfwlist的脚本为什么在我的vps上运行后生成的文件只有脚本里添加的那几个网址?大小也只有1KB。哪里出问题了?

    1. cokebar 文章作者 回复

      运行有出现错误提示吧 python装了么 是2.X的版本么

      1. 囧囧有神 回复

        装了Python的,是2.7.3版的,执行脚本后最后一行显示是done,但是生成的文件只有1KB,转换的网址也只有自己添加的那几个。是要在vps上做什么设置才行吗?vps是ramnode的。

    2. cokebar 文章作者 回复

      我看了一下是我失误 python里面一个目录写错了 已经更新 git pull更新一下

发表回复

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

请输入验证码 *