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/LEDE的一系列变化,以及作者aa65535的一系列更改,本文需要更新,下面的步骤仅供参考!本人应该会在近期休假期间更新本文。不排除鸽的可能:)

一、安装

方法一: 添加作者的软件源,直接利用opkg命令安装 (此方式快捷方便,推荐!)

软件源位置:http://openwrt-dist.sourceforge.net/packages/

前提是所用网络环境直连sourceforge.net和downloads.lede-project.org没有问题。此处仅提供LEDE 17.X 的步骤。

首先添加 a65535 的 gpg key,只有这样,第三方的包才能通过签名验证。执行:

打开Luci,定位到“系统”-“软件包”-“配置”选项卡,在“自定义feeds”末尾加入两行并点击“提交”:

请根据自己的CPU架构(可以执行 opkg print-architecture 查看,或者参考“发行版软件源”里的URL里的文本),将mipsel_24kc替换成相应的文本,最后点击提交。

然后执行命令 opkg update 更新软件列表,然后执行下列命令安装依赖包以及shadowsocks相关的软件:


方法二: 手动下载软件包,上传至路由器后安装

依赖列表

右边注释为该包在官方软件源目录下划分到了哪一类 方便查找

LEDE 安装步骤

写在前面:由于LEDE官方软件源包含最新版本shadowsocks-libev软件包,但是官方包和本文使用的aa65535的包不同,并且不兼容,因此请一定要手动下载安装aa65535的软件包,避免装成LEDE官方软件源中的包。

首次安装的话,先确保路由器联网,并更新软件包列表:

注:部分ISP访问LEDE官方站点可能会非常缓慢甚至下载失败,此时需要自行在PC上下载上面的依赖包以后自行上传至路由器目录手动安装。

首先,需要手动安装部分依赖包(并不是所有的依赖包,部分依赖包会自动从软件仓库安装)

接下来下载软件,注意需要根据自己的CPU型号来进行选择。

下载地址: http://openwrt-dist.sourceforge.net/packages/base/

需要下载的文件:

将下载的包通过WinSCP之类的工具上传至路由器的/tmp目录。

然后卸载dnsmasq并安装dnsmasq-full以及剩下的包:

注意不要装成LEDE官方源里的shadowsocks-libev包!

二、配置shadowsocks

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

1. 步骤一,有三个方案:

方案一 (由于不加密 所以有风险 不推荐):

在代理服务器上搭建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 即可。

最后重启路由器即可。

方案二 (如果此方案较稳定那么推荐这个方案 不过不少ISP会出现UDP方式不稳定的情况,如果遇到请用方案三):

使用ss-tunnel转发UDP的DNS请求,修改 /etc/init.d/shadowsocks 文件,如需修改上游DNS,请修改 DNS=8.8.8.8:53 字段,本地端口修改 TUNNEL_PORT=5353 :

最后重启路由器即可。

方案三:使用dns-forwarder将DNS转成TCP后走ss代理解析:

dns-forwarder的安装可参考:《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网》一文中的安装部分,到文中提到的地址,下载安装dnsforwarder_x.x.xx_xxxx.ipk,luciappdnsforwarder_x.x.xx_all.ipk即可。

配置也很简单,luci界面,“服务”→”DNS 转发”(英文界面是DNS Forwarder),如图配置:

最后需要在自定义防火墙规则里再增加一句,来确保8.8.8.8是走代理的:

其他TCP查询方式可以参考:

TCP 方式查询解决 DNS 污染问题


2. 步骤二

在WAN口配置中如图所示,将DNS手动指定为127.0.0.1:

ss222

最后在DHCP/DNS设置中将你的ISP的DNS填入(或者使用114DNS等公共DNS)

dnsmasq_localdns

 

最后你可能需要重启一下路由器,以及清空一下你的PC/PED设备的DNS缓存。


PS1:发现有不少人之前用过chnroute方案,然后改成gfwlist方案,此时记得把忽略解析文件的勾选去掉并把原来的设置填回去:

problem1

 

四、其他

一些强烈推荐的额外设置项(涉及到更新、维护)可以参考:《Shadowsocks for OpenWRT / LEDE 拾遗》

需要自己搭建服务器的,可以参考:shadowsocks – libev 服务端的部署

推荐的VPS商家见:https://cokebar.info/about

本博客有关 shadowsocks 文章合集目录

五、写在最后

本人作为一名普通使用者,水平有限,且文章也缺乏校审,肯定有错误存在,也有很多能改进的地方,如有意见或建议,请留言指出,万分感谢! 如果使用时遇到问题也欢迎留言,本人如果有空都会回复,不过请一定要将出错信息贴出来,有些错误信息需要到系统日志中查看。

 


参考文章:https//kyonli.com/p/18

617 条评论

  1. WarIsNotOver 回复

    请问gfwlist如何能保持更新呢?在chrome的SwitcyOmega插件里可以设置自动更新,更新源为:https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt

    1. WarIsNotOver 回复

      是不是到这里https://github.com/cokebar/gfwlist2dnsmasq,用你的Shell script转换出来就是最新的?或者直接下载你已经转好的。

      1. cokebar 文章作者 回复

        我的脚本转出来的就是最新的,我转好的那个每周更新一次

  2. 龙卷风 回复

    ipv6 环境下 iptable应该如何配置?

  3. Dingles 回复

    请问飞羽,最新版的dnsmasq2.8是不是已经包含了dnsmasq-full对ipset的支持了,我看官网的manpage里面有–ipset的选项,就是不知道openwrt里面的dnsmasq和dnsmasq-full是不是一样的

    1. cokebar 文章作者 回复

      dnsmasq是开源软件,openwrt只是用了它而已,dnsmasq编译时候有很多可调选项,ipset的支持就是可调的,支持ipset是可以的,编译时配置好相应的选项即可,不过编译后体积会更大一点,而且有需要额外引入ipset等依赖包,增加了对存储空间的需求;由于dnsmasq对ipset的支持功能本就用的人不多,而且openwrt面向路由器,固件不宜体积过大,因此官方编译时候分了dnsmasq, dnsmasq-full等多个版本,dnsmasq-full是全功能版本,依赖最多占用空间最大,rom里默认带的是dnsmasq,不支持ipset,体积较小

      1. Dingles 回复

        非常感谢

  4. 引用: 尝试使用Openwrt固件,发现几个问题 | ym满血复活

  5. googn 回复

    从博主的博客学到很多
    非常感谢博主。
    关于dns,建议增加方案四,个人已经使用很久
    安装dnscrypt-proxy即可,默认就是本地5353端口进行dns解析。
    其余配置,按照博主的内容就行。

    1. cokebar 文章作者 回复

      为了优化走代理时候的DNS解析,需要让代理服务器转发DNS请求,因此如果用dnscrypt,则需要在代理服务器上安装服务端程序,这对于大部分人是无法实现的

  6. dalton 回复

    方案3一点不过时,很好用,谢谢。
    一个小问题:手动添加条目,有什么快捷一些的办法呢?比如telegram的IP,很多条。我想维护自己的一个列表文件,里边只有单纯的IP,有没有现成的脚本把它变成dnsmasq可用的.conf?

    1. dalton 回复

      收回。这个问题太蠢了。

  7. dalton 回复

    综合了一下实现过程的shell命令,看会不会对大家有用:
    1,安装部分。为省事,wget用了不安全方式,不足为训。
    wget -qO /tmp/openwrt-dist.pub http://openwrt-dist.sourceforge.net/openwrt-dist.pub
    opkg-key add /tmp/openwrt-dist.pub
    ARCH=$(opkg print-architecture | awk ‘END{print $2}’)
    echo “src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/base/$ARCH” >>/etc/opkg/customfeeds.conf
    echo “src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/luci” >>/etc/opkg/customfeeds.conf
    opkg update
    opkg install ip-full ipset iptables-mod-tproxy libpthread libustream-openssl coreutils-base64
    opkg install shadowsocks-libev luci-app-shadowsocks dns-forwarder luci-app-dns-forwarder
    二,配置SS服务器,还是在luci中操作较方便。然后:
    uci set dns-forwarder.@dns-forwarder[0].enable=’1′
    uci set dns-forwarder.@dns-forwarder[0].listen_port=’5353′
    uci commit dns-forwarder
    uci set shadowsocks.@access_control[0].wan_bp_list=’/dev/null’
    uci set shadowsocks.@access_control[0].wan_fw_ips=’8.8.8.8′
    uci add_list shadowsocks.@access_control[0].wan_bp_ips=’0.0.0.0/1′
    uci add_list shadowsocks.@access_control[0].wan_bp_ips=’128.0.0.0/1′
    uci add_list shadowsocks.@access_control[0].lan_target=’SS_SPEC_WAN_AC’
    uci commit shadwosocks
    /etc/init.d/shadowsocks restart
    三,dnsmasq部分
    cd
    wget –no-check-certificate https://github.com/cokebar/gfwlist2dnsmasq/raw/master/gfwlist2dnsmasq.sh
    mkdir /etc/dnsmasq.d
    sh gfwlist2dnsmasq.sh -i -d 127.0.0.1 -p 5353 -s ss_spec_dst_fw -o /etc/dnsmasq.d/dnsmasq_gfwlist.conf
    echo -e ‘conf-dir=/etc/dnsmasq.d\ncache-size=10000\nmin-cache-ttl=1800’>>/etc/dnsmasq.conf
    /etc/init.d/dnsmasq restart

    别的没了。

  8. qwerty 回复

    用OPEN DNS + 443端口效果会比8888和8844更好,对SS转发友好,效率更高。
    方法很简单,把ChinaDNS的8.8.8.8或8.8.4.4替换成208.67.222.222#443,并且把208.67.222.222加入到强制代理IP列表内。

  9. Samuel 回复

    Hi friends from China!

    Some time ago I posted here because I was having trouble opening Telegram on my network even though I had implemented this solution. I have found a solution but forgot to post here, well I’m finally doing and hope it can help anyone facing the same or similar problem. Basically what I did was find out the IP ranges (CDIRS) associated with Telegram and I added these IP ranges to my custom firewall rules to force them through the VPN regardless of what domain names it uses. Here are the lines you need to add to your custom firewall rules on your Openwrt:

    # Telegram IP’s:
    ipset add gfwlist 149.154.164.0/22
    ipset add gfwlist 149.154.168.0/22
    ipset add gfwlist 149.154.172.0/22
    ipset add gfwlist 91.108.4.0/22
    ipset add gfwlist 91.108.8.0/22
    ipset add gfwlist 91.108.12.0/22
    ipset add gfwlist 91.108.16.0/22
    ipset add gfwlist 91.108.56.0/22

    If you’re facing a blocked APP despite using the Openwrt + Gfwlist solution, you might wanna try doing something similar and add the IP’s like I did above for Telegram. I can confirm that my solution is working 100% as of today May 7 2019.

  10. Samuel 回复

    Hey there,

    The solution presented on this page has helped me a lot and I rely on it everyday to browse the web freely despite living in China. But one thing that it doesn’t do is to unblock software or APP’s that connect directly to IP’s rather than domain names.

    This is the case for TOR service, which is basically a way to browse the web anonymously. So here’s a way to get TOR working with your Openwrt + Gfwlist + Shadowsocks setup:

    1. SSH as root into your Openwrt: ssh root@192.168.1.1
    2. Create a directory to store the TOR IP list: mkdir /etc/iplist
    3. Download the full and up-to-date list of TOR nodes from https://www.dan.me.uk/torlist/ and save in into /etc/ipilst/tor. This command will do just that: curl -o /root/tor https://www.dan.me.uk/torlist/
    4. Add these lines to your custom firewall rules (Luci > Network > Firewall > Custom Rules):

    #############
    # TOR List #
    #############
    ipset -N torlist iphash
    iptables -t nat -A OUTPUT -p tcp -m set –match-set torlist dst -j REDIRECT –to-port 1080
    iptables -t nat -A PREROUTING -p tcp -m set –match-set torlist dst -j REDIRECT –to-port 1080
    cat /etc/iplist/tor | xargs -n1 ipset add torlist
    #############
    # End of TOR List #
    #############

    5. Still on the custom firewall rules page, click Restart Firewall.
    6. Now you can browse the web anonymously with TOR. In case you still don’t have TOR installed on your PC, head to https://torproject.org and download it.

    Cokebar’s site has helped me a lot, so above are my 2 cents. Hope it helps someone with the same needs and maybe Cokebar could add it to a future post.

发表回复

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

请输入验证码 *