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 CC 15.05.1 及更早版本安装步骤
LEDE 安装步骤
二、配置

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的方案,有三种:

方案一:

在代理服务器上搭建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 即可。

最后重启路由器即可。

方案二:

使用ss-tunnel转发UDP的DNS请求,修改 /etc/init.d/shadowsocks 文件,如需修改上游DNS,请修改 DNS=8.8.8.8:53 字段,本地端口修改 TUNNEL_PORT=5353 :

最后重启路由器即可。

方案三:(废弃,不要使用,请使用方案二。如果方案二有问题,请使用TCP方案,参考:TCP 方式查询解决 DNS 污染问题

方案三

PS1:发现有不少人之前用过chnroute方案,然后改成gfwlist方案,此时记得把忽略解析文件的勾选去掉并把原来的设置填回去:

problem1

PS2:默认只有连接路由的设备翻了墙,为了让路由器自身也能够翻墙(如使用路由器获取gfwlist更新dnsmasq_list.conf时候,gfwlist的URL是被墙站点,此时需要路由器自身也要翻墙)做出如下配置,先在自定义防火墙规则中额外加一条:

然后再WAN口配置中如图所示,将DNS手动指定为127.0.0.1:

ss222

 

最后在DHCP/DNS设置中将你的ISP的DNS填入(或者使用114DNS等公共DNS)

dnsmasq_localdns

 


参考文章:https//kyonli.com/p/18

496 条评论

  1. thesun 回复

    我想请教一下,我按照教程安装好了,开始速度很快,但是过段时间境外网站就会变的很慢,甚至打不开,为什么呢?同一个SS服务器,我如果用windows版本ss代理连接就很快,说明不是服务器的问题,请问为什么?

    1. cokebar 文章作者 回复

      1. 路由的系统日志里看看有无大量ss的报警日志;
      2. 检查路由器当前连接数,以及路由器的负载,是否开了过多的连接导致路由器吃不消了,如果网络内有在使用P2P类软件更要注意路由器的性能问题;低端路由CPU性能比较弱,国内一些比较无耻的软件,比如说某雷影音,会打开成百上千个连接搞P2P传输,OpenWrt本身就不支持硬件NAT加速,此种情况会很快耗尽CPU的计算资源,这时候如果还要计算ss的加解密(特别是aes-xxx-xxx这种计算量比较大的算法),直接结果就是慢的要死。
      3. ss是否设置过长的超时时间,过长的超时时间也可能造成ss有过多的连接数
      4. 可以通过/etc/sysctl.conf优化一下

  2. mlm 回复

    飞羽老师,承接上次的问题,我按照你的方法更改了list,当时是可以翻墙的,但是隔一段时间又不行了,直接无法连接,我是自己用pdnsd架的dns服务器在我的vps上,需要把我的vps的ip设为强制翻墙么?

    1. mlm 回复

      今天的使用情况来看,时好时坏,有时候会自己恢复,能够正常翻墙,然后过一会又不行了。。

    2. cokebar 文章作者 回复

      这个回复你看了没:
      “我二了 SS_SPEC_WAN_FW是iptables链,这里应该对应ipset名,应该是:
      server=/google.com/127.0.0.1#5353
      ipset=/google.com/ss_spec_dst_fw
      注意,如果你的防污染DNS用的国外DNS是8.8.8.8,且走了shadowsocks了,那么要把8.8.8.8填到强制走代理IP里面”
      如果照做了,那么继续排查:
      检查一下dnsmasq对于GFWLIST上的DNS解析是否有异常,并且ipset是否正常添加了,可以按照下面的步骤:
      1. PC上退出所有浏览器等可能连接被墙站点的程序,并且 ipconfig /flushdns 清缓存
      2. SSH连接路由器,重启shadowsocks和dnsmasq( /etc/init.d/shadowsocks restart /etc/init.d/dnsmasq restart
      3. SSH中ipset list ss_spec_dst_fw,应该是空的,看不到任何IP
      4. PC上使用dig或者nslookup,尝试解析被墙域名,如:
      dig @192.168.1.1 -p 53 www.google.com
      如果DNS设置没有问题,那么应该返回无污染的解析结果,记下结果的IP
      5. SSH中ipset list ss_spec_dst_fw,此时ipset中应该已经有IP了,应该正好是上一步骤的解析结果

    3. cokebar 文章作者 回复

      注意我这个方式,如果重启shadowsocks(此时ipset被清空),则必须同时重启dnsmasq(否则直接走缓存,dnsmasq不会向ipset中添加IP),客户机也必须清除DNS缓存(否则客户机直接使用本地缓存,不通过dnsmasq,则也不会向ipset中添加IP)

      1. mlm 回复

        感谢飞羽老师详细的解答,我周末是看了你的回复马上改了试的,一开始确实是各种不稳定,看到你的排查方式,我猜是不是我修改shadowsocks之后,它自动重启了ss,但是dnsmasq并没有重启,那么造成dns解析错误,很有可能是这个原因。我觉得你的这些回复可以作为我刷路由器的标准教程了,赞一个。我用的是自己的vps做的dns服务器,就像:server=/.lsxszzg.com/104.194.72.179#5656这种,之前用你的第三种方法,这种写法完全没问题,所以我想还是你说的这个dns缓存没有清空的问题。目前使用一切正常,有问题会按照你的方式进行排查,再次感谢!

  3. 喵喵银 回复

    为什么chnroute那篇有luci下的配置教程,这篇就全是命令行……

    1. cokebar 文章作者 回复

      chnroute那篇的luci-app-shadowsocks最初是专为chnroute绕行模式设计的,后来虽说加入了不少功能,可以通过一些步骤实现gfwlist模式,但是还是有点小问题没解决;如果解决了可能会补充通过luci-app-shadowsocks实现gfwlist方案的步骤

  4. mlm 回复

    求教老师,路由器在修改了一下shadowsocks设置后就又翻不了了。按照你的方法,现重启dnsmasq和ss,然后dig google, 返回ip是172.217.5.196, 查询路由器ipset list ss_spec_dst_fw 也是这个ip。但是依然无法翻墙,不光是电脑,手机都不行,一经清空dns了。求解啊,感觉这个luci的版本用gfwlist还是不太稳定,有时候修改ss设置就没问题,有时候就不行了。

    1. mlm 回复

      74.125.204.113
      216.58.216.10
      172.217.11.74
      74.125.204.100
      216.58.217.202
      172.217.11.78
      216.58.219.10
      54.215.170.9
      173.194.203.188
      172.217.4.138
      172.217.4.163
      74.125.199.125
      172.217.11.170
      216.58.193.202
      74.125.204.138
      172.217.5.202
      74.125.204.139
      74.125.204.102
      172.217.5.206
      172.217.5.74
      216.58.219.14
      74.125.204.101
      用网页尝试登陆youtube google ipset里面就多了很多ip。

1 2 15 16 17 18 19

Blueness进行回复 取消回复

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

请输入验证码 * 请输入正确的验证码