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 / OpenWrt trunk 安装步骤
二、配置

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 或者其他,则执行:

2.3 添加gfwlist和China-List配置文件:

新建并进入目录  /etc/dnsmasq.d ,下载 dnsmasq_gfwlist_ipset.conf 后放入该目录。

自动生成dnsmasq_list.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 :

最后重启路由器即可。

方案三:

此方案使用ChinaDNS来做防DNS污染,先下载并安装相应的包(请根据CPU型号选择):

OPENWRT:

chinadns-openwrt: http://openwrt-dist.sourceforge.net/packages/OpenWrt/base/

luci-app-chinadns: http://openwrt-dist.sourceforge.net/packages/OpenWrt/luci/

LEDE:

chinadns-openwrt: http://openwrt-dist.sourceforge.net/packages/LEDE/base/

luci-app-chinadns: http://openwrt-dist.sourceforge.net/packages/LEDE/luci/

安装完成后,进到luci,指向服务,点击ChinaDNS,填入上游服务器地址,可以保留默认的114.114.114.114,8.8.4.4,确保本地端口是5353(也就是和dnsmasq_list.conf里面的127.0.0.1#5353保持一致)。

method3

最后重启路由器即可。对于特殊情况,如长宽用户无法使用方案一和方案二时(长宽用户不支持方案三),可以考虑换成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

394 条评论

  1. bing 回复

    etc/init.d/shadowsocks这个是配置文件,把里面关于ss-rules的内容全部删除

  2. blueboyggh 回复

    不管是用dns的那种方案,过一段时间,都会出现国外地址无法解析的问题,请问这是为啥

  3. bluehj 回复

    你好博主,有一问题。我用GFWList翻墙,用的ss-tunnel -c $CONFIG -b 0.0.0.0 -l 5353 -L 8.8.8.8:53 解决DNS问题 。GFWList列表外是可以不走我的ss服务器的,但列表内的总是解析不出来DNS.后来我发现我把SS所在的VPS服务器的IPTABLES 服务停掉,就都正常了。我的VPS平时是启用iptables的,并且打开SS服务的端口的。我的服务器平时用WINDOWS 手机等客户端都是可以正常使用的。这回想把SS客户端植入OPENWRT路由器里,就卡在这个问题上了。不知道我的VPS服务器上的IPTABLES需要加入什么命令才能放行DNS呢?

    1. bluehj 回复

      # 我的vps上IPTABLES 规则如下
      *filter
      :INPUT ACCEPT [396:30624]
      :FORWARD ACCEPT [0:0]
      :OUTPUT ACCEPT [216:23216]
      -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
      -A INPUT -p icmp -j ACCEPT
      -A INPUT -i lo -j ACCEPT
      -A INPUT -p gre -j ACCEPT
      -A INPUT -m state –state NEW -m tcp -p tcp -m multiport –dports 22,21234(ss端口),80,53,5353,443,47,1723 -j ACCEPT
      -A INPUT -m state –state NEW -m udp -p udp -m multiport –dports 53,5353 -j ACCEPT
      -A INPUT -j REJECT –reject-with icmp-host-prohibited
      #-A FORWARD -j REJECT –reject-with icmp-host-prohibited
      COMMIT

    2. cokebarcokebar 文章作者 回复

      打开udp端口

      1. sam 回复

        按照文章设置直接连接路由器可以按地址列表GFWList选择翻墙,但是使用openvpn 连接后只能连接国内网站,无法翻墙。route 的情况,使用的openwrt系统。
        default 159.233.133.133 0.0.0.0 UG 0 0 0 eth0.2
        10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
        10.8.0.2 * 255.255.255.255 UH 0 0 0 tun0
        159.233.133.133 * 255.255.255.192 U 0 0 0 eth0.2
        192.168.11.0 * 255.255.255.0 U 0 0 0 br-lan
        192.168.215.0 * 255.255.255.0 U 0 0 0 br-public
        桥的情况是
        bridge name bridge id STP enabled interfaces
        br-lan 7fff.54369b29e46f no eth0.1
        ra0
        br-public 7fff.54369b29e46f no eth0.3
        请问如何操作,查找网上,说是tun0 没走br-lan。
        不知道该怎么处理。

        1. cokebarcokebar 文章作者

          十一我争取更新一篇基于aa65535的luci-app-shadowsocks的教程,chnroute和gfwlist方案都已使用,你说的这个问题应该可以解决。至于自己手工解决则需要添加对应tun0的interface的转发规则

        2. sam

          tun0的interface的转发规则,是什么,以下都试验过了,不成功
          route add 10.8.0.2 netmask 255.255.255.255 gw 192.168. 11 .1 dev tun0
          iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT –to 192.168.11.1
          iptables -t nat -I POSTROUTING -o tun0 -j MASQUERADE
          iptables -D FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
          iptables -D FORWARD -s 10.8.0.0/24 -j ACCEPT
          iptables -D FORWARD -j REJECT
          iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

  4. ryan 回复

    请问博主,能解释出地址但是总是网站拒绝我们的了解请求是为什么?地址端口密码加密方式都正确啊

  5. cokebar fans 回复

    请问博主遇到过非标准端口DNS无法解析的情况吗?我的VPS最近就出现了DNS无法解析的情况,换了一个端口维持没两天又被干掉……

      1. cokebar fans 回复

        谢谢回答,现在用了方案二的转发,至此就出现过一次解析不好用的情况,不过也是很快就好。可惜服务器不能使用GO版本了

  6. xiaoxu 回复

    博主,我用的方法二解决DNS问题。现在有个问题是,在dnsmasq_list.conf 文件中,只要有对gfwlist 的ipset的添加(也就是说这个文件中但凡有 ipset = …../gwflist 这样的语句),之后就无法解析任何网址。比如

    root@OpenWrt:/etc/dnsmasq.d# ping baidu
    ping: bad address ‘baidu’

    求教!

    谢谢!

  7. xiaoxu 回复

    因为没有install dnsmasq-full… 解决了,谢谢!

  8. cokebar fans 回复

    经过测试,非标准端口dns背锅,出现无法解析的情况是因为6月3日的版本,我习惯性更新造成了这个原因,而且这个版本造成我的路由每天晚上12点多的时候不稳定,多次重启,不知何故,现在换成上个版本之后正常,不过心有余悸,伴有怀疑,在考虑是不是换成以前古老版本。

  9. 引用: Shadowsocks + GfwList 实现 OpenWRT 路由器自动翻墙 | 清风明月

  10. cokebar fans 回复

    博主你好呀, dnsmasq_list为什么不更新了呢?

    1. cokebar fans 回复

      用了楼主的脚本生成了最新的,竟然多了70多KB的网址……好多以前自定义的里面都有啦

发表评论

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

请输入正确的验证码