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

422 条评论

  1. yueduz 回复

    方案三也要填写DNS转发
    帮助 将指定的域名DNS解析转发到指定的DNS服务器(按照示例填写) .不填好像就不能上列表外的网站了.但是文章里没有提到

    1. ooo 回复

      我的也是这种情况,这样是不是所有解析都要送chinadns处理一遍,从而会导致速度比较慢?

      1. cokebar 文章作者 回复

        不在列表里的是走ISP的DNS的。dnsmasq会读取/tmp/resolv.conf.auto文件的配置,这个文件包含的是wan口收到的自动配置的DNS,也就是isp的DNS。确保DHCP/DNS设置里没有勾选忽略解析文件

  2. yueduz 回复

    而且我觉得三步曲 3 要比1快,

  3. yueduz 回复

    步曲1的域名解析总感觉没有3快,我在1和3 都使用了chinadns

    1. kylinxms 回复

      1的原理是说GFW现在只会干扰53端口的DNS查询,当然你opendns这种有名的会重点关注,你如果是用自己的VPS搭建DNS,找个不是53的端口GFW就不会干扰域名解析

    2. cokebar 文章作者 回复

      gfwlist的方案 只有list中的才会转发到特定的DNS 不在列表中的还是走ISP的DNS 速度很快 而chnroute那种方案 每个dns解析都是转发到chinadns的 chinadns在获得国内和国外两个解析结果后才能经一定算法判断后返回最终结果 如果你的国外DNS延迟较高 确实会慢一些 可以考虑换用aa65535编译的dnsmasq修改版(可调整TTL cache大小等) 或者换用pdnsd改善一下(其实就是加强缓存功能)

  4. lee 回复

    刚新弄了下,跟你的内容不同,不知从何改起。。。

    1. cokebar 文章作者 回复

      这个是原版 非spec版本

      1. lee 回复

        OK呢,非常感谢!

  5. lee 回复

    另外
    下载 dnsmasq_list.conf 后放入该目录
    这个要改名字吗,看你后面写的是
    那么使用替换功能将 /etc/dnsmasq.d/gfwlist.conf 里面的 127.0.0.1#5353 全部替换成 3.4.5.6#5050 即可。
    两个名字不同

    1. lee 回复

      因刚接触不久,基本全是按本博客设置,请帮忙看看以下自动更新功能有无问题,此条是参照博客和google自已弄的,谢谢
      0 1 * * * wget -O- –no-check-certificate https://cokebar.info/wp-content/uploads/secured_files/dnsmasq_list.conf | sed ‘s/127.0.0.1#5353/xxx.xxx.xxx.xxx#1212/g’ > /etc/dnsmasq.d/dnsmasq_list.conf
      DNS服务器已隐藏

      1. cokebar 文章作者 回复

        检查一下输出文件内容就行了 话说应该是两道英文短杠: –no-check-certificate

        1. lee

          谢谢,换了个思路,按你的格式手动自己弄这个文件了,目前就只加了常用的几个站。

        2. lee

          每次更新gfwlist.conf内容后都需要 /etc/init.d/dnsmasq restart 来重启dnsmasq然后才有效,不知有无更好的方法

  6. zk 回复

    请问一下我想选用方案三,路由器的选择方面是不是只要是openwrt支持的路由器都可以,

    1. lee 回复

      应该可以吧,都支持openwrt了,ss应该也支持

      1. zk 回复

        你用的什么路由

        1. lee

          hg255d, 马云那买的

        2. lee

          出于网上很多教程提到的东西不是很容易装上去(提示内核版本依赖什么什么版本。。。)
          所以是自己根据需要编译的,只用了ipv6,mwan3及ss这三个东西,其它的等有需要及兴趣时再弄。

      2. zk 回复

        恩 谢谢

  7. pu 回复

    ipset -N gfwlist iphash
    iptables -t nat -A PREROUTING -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080
    iptables -t nat -A OUTPUT -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080

    请问这几个规则是直接粘贴在自定义路由的页面里么?

    1. kylinxms 回复

      写在 /etc/rc.local 里面可以开机自启动
      记得用全路径或者你一开始就设置好PATH

    2. cokebar 文章作者 回复

      自定义防火墙规则里面

  8. 砼拌饭 回复

    博主,按照 gfwlist的方法设置好了。其他都没有问题,脸书小鸟微博都行。唯独google,youtube不能用。已经手动修改了list增加了这些地址。重启还是不能用。不知道什么原因,求排查问题思路。

    1. cokebar 文章作者 回复

      是用我的那份list文件么? 你用的哪种DNS方案?尽量不要用第三种

      1. 砼拌饭 回复

        使用第二种DNS方案。用的你的list。开始不能用,自己增加了/.google.com还有YouTube的项目,增加以后还是不能翻。fb和小鸟和反革命网站都正常使用。google旗下的都不行。

      2. 砼拌饭 回复

        已查明原因:之前在电脑上使用goagent这货在host里面写了google全家的地址和ip,当然现在失效都连不上了。当然无论怎样弄都不行。取消电脑host中的信息解决问题。另:2.1.1的sspolar貌似经常停止工作,,稳定性差点。

  9. zasl 回复

    博主,我想问一下,如果用方案3,师傅能添加自定义的网站来翻墙?如果可以,请问添加的格式是怎么弄的?

    1. cokebar 文章作者 回复

      三种方案添加自定义站点的步骤都是一样的,都是修改dnsmasq_list.conf

      1. zasl 回复

        博主,现在在吗?在尝试用方法3遇到问题了。

      2. zasl 回复

        博主,
        1:我按照你的方法操作到/etc/init.d/shadowsocks 修改配置文件的时候,我的ss内容不是这样的,我就把你的内容全部复制到这个文件里面,不知道这样是否可行,安装的是非spec的版本
        2:你第二部的3行内容是不是直接复制到网络→防火墙→自定义规则里面最下复制进去就好了?
        3:启动开机运行ss是不是直接在putty里面执行这2行就ok了?

        这样做了,但是无法翻墙出去,看到上面的一位朋友说dns要指定127的哪个也试了,也是不行的。我原来是按照你的ss和chinadns图文教程做的,那2个软件都有luci,方便操作,这次我真的不会了,请麻烦腾出时间帮忙解决一下,谢谢了

    2. cokebar 文章作者 回复

      1、随着版本更迭,作者对启动脚本可能有改动,直接粘贴我的过去,如果软件没有对启动参数大改的话是没有问题的。
      2、是的
      3、是的
      这个方式和chnroute方式完全不同请不要更改luci里面的DHCP/DNS设置,不要忽略解析文件,不要添加no-resolve,不要在luci的DNS设置里填127.0.0.1,只添加dnsmasq_list.conf文件并确保/etc/dnsmasq.conf里面加入了conf-dir=/etc/dnsmasq.d。同时你要保证正确的安装了ipset和dnsmasq-full,可以访问一个被墙站点后,执行ipset list看看有没有相应的IP加进去;如果为空就表示dnsmasq-full并未成功将相应的IP加进去,此时检查dnsmasq的配置,如果加进去了,就检查shadowsocks是否正常,检查自定义防火墙规则是否生效。

      1. zasl 回复

        这个是没有问题的,我是重新刷了openwrt,然后尽量按照你的教程来做的了,所以不会做到更改dns和dhcp那些的,我可以非常确定的是昨天我用这个方法是无法翻墙的,但是今天打开电脑却莫名其妙可以翻墙了,昨天操作的时候也重启过路由社么的,就是不行,刚才执行了ipset list,但是看到很多的ip地址,哪个地址是对应我访问的网址的,这个怎么查呢?还有检查自定义防火墙应该如何检查?如果可能,你是否可以帮助我远程看一下?我非常需要这种方式来上网。

        1. zasl

          看来还是不行,手机不能翻。。。。

        2. zasl

          还有,你的文件发现个问题,就是google.co.jp这个有错误
          顺便加上这个吧?
          server=/203.195.174.41/127.0.0.1#5353
          ipset=/203.195.174.41/gfwlist
          server=/203.195.174.41/127.0.0.1#5353
          ipset=/203.195.174.41/gfwlist
          Evernote国际版的同步地址

        3. cokebar 文章作者

          google.co.jp是没有问题的 google日本就是这个域名不是com
          其他内容请自行添加 本人只是利用gfwlist自动生成 不维护额外的列表

  10. kszym2002 回复

    请问作者 有没有办法把一个或多个内网IP排除在这个列表里呢?
    就是假设 192.168.1.20 我想让他全部流量走SS 如何才能实现呢?

    1. cokebar 文章作者 回复

      自行修改iptables规则即可

      1. ppss 回复

        请问能帮忙写一下吧,不会写iptables

发表评论

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

请输入正确的验证码