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. mlm 回复

    路由器用了一段时间很稳定,就是wifi有时候速度会很慢,请问楼主这种问题遇到过么。

  2. Ericp 回复

    大家好!
    我的是netgear的wndr4300。按教程到安装dnsmasq-full时出错。
    用opkg install dnsmasq-full和dnsmasq都提示没有这个软件。

    从网上下载回来dnsmasq-full_2.77-2_mips_24kc.ipk来安装,显示:
    Collected errors:
    * satisfy_dependencies_for: Cannot satisfy the following dependencies for dnsmasq-full:
    * libnettle * libnetfilter-conntrack *
    * opkg_install_cmd: Cannot install package dnsmasq-full。。

    1. cokebar 文章作者 回复

      先更新软件列表 opkg update 否则依赖包无法自动安装。 另外,snapshot/trunk版可能无法这样子装,因为可能服务器上的包已经更新到新的内核版本而你的固件是老的,这种只有冲刷新的trunk/snapshot版 rom并立即安装这些包,或者直接刷稳定版。

  3. jebbs 回复

    iptables -t nat -A PREROUTING -p udp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080

    建议再添加udp的规格。最近遇到chrome 和 android youtube 客户端看视频十分缓慢,换浏览器或其他平台的客户端又很快,十分不解。排查了很久发现原因是前者开了QUIC协议,是通过UDP走的。加个上面这个规则就飞快了。当然前提是ss-server开了udp

    1. cokebar 文章作者 回复

      UDP需要在mangle表里用tproxy打mark,这样弄估计是你udp挂了chrome走tcp了

      1. jebbs 回复

        原来是这样啊。我试了下好像还真是,把上面规则的端口随便改效果是一样的。但看来算因祸得福吧,本来走QUIC 老说我异常流量,速度还很差,这样一来正好效果是达到了,还不用走UDP。好像网上说同时开TCP和UDP会被查到?
        对iptables不熟,谢谢你的回复。

      2. jebbs 回复

        不过正常要把gfwlist的IP的udp弄挂,应该用什么规则。我上面那个毕竟是瞎搞 -_-!

    2. cokebar 文章作者 回复

      chrome://flags/#enable-quic 直接把quic关了就行了

  4. jebbs 回复

    Android YouTube 客户端,Google Plus 客户端也是这个问题,但就没有设置的地方了,所以弄挂UDP是必需的。

    1. cokebar 文章作者 回复

      不如干脆配置udp relay让udp也走代理。我iptables只是懂个皮毛,下面的命令没测试过,不过你可以试试:
      ip rule add fwmark 1 lookup 100
      ip route add local default dev lo table 100
      iptables -t mangle -A PREROUTING -p udp -j TPROXY –on-port 1080 –tproxy-mark 0x01/0x01

    2. cokebar 文章作者 回复

      注意需要先安装iptables-mod-tproxy

      1. jebbs 回复

        谢谢。UDP弄挂了之后也挺好,这个方案就暂时还没试。我记录下,有时间再试试。

  5. yuan1984 回复

    博主你好,
    我在按Shadowsocks + GfwList配置
    配置lede后没有出现etc/shadowsocks.json这个文件,自己新建一个之后再新建/etc/init.d/shadowsocks。
    然后再按教程一步步设置,等运行ss-redir -c /etc/shadowsocks.json -b 0.0.0.0 -v后出现如下报错,请问如何处理?
    Error relocating /usr/bin/ss-redir: crypto_aead_xchacha20poly1305_ietf_decrypt: symbol not found

  6. 引用: 如何让小米路由器聪明的使用shadowsocks – wayne@zju

  7. mlm 回复

    博主你好,我按照你的方法设置的路由器,如果想开启ss的udp转发功能(为了ps3游戏联机),应该怎么配置ss。

      1. mlm 回复

        感谢博主。我正是使用你的ipset、iptable+gfwlist配合方案一来翻墙的,请问是否还需按照你发的链接再进行配置。

        1. cokebar 文章作者

          说白了我这个是纯手动一条一条加iptables规则的,规则多的时候很繁琐。luci-app-shadowsocks里则整合了现成的较完善的iptables规则,可以直接用。就好比一个是手动安装,一个是一键脚本。建议去除我的这个GFWList方案的配置,重新按照我给的那个(https://github.com/shadowsocks/luci-app-shadowsocks/wiki/GfwList-Support)链接里面配置。然后再进一步打开UDP代理,配置PS3全局即可
          luci-app-shadowsocks的安装和使用可以参考chnroute那篇,不过那篇是chnroute方案,因此不能按照那篇给出的配置,但是使用方法可以参考。

  8. mlm 回复

    我觉得博主的方法挺好的,手动加被墙网站我觉得并不费劲啊,反而更佳灵活,你给的这个gfwlist的方法,好像每次重启路由或者ss都要手动输入命令啊,对于家里有翻墙需求的老人来说,好像不太适用。如果我直接用原来的配置安装luci-app-shadowsocks,开启udp,配置全局ps3,是不是不能正常使用呢。

    1. cokebar 文章作者 回复

      本篇的gfwlist方案,命令写到luci里“防火墙 – 自定义规则”中是会开机自动添加的,不用手动。不过本篇文章没给出UDP代理的iptables语句,你要代理游戏就要手动增加这些语句,你得会写才行。我说的一条一条增加iptables规则可不是手动加被墙网站。这里的iptables规则是控制路由器如何做NAT转发你的数据包达成透明代理效果,手动写上手难度大。

      1. mlm 回复

        gfwlist这个教程里的“iptables -t nat -I SS_SPEC_WAN_AC 1 -m set –match-set gfwlist dst -j SS_SPEC_WAN_FW”这段代码,加到自定义规则里,重启路由器仍然需要手动执行。不知道为什么。

    2. cokebar 文章作者 回复

      重启一下 不要手动输入那行代码 然后运行:
      iptables-save > /tmp/iptables-rules
      然后把/tmp目录下iptables-rules文件发我邮箱我看看

      1. mlm 回复

        已发送,谢谢老师。

    3. cokebar 文章作者 回复

      shadowsocks启动时候会先销毁之前的所有规则并重建,然后估计启动时候shadowsocks启动的比较靠后,所以还是失效了。 按这个步骤来吧(首先先把之前添加到防火墙自定义规则的东西去掉):

      1. 进入 Luci 界面 -> 访问控制 -> 外网区域
      「被忽略IP列表」 选择留空(/dev/null)
      「额外被忽略IP」 设置为 0.0.0.0/1 和 128.0.0.0/1

      2.对于 GfwList 中的 IP 地址, 可以直接添加到「强制走代理IP」里
      也可以保存为一个 IP 列表文件后将列表文件路径填到「走代理IP列表」里

      对于 GfwList 中的域名, 新建一个 dnsmasq 的配置文件, 里面写入类似如下的内容

      # 使用不受污染干扰的 DNS 解析该域名
      server=/google.com/127.0.0.1#5353
      # 将解析出来的结果保存到名为 gfwlist 的 ipset 表中
      ipset=/google.com/SS_SPEC_WAN_FW

      然后OK了 不用别的改动
      访问控制里如果配置的是”正常代理”,则会对应GFWList模式,List内走代理,其他直连
      访问控制里如果配置的是”全局代理”,则全部走代理
      访问控制里如果配置的是”直接连接”,则全部不走代理

      1. mlm 回复

        谢谢,明白你的意思了,把ipset直接指向了SS_SPEC_WAN_FW,这样重启也不会有问题了。

        1. 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里面

  9. mlm 回复

    明白了,求教飞羽老师,我按照你的方法,在另一台路由器上重新做了一遍系统,安装了luci-app-shadowsocks,并且按照你的chnroute方案安装了libudns,libsodium,shadowsocks-libev。并且按照你给的链接在etc下添加了dnsmasq.d的文件夹,里面加了list。设置了被忽略IP列表和额外被忽略IP。执行了教程下面几条语句。现在shadowsocks是正常启动。但是并不能翻墙。什么原因啊,是我少装了什么软件么。

    1. mlm 回复

      补充一下,我装的是dnsmasq-full这个版本。

    2. mlm 回复

      找到原因了,每次更新shadowsocks设置都要重新输入命令

  10. mlm 回复

    尝试了一下,并不能翻墙啊,youtube部分能打开,很奇怪,google.com一直在读取,打不开。

发表评论

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

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