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

508 条评论

  1. 夜雨声烦 回复

    手机app 如google+ YouTube等能通过这种方式翻吗 我试了下 刚开始好像能用 怎么这几天突然不行了

  2. dover 回复

    能不能同时配置两个服务端IP?

    1. cokebar 文章作者 回复

      不支持多服务端IP

  3. wygr 回复

    博主,我一直用的是第一种方案,已经几个月了,但昨天开始不行了,表现在可以翻墙,但国内网站也走的是ss,ip查询http://www.ip138.com/显示的是ss地址,国内部分网站打不开,没按照域名分流了。这是什么问题?
    ps:我的设置好后一直没有更改,原来都可以的,我把原来备份的镜像恢复,也不行,重新安装一遍也没用

  4. Jerry 回复

    我小米mini,自带Shadowsocks+ChinaDNS+dnsmasq,ChinaDNS默认是1053端口,Shadowsocks的透明代理端口是1153,请问我该把dnsmasq_list.conf中的5353改为1053还是1153?

    1. cokebar 文章作者 回复

      自带的不知何人编译不知和原作者的版本做出了何种修改不一定兼容此方法

    2. cokebar 文章作者 回复

      将其卸载掉重新按照此方法安装

  5. Carlo 回复

    表示我想用第二种方法,但是一直都解析不了域名。。。

    1. cokebar 文章作者 回复

      服务器未开启udp支持

  6. arfaWong 回复

    第三种使用ChinaDNS中,假设我的上游服务器地址配置是114.114.114.114,8.8.4.4,是不是国内的域名就自动用114.114.114.114来解析,国外的用8.8.4.4来解析?还有上游服务器地址这里可以设置端口吗(例如opendns的非标准端口)?

    1. cokebar 文章作者 回复

      1.是的 2.可以,IP:port

      1. arfaWong 回复

        第二步的2中,防火墙规则只设置了tcp,如果玩游戏用到了udp,那应该怎么配置?

        1. cokebar 文章作者

          这是基于域名的方案 不支持你说的情况

        2. cokebar 文章作者

          而且shadowsocks并不适合代理外服游戏 一则跑代理的服务器的udp通讯容易被干扰 二则shadowsocks有超时时间的设定 你使用shadowsocks玩游戏 如果游戏中你闲置一段时间可能会掉线 三则提供翻墙的代理服务器并不是做游戏加速服务的专线服务器 往往反而会导致延迟增加
          方法:1、使用专业的游戏加速器 2、使用vpn代替shadowsocks openwrt下可以使用openvpn openconnectvpn等

  7. blueboyggh 回复

    请问第二种方案,我挂pt的时候,会不会导致连接国外用户全部都走ss了?

    1. cokebar 文章作者 回复

      不会 只有GFWList中的才会走代理

      1. blueboyggh 回复

        也就是,这种方法,原理就是先把gfwlist里面的域名全部解析成ip,存起来,然后再去根据ip判断是不是需要走ss?

  8. blueboyggh 回复

    错了,是第三种方案

  9. blueboyggh 回复

    感谢楼主,实验成功,但是实测需要在DHCP/DNS设置页内的“DNS转发”填入127.0.0.1#5353,不然全部网页都无法解析,这个是教程没写还是我哪儿弄错了?

    1. cokebar 文章作者 回复

      不需要填入这个,但不要勾选忽略解析文件。不要和chnroute混了。不过你这样差不多也能用

      1. blueboyggh 回复

        不填的话,就算不勾忽略解析文件也没办法解析网页…是我哪儿弄的不对吗?

        1. cokebar 文章作者

          不勾的话要补上解析文件的位置

      2. blueboyggh 回复

        又试了一下,您说如果想让路由器本身可以走代理的话,就要在接口那里填上127.0.0.1,这样填了之后,貌似就必须填DNS转发了,接口那里不填就不用填转发

    2. cokebar 文章作者 回复

      如果想用公共DNS取代ISP的DNS,可以勾选忽略解析文件并在DNS转发填入公共DNS的IP

  10. blueboyggh 回复

    大神,另外还有一个问题,每次更新dnsmasq_list.conf的时候,除了重新下载一下这个文件复制到路由器上,还需要做其他操作吗?

    1. cokebar 文章作者 回复

      重启dnsmasq
      /etc/init.d/dnsmasq restart
      更新不用太频繁 一周到一个月即可

发表评论

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

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