Shadowsocks + GfwList 实现 OpenWRT / LEDE 路由器自动翻墙

shadowsocks 服务器合租招募

本站发布的三种 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 ,格式如下:

新建文件: /etc/init.d/shadowsocks :

修改文件权限:

然后启动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

445 条评论

  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自己封的。

1 2 13 14 15 16 17

发表评论

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

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