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. 砼拌饭 回复

    nslookup http://www.facebook.com
    Server: 127.0.0.1
    Address 1: 127.0.0.1 localhost
    nslookup: can’t resolve ‘www.facebook.com’: Name or service not known

    ss-tunnel转发UDP的DNS使用了4个多月一直正常,昨天开始出现上述状况,检查dnsmaq正常运行,ss客户端pc上正常运行可fq,挂路由器上还是不能解析域名。是不是墙又加高了?

    1. cokebar 文章作者 回复

      直接dig @openwrtip -p 5300 http://www.facebook.com 检查ss-tunnel是否正常 然后再把5300改成5353 检查ChinaDNS的状况 更具体的可以使用带-v参数启动chinadns 就可以在ssh中查看具体的输出来排查

      1. cokebar fans 回复

        好像gfwlist好久没更新啦

        1. cokebar 文章作者

          服务器转移之后没加计划任务 目前已经加上

  2. 引用: 教你如何实现Openwrt路由器智能翻墙。 | xqd

  3. Oran 回复

    谢谢,按教程配置OPENWRT路由器成功了。
    但是现在有一个问题。
    路由器会自动ss,国内网站走锅内线路,和谐的网站走SS。
    但是发现一个问题。
    开着SS后,连接日本的PPTP VPN就报619错误。连接不成功。连接北京的PPTP VPN就是正常的。
    关闭SS后,日本的PPTP VPN也可以正常连接。
    不知道是什么原因。

    1. cokebar 文章作者 回复

      你的PPTP是用域名还是IP连接的 域名的话在gfwlist里面么
      如果不在 可能是iptables的NAT规则导致VPN无法穿透网关 试着将文中所述第二条iptables命令中加入–dport选项 将PPTP VPN的端口排除在外

  4. skool9172 回复

    按照您的教程,方案二无法翻墙。而且我一旦按照教程对ss进行修改,那么ss就无法启动。用的是shadowsocks-libev-spec_2.2.0-1_ar71xx,麻烦大神有空指教。

    1. cokebar 文章作者 回复

      这个是gfwlist方案 请不要使用spec版本

      1. skool9172 回复

        我有重新严格按照您的教程执行了一遍,SS安装的是shadowsocks-libev_2.2.1-1。之后还是不行,ss-readir、ss-tunnel都已经运行了。新增加的dnsmasq.d文件夹权限是0755.我的SS加密方式为aes-256-cfb。另外教程里面的SS配置文件和安装后默认的格式不一样,我两个都实验了,全不行。
        尝试SS+DNSmasq翻墙很长时间了,都没有成功过,麻烦大神再指点一二吧,谢谢!

    2. cokebar 文章作者 回复

      1、在PC上清空DNS缓存:ipconfig /flushdns
      在路由器上重启dnsmasq以清空DNS缓存: /etc/init.d/dnsmasq restart
      在路由器上清空ipset: ipset flush gfwlist
      2、检查ss-tunnel(假设端口5300): dig @路由器IP -p 5300 http://www.youtube.com
      如果出现超时 则检查客户端程序运行状态 (也可能是网络原因 比如说运营商封杀了部分UDP端口通讯)
      如果正常解析 无污染 则记录下解析出的A记录(A record)的IP
      3、检查dnsmasq: dig @路由器IP -p 53 http://www.youtube.com
      如果异常 则dnsmasq配置有误 如果和上面的一样 则继续下一步
      4、检查ipset是否正确的添加了该IP: ipset list gfwlist
      查看输出结果是否包含之前记录下的IP 如果没有则 dnsmasq的ipset配置有误
      5、如果上面都无误 那么应该是iptables规则有误

      1. skool9172 回复

        第一步按照您的教程执行完毕。
        第二部执行 dig @192.168.1.1 -p 5353 http://www.youtube.com,返回结果
        ; <> DiG 9.9.4 <> @192.168.1.1 -p 5353 http://www.youtube.com
        ; (1 server found)
        ;; global options: +cmd
        ;; connection timed out; no servers could be reached
        检查进程中有/usr/bin/ss-tunnel -c /etc/shadowsocks.json -b 0.0.0.0 -u -l 5353 -L 8.8.8.8:53
        我用的天津联通,之前可以用此方案翻墙。并且我用WIN版的SS可以正常翻墙。
        感谢您的解答!

  5. Dave Chen 回复

    Hi Coke,
    首先谢谢你的教程,翻墙的路由器终于能搭起来了,我采用的是方案二。

    遇到个小问题,我尝试了你自动更新dnsmasq.conf的脚本
    https://github.com/cokebar/gfwlist2dnsmasq
    结果发现,我在路由器上无法下载
    https://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt
    导致脚本无法跑下去
    但是我在路由器后面的机器上,是可以访问这个URL,脚本也可以正常跑。
    所以我估计是因为,路由器上的请求没有转发给ss,但路由器后的机器的请求却可以经由iptables的规则转发给ss。
    我想作者应该实现了直接在路由器上定期更新gfwlist.txt/dnsmasq.conf的,可否指点一下,如何再添加多条iptables的规则,让路由器可以自己更新gfwlist.txt/dnsmasq.conf?谢谢。

    1. cokebar 文章作者 回复

      在interface设置中 手动配置wan口的dns为127.0.0.1 否则路由器本身依然是走自动获取的dns 没走dnsmasq导致相应IP无法添加到ipset中从而导致没有走ss

  6. openwrt 回复

    感谢教程,已经成功,但是有些国内站点或者国外能上的一些网站可不可以设置忽略,,,,,,,因为我发现有些网站国内不F可以上F了就上不了,,然后我查到信息说可以把网站的ip添加到忽略列表里面然后这个网站就不用代理了,但是我不清楚如何获取这个网站的IP,希望不吝赐教

    1. cokebar 文章作者 回复

      这个是gfwlist方案 貌似你把这个方案和chnroute搞混了 这个是gfwlist中的网站才会走代理

      1. a 回复

        谢谢

  7. bobo 回复

    表示用了中科大的dns之后,神马防污染都不需要了。。。只是还是无法正常翻,XD。求问这是啥问题。。。除了改dnsmasq配置之外都配置好了

    1. cokebar 文章作者 回复

      这里的dnsmasq-full不仅仅是解决DNS污染 还有负责将gfwlist上域名解析出的IP添加到ipset中 不配置dnsmasq-full肯定是翻不了的

  8. Kirl 回复

    @cokebar
    感谢@cokebar带来的精彩教程,使得我这个纯粹小白经过不断重试之后也能翻过来了(openwrt刷的官方版本,采用chinadns方案)。
    这里边可能有些跟我一样菜的人会遇到的问题,写下来提醒下(高人略过):
    1.shadowsocks-libev好像要用2.1.4-1版本,要是最新版愣是找不到/etc/shadowsocks.json,
    2.卸载dnsmasq会出现Not deleting modified conffile /etc/config/dhcp的提示,我的笨方法是opkg install dnsmasq-full后删除etc/config/下面dhcp,将dhcp_opkg重命名为dhcp.

    现在唯一的问题好像是wifi翻不了,有线翻的了。如果有高手也帮我诊断下!
    再次感谢@cokebar,局域网有你更精彩!

    1. cokebar 文章作者 回复

      1. 这个不清楚 找不到自己新建一个也可以
      2. 这个基本不影响 你在luci里面重新配置一遍 保存 就会有新的文件覆盖过去
      3. wifi翻不了的话检查你的wifi是否设置和有线的网口设置在同一虚拟网络下(同一个网段)

  9. Kirl 回复

    感慨一番,还是期望有大虾做个类似一键翻(只需要填入ss账号密码即可)的固件,以方便类似鄙人这样的电脑白痴。
    我们翻过来不为啥,就是为了这点:只要我不伤害别人,别告诉我应该干吗,不应该干吗。

    1. cokebar 文章作者 回复

      确实有人做了 但是这类东西 不学习点基本知识还是比较难搞定 因为会出各类状况 不是刷完填上账号就一定好使的

  10. openwrt 回复

    搞完Fw后没找到你的教程又在百度上百度,发现有一个站跟你的一模一样,就是排版有问题,我刷新了好几遍都是一样,还以为fw后出现的问题,,,,,,,,,结果发现是有人山寨的,,,,,,,,,,

    1. cokebar 文章作者 回复

      有些人会全文转载我的文章但却没有保持原有的排版 直接复制往往会乱掉。我已声明转载需要保持原有相同或相似的排版,并且注明原文,但并不是所有人都能做到。
      PS:搜这类信息还是Google吧。。 而且我的站点设置了robot.txt 已经禁止baidu、soso之类的站点抓取了

发表回复

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

请输入验证码 *