Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网

本站发布的三种使用 shadowsocks 在 OpenWrt / LEDE 上的自动科学上网方案:

1、Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网
2、Shadowsocks + Redsocks 实现 OpenWRT 路由器自动科学上网 (停止更新)
3、Shadowsocks + GfwList 实现 OpenWRT / LEDE 路由器自动科学上网

这篇文章介绍的方法基于aa65535的luci-app-shadowsocks/openwrt-shadowsocks,介绍了如何在OpenWRT / LEDE下配置自动科学上网,新版本支持在Luci下图形化配置,大大简化了配置过程。配置完成后,路由器本身获得自动科学上网能力,所有连入该路由的设备都可无障碍访问被墙的站点。是运行于路由器的透明代理。

方案简介
本文changelog

注:本文不再提供OpenWrt 15.05及以下版本的说明;仅支持LEDE 17.01, OpenWrt 18.06及后续版本

一、安装

适用于 openwrt-shadowsocks 3.0.1及以上版本,搭配 luci-app-shadowsocks 1.6.0及后续版本。

使用OpenWrt 19.07及后续版本的用户可能要安装 luci-compat 才可以正常使用 luci-app-shadowsocks 

所需软件列表

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

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

前提是所用网络环境直连sourceforge.net和downloads.openwrt.org没有问题。

参照 http://openwrt-dist.sourceforge.net/ 里的说明:

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

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

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

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


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

如果直连遇到困难(无法连接或者过程中下载总是中断),请继续下面的步骤来安装。实测国内许多ISP,执行 opkg update 和 opkg install 下载安装的时候都可能会遇到卡住、中断的情况,请多试几次。如果尝试多次仍然失败,请参考下面的依赖列表,手动至官方下载站点手工下载。

详细步骤点击展开
二、shadowsocks 配置

登录Luci,指向“服务”,此时应该能够看到shadowsocks(中文界面下显示“影梭”)了。接下来进行shadowsocks的配置。

I. 添加服务器
II. 设置代理方案
III. 开启代理服务
IV. 额外的优化
三、DNS配置

到此虽然shadowsocks配置完成,不过还没有进行DNS部分的配置,只有完成了DNS的配置才能解决DNS污染并优化DNS解析,接下来的部分来对DNS的配置进行说明。

PS:DNS的调试可以使用dig

I. DNS转发链图示
II. DNS转发链的基本配置
III. DNS转发链的优化配置
四、按域名指定是否走代理(可选)

这一部分的配置用于替代 “三.III.2. 添加gfwlist和China-List配置文件”中的步骤。请在完成“三.III.2. 添加gfwlist和China-List配置文件”前面的配置后进行这一部分的配置。

下面的步骤会使用我编写的脚本来自动生成配置文件,脚本放在github维护,可能随时更新,可到gfwlist2dnsmasq, openwrt-scripts查看最近更新的动态。

先使用dnsmasq-full替换掉原有的dnsmasq,由于先卸载dnsmasq后很可能会导致后面下载dnsmasq-full包的时候无法域名解析,从而导致下载失败,因此这里使用一个取巧的办法,先尝试安装dnsmasq-full:

然后会收到错误信息(原因是文件冲突),dnsmasq-full也不会成功安装;但是不用管,因为此时dnsmasq-full的依赖包应该已经装好了。接下来到openwrt官网下载dnsmasq-full的包,举例:https://downloads.openwrt.org/releases/packages-18.06/arm_cortex-a9_vfpv3/base/dnsmasq-full_2.80-1_arm_cortex-a9_vfpv3.ipk

然后将ipk包上传到路由器/tmp目录,并执行如下命令:

I. China-List强制直连 自定义域名强制直连
II. GFWList强制走代理 自定义域名强制走代理
四、其他

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

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

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

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

五、写在最后

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

2,158 条评论

  1. 头像webguest 回复

    这样啊,为啥官方不把作者的直接添加到源呢?fork之后再修改岂不是很麻烦。
    我看官方的和本文的操作逻辑和风格很不一样,官方源的可以同时运行多个shadowsocks组件

  2. 头像deconf 回复

    作者你好,我在使用GFWList强制走代理 自定义域名强制走代理时,
    遇到问题,按照如下所写并不会强制代理,无法打开网站
    ···
    server=/example.com/127.0.0.1#5311
    ipset=/example.com/ss_spec_dst_fw
    ···
    当然我 已经重启 · /etc/init.d/dnsmasq restart ·
    但是使用chrome的插件switchyomega直接使用路由器socks5端口可以代理并打开网站,
    求解决思路,或方法

  3. 头像kentooo venitex 回复

    cokebar~~
    hello,
    最近有一个新的工具,叫做clash,好像可以代替掉dnsmasq和dnsforward,依靠规则去架梯子,请问有想法推出一篇使用教程么?

    1. cokebarcokebar 文章作者 回复

      1. 缺乏文档
      2. 似乎相对shadowsocks等软件仅仅是增加一些功能性,对那种卖机场的人友好些
      3. 路由器上只能用golang版的,那个bin文件的体积相信一多半的路由器空间不够
      4. 无openwrt客户端

  4. 头像kentooo venitex 回复

    1.现在文档的确不是很多,但是有其他平台的教程可以借鉴
    2.clash主要其实是使用一个客户端去处理ss/vmess协议以及dnsmasq的分流,自由度会更高,但是可能对路由器的性能要求更高
    3.openwrt的客户端倒是有,只是可能没办法覆盖到全部的指令集平台

    1. cokebarcokebar 文章作者 回复

      1. 教程通常不够用,因为大都不全面、不深入,只能做到依葫芦画瓢,比如本文
      2. clash是否实现本文中的这种DNS方案?
      3. 这个我看到了,不过实在是不想用路由器跑golang,除非哪天上了软路由(可能是未来买了wifi6路由器的时候会上软路由吧,用我的NAS上跑个openwrt虚拟机来试先)
      4. 最主要的原因:现在我更倾向于寻找一个像trojan这种的软件,因为目前的GFW形势变化,伪装成正常WEB服务器流量才是更加可靠的方法。

  5. 头像小白 回复

    老大,感谢这么多年你的辛苦工作,这个文档的更新让我从小白到目前的大白,但是老大目前时代似乎已经变了,shadowsocks目前防火墙有针对方法,虽然有v2ray和cloak插件的支持,但是他们都是基于go的对于一大批老旧和构架复制的路由器显然不合适,但是老大目前trojan是一个可见的不错选择,方便的交叉编译,大小合适,并且目前相对来说比较的安全性,所以老大出一篇《trojan + ChnRoute 实现 OpenWRT 路由器自动科学上网》的文章岂不是正好。。。

    1. cokebarcokebar 文章作者 回复

      感谢你的建议,trojan本质上就是将加密流量伪装成TLS流量,gost/v2ray等好几种软件已经早已支持此模式了,不过trojan是C++写的,这是它的优势,非常适合路由器;而且甚至有shadowsocks的SIP003插件版本,可以说是挺不错的方案了。笔者没有写trojan的东西的原因还是没有实际去使用,主要原因有如下几点:
      1. 精力所限,主要原因;学生时代一去不返,本博客的openwrt上的ss的文章多数文本都是多年前学生时代所写,现在顶多修修改改;研究一款新软件,真的是“懒得折腾了”。不过最近自己的服务器也出现部分被封IP的情况,trojan应该会在未来某个时间试一试吧。但是写一篇和这篇博文一样详尽的文章可能很难了。
      2. luci-app的问题,我自己实在是没能力写,其他人写的大部分用起来都有很多别扭的地方..特别是他们都将DNS的配置整合到luci-app里导致DNS方案除非改代码,否则基本没有可自定义性。我一直使用aa65535的版本的原因,一是他是正儿八经的“官方版本”,收录在github.com/shadowsocks/luci-app-shadowsocks中,二是功能齐全的同时不碰任何DNS设置。其他版本虽然很多都加了各种各样的增强功能,但不碰DNS的真的很少,整合DNS功能不是不行,但是多数无法满足我的要求所以我根本没法使用。估计解决方法基本只有我自己写一个了,但是我实在是不会啊,主要是lua不会,怎么编luci-app不会。。都得学。。实在没精力啊。。

      1. 头像小白 回复

        谢谢老大的回复,我觉得自己还是太菜了,其实我想目前不需要luci也是可以完成配置的,不过需要看tr的开发文档 需要时间和精力去折腾,trojan的SIP003插件目前没有什么说明和文档对于我这样的大白真的是巨坑。大大我想在你的blog下面留言把我编译的一些东西留下了,可能有些是来源于网络出处可能有问题。但是一定是我执行成功了的,希望以后的未来可以把一切集中起来。

        1. 头像小白

          编译相关IPK
          2.开启ssh,更新,安装所需环境:
          (Ubuntu 18.04 LTS)
          apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext libssl-dev xsltproc wget unzip python time libcloog-isl-dev
          3.下载sdk:(cd home)以openwrt-sdk-19.07.2-apm821xx为例子:
          wget https://downloads.openwrt.org/releases/19.07.2/targets/apm821xx/nand/openwrt-sdk-19.07.2-apm821xx-nand_gcc-7.5.0_musl.Linux-x86_64.tar.xz
          4.解压sdk:
          xz -d openwrt-sdk-19.07.2-apm821xx-nand_gcc-7.5.0_musl.Linux-x86_64.tar.xz
          tar vxf openwrt-sdk-19.07.2-apm821xx-nand_gcc-7.5.0_musl.Linux-x86_64.tar
          5.进入openwrt-sdk/package目录:
          cd openwrt-sdk-19.07.2-apm821xx-nand_gcc-7.5.0_musl.Linux-x86_64/package
          6.下载github上的openwrt-trojan
          git clone https://github.com/trojan-gfw/openwrt-trojan.git
          7.移动一下文件(将openwrt-trojan内的文件移动到外面的文件夹目录)
          mv openwrt-trojan/* ./
          8.回到openwrt-sdk目录
          cd ..
          9.在openwrt-sdk目录安装feeds
          ./scripts/feeds update -a
          ./scripts/feeds install -a
          10.进入make menuconfig
          make menuconfig
          11.进入全局设置点掉前面三个的[*],如下面所示,然后保存,退出
          [ ] Select all target specific packages by default
          [ ] Select all kernel module packages by default
          [ ] Select all userspace packages by default
          [*] Cryptographically sign package lists (NEW)
          进入network———下拉找到[ ]trojan,然后选择[*] 退出保存
          12.编译固件ipk
          make package/trojan/compile V=99
          13.等待编译完成去bin文件夹找ipk.

      2. 头像cszhy 回复

        大神能否发个在openwrt固件里安装trojan的教程

      3. 头像Ryan 回复

        15年以后一直在用你这套方案,一直感觉是家庭使用最优场景,非常感谢。
        18年以后开始shadowsocks流量稍大就会频频被封,于是自己调整了使用场景,局域网全部直通,路由器正常ss袋里,chinadns和dns-forwarder继续提供dns。局域网里PC、手机、电视等需要袋里时单独开启各自的v2ray客户端。
        19年即使这样轻量的使用shadowsocks还是有被封的几率,于是完全放弃。
        2个思路:
        A、路由器放弃使用袋里,只设置chinadns+stubby(替代dns-forwarder)解决dns污染,需要袋里时开启各自的v2ray客户端,个人测试还不错,方案优点是路由器可以使用非常廉价的:测试过WNDR3700V4,NewifiD1,NEWifiD2都没问题。
        B、使用现成的开源方案自己编译,如Lean的lede或Lienol的openwrt(都是github项目),优点是直接在路由器里使用trojan或v2ray,缺点就是都接管了DNS(可以手动禁止,换回chinadns+stubby)。另外就是需要足够算力,A方案提到的3个路由器在这里trojan单线程大概也就是2MB/s,v2ray则只有1MB/s不到的样子,而且动不动CPU就是100%占用。需要个R7800或WRT32X之类的硬路由或者X64软路由。

        1. 头像Jacob Yin

          我已经完全放弃了,直接在端上(PC或者Android)跑ss/trojan/v2ray,youtube可以提升到60Mbps,看4k没问题了。之前路由器上跑ss,最多只能看1080p,而且也不够灵活。

    2. cokebarcokebar 文章作者 回复

      如果像更平滑的过渡到trojan的话可以试试他的SIP003插件,用本文里的luci-app-shdowsocks就行,可以试试,不知道有没有bug。simple-obfs和v2ray-plugin这俩SIP003插件我都在路由上跑过,前者一点问题都没,后者切换配置文件时候的启动有点毛病其他正常。

      1. 头像小白 回复

        飞羽大大,看一下这个教程怎么样:https://github.com/SeonMe/openwrt-trojan
        他应该也是基于你的教程出来的,有空写一点怎么样。感谢感谢。

        1. cokebarcokebar 文章作者

          太麻烦了,纯手工配置。如果用手动方法都不用他那么麻烦,直接用luci-app-shadowsocks里面带的ss-rules文件就可以了,这个是专门配iptables规则用的,luci-app-shadowsocks里能配的各种透明代理方式都是依靠这个ss-rules实现的。
          个人认为比较舒服的一种方案是:
          1. 改造现有的luci-app-shadowsocks,砍去其控制shadowsocks的功能,让它单纯处理iptables,这样可以让这个东西拥有通用性,无论是ss-redir还是trojan的nat模式还是说v2ray/gost还是其他软件,只要它有透明代理模式就能支持,所做的就是配置iptables规则把流量转发到正确的端口就行了
          2. 最好再引入DNS控制,加强dnsmasq的功能,利用uci,控制dnsmasq,分流DNS解析
          3. 至于trojan,最好能将配置文件uci化,方便后续搞luci-app,这里仅仅启动trojan服务用,不配置任何DNS、iptables相关的东西

  6. 头像大白 回复

    写得非常好,特别是那个DNS分流的图。现在配好后,网络非常稳定。
    感觉现在gfw有反向检测机制,如果你有VPS到国内的流量,容易被检测出来,然后断连一段时间。
    上面那个脚本auto_install.sh好像有点问题,执行的时候,连续弹出三个Y/N,但选了Y,只装最后一个shadowVPN,chinaDNS, dnsForwarder还需要手动装。上面教程也说的是shadowsocks-libev 而不是shadowVPN。

  7. 头像magicwolf 回复

    博主,什么时候可以支持IPV6呢?

    1. cokebarcokebar 文章作者 回复

      ipv6就是个坑。。至少到现在为止依然是个坑,光是访问国内Ipv6网络都是个半残,国际ipv6出口带宽也是个坑
      为什么ipv6喊了十几年还没普及是有原因的,4到v6没有平滑过渡可言,过渡阶段只能用v4/v6双栈网络,然而双栈就是个坑。。大坑。。目前各种设备都是双栈时候Ipv6优先,然而很多情况是,同时支持ipv4/v6的网络服务中很大比例v6要比v4线路质量差很多,这就会导致你开了双栈,网速变慢。。如果是出墙这种情况就更多了。。。

    2. cokebarcokebar 文章作者 回复

      对了补充说明一下 国内的情况 三大运营商那里的骨干网的ipv6已经准备的差不多了,但是这是远远不够的,知道各个网络服务提供方的服务器都全面接入ipv6才行;而国际出口方面只能等待其继续扩容了,去年有消息说是2019年年中总共100Gbps,这么点根本不够用;而且还要以来国外的服务商也普及ipv6。这还是需要一些时间的,建议继续观望吧。PS 支持ipv6的ss-rules是有的,我看到过,不过和aa65535的版本差别不小。估计用aa65535的版本基础上加以修改添加ip6tables的支持的版本是有的,不过我暂时不清楚哪里有。其实改写起来不复杂,无非是iptables变成ip6tables,ip地址格式换成ipv6的,对于熟练的人估计很快就能写出来了吧,不过我不行,我不是程序员,写起来比较费劲。

  8. 头像AecaC5ai 回复

    在虚拟机里,手动下载软件包安装,luci界面进不去,提示“ module ‘luci.cbi’ not found ”。搜索后安装软件包luci-compat后解决。
    看了看以前在路由器里安装的,不需要luci-compat也能用。
    luci-app-shadowsocks的版本是一样的,为什么呢?

    1. 头像小白 回复

      你要看一下openwrt版本,是同一个版本吗!

    2. cokebarcokebar 文章作者 回复

      OpenWrt 19.07对luci进行了较大的修改

    3. cokebarcokebar 文章作者 回复

      luci-compat是openwrt 19.07里的新包,就是为了解决某些旧luci-app不兼容新版luci的问题的。

  9. 头像SDcat 回复

    help 不知道为啥 弄完以后像apple.com这类两份list里没有的域名都打不开

    1. 头像SDcat 回复

      自己搞定了

  10. 头像gxlzlu 回复

    感谢分享,碰到2个问题,还望能帮助一下:
    1、执行自动安装脚本出错:
    root@OpenWrt:/tmp# wget -qO- http://openwrt-dist.sourceforge.net/auto_install.sh
    | sh
    ….
    sh: syntax error: unexpected end of file (expecting “then”)
    root@OpenWrt:/tmp#

    2、用方法二手动安装完之后,进入图形界面,选择shadowsocks时出错:
    Failed to execute cbi dispatcher target for entry ‘/admin/services/shadowsocks/general’.
    The called action terminated with an exception:
    /usr/lib/lua/luci/dispatcher.lua:938: module ‘luci.cbi’ not found:
    no field package.preload[‘luci.cbi’]
    no file ‘./luci/cbi.lua’
    no file ‘/usr/share/lua/luci/cbi.lua’
    no file ‘/usr/share/lua/luci/cbi/init.lua’
    no file ‘/usr/lib/lua/luci/cbi.lua’
    no file ‘/usr/lib/lua/luci/cbi/init.lua’
    no file ‘./luci/cbi.so’
    no file ‘/usr/lib/lua/luci/cbi.so’
    no file ‘/usr/lib/lua/loadall.so’
    no file ‘./luci.so’
    no file ‘/usr/lib/lua/luci.so’
    no file ‘/usr/lib/lua/loadall.so’
    stack traceback:
    [C]: in function ‘require’
    /usr/lib/lua/luci/dispatcher.lua:938: in function

    环境是:NETGEAR R7800, Openwrt 19.07.2
    万分感谢!

发表评论

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

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