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

    之前用chnroute,现在改gfwlist,按步骤配置一切正常,用第二种方案防DNS混淆,最后无法翻墙
    dig @192.168.1.1 -p 5353 twitter.com 返回正常的IP,但无法ping通,请问是什么地方出问题了?

  2. theosoft 回复

    我用了方案3,http的请求都能自动分流了,但是像google这种会强制重定向到https的请求都打不开。手动设置代理到路由的1080端口就没问题。prerouting和outing都设了,想问问是哪里出错了。

    1. cokebar 文章作者 回复

      检查浏览器代理设置,请使用直接连接不要使用任何代理。DNS使用路由器IP。理论上能不能连和HTTP还是HTTPS没关系。

  3. edward 回复

    为什么安装完shadowsocks-libev openssl之后,没有/etc/init.d/shadowsocks这个配置文件啊…

    1. cokebar 文章作者 回复

      aa65535新版本去掉了init.d脚本,只保留了二进制可执行文件。新建那个文件就行了。另:这篇文章提到的下载链接已经老了,目前已经更新新目录

      1. edward 回复

        多谢回复,还以为自己操作上有什么问题

  4. dover 回复

    我是照到方案二来安装的,昨天tumblr的图片都能正常浏览,今天突然图片都打不开了,想问下博主会是什么情况呢?
    访问其它网站是正常的

    1. dover 回复

      原来是VPS抽疯。。。打扰了,博主

  5. dover 回复

    请问怎么开OTA?

    1. cokebar 文章作者 回复

      config.json中添加 “auth”:true

      1. dover 回复

        开了OTA后比不开OTA网速要慢,不知这种情况是否正常呢?

  6. koklib 回复

    求教:dns选择了方案三,但启用了chinadns以后始终是”未运行“状态,netstat查看过没有端口冲突,更换过阿里/google/114等上游服务器都启动不起来,该如何排查原因?

    1. cokebar 文章作者 回复

      手动命令行运行chinadns +参数启动,看是否成功,报什么错,用法:
      usage: chinadns [-h] [-l IPLIST_FILE] [-b BIND_ADDR] [-p BIND_PORT]
      [-c CHNROUTE_FILE] [-s DNS] [-v]
      Forward DNS requests.

      -h, –help show this help message and exit
      -l IPLIST_FILE path to ip blacklist file
      -c CHNROUTE_FILE path to china route file
      if not specified, CHNRoute will be turned off
      -d enable bi-directional CHNRoute filter
      -y delay time for suspects, default: 0.3
      -b BIND_ADDR address that listens, default: 127.0.0.1
      -p BIND_PORT port that listens, default: 53
      -s DNS DNS servers to use, default:
      114.114.114.114,208.67.222.222:443,8.8.8.8
      -m Using DNS compression pointer mutation
      (backlist and delaying would be disabled)
      -v verbose logging

  7. Pepsi hgr 回复

    在 CHAOS CALMER (15.05.1, r48532) 有些变化。
    * dnsmasq
    需要在 dnsmasq.d 里面加入:
    conf-dir=/etc/dnsmasq.d
    这样不需要改动 /etc/config/dhcp

    * /etc/init.d/shadowsocks

    #!/bin/sh /etc/rc.common

    START=95
    USE_PROCD=1

    #SERVICE_USE_PID=1
    #SERVICE_WRITE_PID=1
    #SERVICE_DAEMONIZE=1
    #SERVICE_PID_FILE=/var/run/shadowsocks.pid

    CONFIG=/etc/shadowsocks.json
    DNS=8.8.8.8:53
    TUNNEL_PORT=5353

    start_service_ss_proxy() {
    # Proxy Mode
    procd_open_instance
    procd_set_param command /usr/bin/ss-redir
    procd_append_param command -c $CONFIG
    procd_append_param command -b 0.0.0.0
    procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
    procd_set_param file $CONFIG
    procd_close_instance
    #service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
    }

    start_service_ss_udp() {
    # Tunnel
    procd_open_instance
    procd_set_param command /usr/bin/ss-tunnel
    procd_append_param command -c $CONFIG
    procd_append_param command -b 0.0.0.0
    procd_append_param command -u
    procd_append_param command -l $TUNNEL_PORT
    procd_append_param command -L $DNS
    procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
    procd_set_param file $CONFIG
    procd_close_instance
    #service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l $TUNNEL_PORT -L $DNS -f $SERVICE_PID_FILE
    }

    reload_service()
    {
    stop
    start
    }

    start_service() {
    start_service_ss_proxy
    start_service_ss_udp
    }

    1. cokebar 文章作者 回复

      修改/etc/dnsmasq.conf也是可以的,但是我觉得还是尽量使用UCI比较好。
      然后就是没看懂你贴ss启动脚本要表达什么

      1. Pepsi hgr 回复

        文章里面的脚本stop的时候不能结束掉ss-tunnel。我正好看了下 procd init script,在原来脚本的基础上改写了一下。贴出来给大家参考。

        1. cokebar 文章作者

          之前没注意过这个问题,回头我测试一下,不知道是不是PID FILE的问题。
          procd貌似是前台运行。

        2. Pepsi hgr

          应该是PID FILE的问题。我开始想应该可以通过调整service_start的参数指定pid文件,区分ss-redir和ss-tunnel。对这块不熟,在参考init.d的其它脚本时候,发现都在使用procd,所以直接看了下procd init script,发现这个很强大,可以自动监视服务状态,可以监视文件触发自动reload,就顺便改写了下。
          至于前台运行,好像没有什么坏处。

        3. cokebar 文章作者

          测试完毕 已更新启动脚本

      2. Pepsi hgr 回复

        在 dnsmasq-full – 2.73-1 里面按照文中的方法,使用 uci 向 /etc/config/dhcp 里面加入 ‘list confdir=/etc/dnsmasq.d’ 发现不起作用。google发现有直接修改 conf-dir 可以工作的。另外,安装的默认启动脚本 /etc/init.d/dnsmasq 设置的 ‘conf-dir=/tmp/dnsmasq.d’,所以我能想到的解决方法有2个:修改 /etc/dnsmasq.conf 覆盖默认的conf-dir,或者每次把 list config文件拷贝到 /tmp/dnsmasq.d。我采用了第一个方法。

        1. cokebar 文章作者

          看了一下Chaos calmer的init.d,确实uci 添加confdir没用,Lede是没有问题的

  8. Pepsi hgr 回复

    请问 ipset, iptables 的两条命令放在哪里比较合适?
    我是增加了一个启动脚本:
    /etc/init.d/gfwlist_ipset

    #!/bin/sh /etc/rc.common
    # Copyright (C) 2006 OpenWrt.org

    # Start *BEFORE* dnsmasq
    START=55

    start() {
    ipset -N gfwlist iphash
    iptables -t nat -A PREROUTING -p tcp -m set –match-set gfwlist dst -j REDIRECT –to-port 1080
    }

    1. cokebar 文章作者 回复

      Luci防火墙规则中有一个自定义规则

      1. Pepsi hgr 回复

        试了一下,在Luci防火墙规则的自定义规则里面加入这2条命令,发现不起作用。不知道是不是和启动顺序有关。我的版本是 CHAOS CALMER (15.05.1, r48532) 。

        1. cokebar 文章作者

          试试放到rc.local

    2. cokebar 文章作者 回复

      不应该 这里的自定义规则只和iptables和luci-app-firewall相关

  9. Pepsi hgr 回复

    前面有个笔误。
    * dnsmasq
    需要在 /etc/dnsmasq.conf 里面加入:
    conf-dir=/etc/dnsmasq.d
    这样不需要改动 /etc/config/dhcp

  10. tporwx 回复

    我想问一下此方案用ss-tunnel转发UDP的DNS请求,也是走gfwlist的么?还是包括了国内网站?

    1. cokebar 文章作者 回复

      只有gfwlist上的域名,才会在DNS解析时候走ss-tunnel,国内网站走默认DNS(通常是从WAN口获取的ISP的DNS)。

      1. tporwx 回复

        那chinadns和这个相比,有何优劣?

    2. cokebar 文章作者 回复

      ss服务端如果支持UDP就优先使用ss-tunnel;不建议使用方案三。 随后我会更新文章,改成UDP走ss-tunnel和dns-forwarder转TCP两种方案;此方案中ChinaDNS建议抛弃。

发表评论

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

请输入正确的验证码