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及后续版本。

所需软件列表

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

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

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

接下来可以直接使用作者的一键脚本,执行:

此方法手动的步骤

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

如果直连遇到困难(无法连接或者过程中下载总是中断),请继续下面的步骤来安装。实测国内许多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,082 条评论

  1. 头像wangsmile 回复

    我发现重启网件3800路由器之后,手机无线网络连接一直处在:正在获取IP地址。。。再查,发现可能是CHINADNS或是SS服务没启动。但是两个服务的开机自启enable命令之前是执行的啊。OPERWRT面板发现这两个服务都不是启用状态。手工把两个服务启动下,IP可以获取了,不知道是什么原因。

    1. 头像Foxlife 回复

      注意,上面的那个openwrt的SS自启动服务命令,/etc/init.d/shdowsocks enable作者少打了一个字母a,实际应该是shadowsocks 可能是你直接复制粘帖命令导致其实服务根本没有自启动。

      1. cokebarcokebar 文章作者 回复

        感谢指出错误。话说如果这个这么明显居然之前没人给我说

      2. 头像wangsmile 回复

        感谢!

      3. 头像wangsmile 回复

        我发现好像是DNSMASQ没有自动启动,LUCI的面板上是自启的,不过要点运行下,才能获取IP,什么情况啊?

      4. 头像wangsmile 回复

        面板现在这三个服务dnsmasq,chinadns,shadowsocks可以点出自启用了,但是路由器重启就要在面板上点运行才可以。。。

        dnsmasq enable
        chinadns enable
        shadowsocks enable
        我都运行了啊。重启就又不自动运行了。怎么解决????

      5. 头像wangsmile 回复

        enable重启就失效。没办法,我只能在LUCI启动项的本地启动脚本里输入start三项了:
        # Put your custoam commands here that should be executed once
        # the system init finished. By default this file does nothing.

        /etc/init.d/dnsmasq start
        /etc/init.d/chinadns start
        /etc/init.d/shadowsocks start

        exit 0

  2. 头像ifreeswan 回复

    wndr4300,重新刷了固件,安装openssl版本,shadowsocks转发dns,一切ok

  3. 头像feng 回复

    你这套方案是不是又退回你最早的那套方案了呢?没有完整利用上dnsmasq的DNS缓存功能了?

    1. cokebarcokebar 文章作者 回复

      依然是ChinaDNS做的dnsmasq上游DNS,有利用上。最早那篇写的时候没注意直接走ChinaDNS了没过dnsmasq

      1. 头像feng 回复

        ipset是不是需要安装dnsmasq-full?

        1. cokebarcokebar 文章作者

          不用 是dnsmasq-full用到了ipset而不是反过来

      2. 头像feng 回复

        让ignore.list是允许走SS,该怎么实现呢。因为我只有几个被墙的网站需要走SS,其他很多网站不走SS反而更快点。用你这套方案该怎么实现呢?LUCI shadowsocks图形界面里只有忽略IP列表,如果增加个运行IP列表就好了。

        1. cokebarcokebar 文章作者

          单依靠IP判断的包含法没有什么适用性,因为被墙站点IP复杂性很高,很难去维护一个完整列表。此时还是要装dnsmasq-full和ipset,然后在dnsmasq里面添加需要代理的域名,然后将这些域名的解析加到一个ipset里面,然后用一条iptables命令将match这个ipset的IP的通讯转发至ss的端口

        2. 头像feng

          装dnsmasq-full和ipset,可以配合chinadns和shadowsocks用吗?还有个问题,是不是不能用shadowsocks-libev-spec,要下载shadowsocks-libev这个版本呢?
          安装shadowsocks-libev的话,luci-app-shadowsocks还有用吗?
          我试过安装shadowsocks-libev-spec,好像不行,所以上来请教您了,多谢指点!

        3. cokebarcokebar 文章作者

          可以继续用这个spec版本,也可以用原版。只不过不能用它自带的启动脚本。你要做的就是启动ss-redir到后台守护进程(开机启动写到rc.local里面就行了 可以用setsid用法),然后手动添加一个ipset,添加iptables转发规则

        4. 头像feng

          我现在安装dnsmasq-full,添加需要代理的域名。为什么google.com不能通过域名访问,IP直接访问可以。其他域名也没问题(比如youtube),这是何解?

  4. 头像wangsmile 回复

    我在安装opkg install ipset出错,不知道什么原因?

    Downloading http://downloads.openwrt.org/snapshots/trunk/ar71xx/packages/base/ipset_6.20.1-1_ar71xx.ipk.
    Multiple packages (kmod-ipt-core and kmod-ipt-core) providing same name marked HOLD or PREFER. Using latest.
    Collected errors:
    * satisfy_dependencies_for: Cannot satisfy the following dependencies for ipset:
    * kernel (= 3.14.18-1-8325ae478fc877c973d123f5191cb75c) * kernel (= 3.14.18-1-8325ae478fc877c973d123f5191cb75c) *
    * opkg_install_cmd: Cannot install package ipset.

    1. cokebarcokebar 文章作者 回复

      kernel版本对不上 不要用trunk版本的openwrt 重刷bb14.07正式版

      1. 头像wangsmile 回复

        啊,为什么?买的netgear3800时候,里面直接就是刷好的这个版本。 Trunk 版本有什么不好的地方吗?

        我现在强制安装了:opkg install ipset –force-depends 不过不知道ipset是否正常工作。

      2. 头像wangsmile 回复

        内核版本:3.10.49

      3. 头像wangsmile 回复

        OpenWrt Chaos Calmer by 981213 r42753

    2. cokebarcokebar 文章作者 回复

      trunk版本每天都更 包是隔天就不能用了 你今天刷了一个rom 明天他所有都重新编译了一遍 所有对内核版本有明确要求的包全都不能装了 必须再刷最新的rom。你不看前面的错误信息要求内核版本3.14.18你是3.10.49 应该是隔了好多个版本了 还是刷BB正式版

      1. 头像wangsmile 回复

        悲剧了。。。

  5. 头像tipols 回复

    用方案2死活不成功,服务器那边说是支持的,但是开了udp转发,国外的域名就没法解析,怪了。
    用方案3可以,但是不完美啊,访问国外服务器会慢得多。

    1. cokebarcokebar 文章作者 回复

      可以先用手机版试试 如果手机版开了UDP转发导致上不去网那么就是他服务端配置有问题

  6. 头像lantsing 回复

    按照步骤装好后重启ChinaDNS总是“未运行”,如何处理?

    1. cokebarcokebar 文章作者 回复

      Openwrt什么版本的?请使用BB正式版勿使用trunk版

      1. 头像lantsing 回复

        OpenWrt Barrier Breaker 14.07 / LuCI Trunk (0.12+svn-r10530)

  7. 头像lantsing 回复

    ChinaDNS-C 1.1.8-1

    1. cokebarcokebar 文章作者 回复

      检查配置是否填对114.114.114.114,8.8.8.8之间别有空格;手动/etc/init.d/shadowsocks start试试

  8. 头像lantsing 回复

    luci-app-chinadns-c 1.1.1-1

  9. 头像wangsmile 回复

    这几天发现,shadowsocks服务老要重启下才可以。怎么进程老DOWN啊?

  10. 头像wkpars 回复

    感谢!
    请教一个问题,能否让下载软件的流量不经过SS?

    1. cokebarcokebar 文章作者 回复

      这个排除法方案适合服务器速度较快且不经常使用P2P的人。如果服务器速度较慢,全部国外IP走代理,虽然被墙的能看了但会造成其他国外站点降速,而P2P也是一个老大难问题,鬼知道P2P的peer IP会出现哪些IP,只能手动关代理;或者你给下载软件指定固定的高端口,然后iptables将这些端口排除掉。
      要么就改用包含法,gfwlist生成dnsmasq-full的ipset规则,set里面的走ss

      1. 头像wkpars 回复

        谢谢回复!
        我在iptables里面添加了这样两条规则,里面的端口是utorrent的固定端口,不知道这样可行否?
        iptables -t nat -I SHADOWSOCKS 10 -p tcp –dport 15689 -j RETURN
        iptables -t nat -I SHADOWSOCKS 11 -p udp –dport 15689 -j RETURN

        1. 头像aa65535

          不可行,utorrent 里的端口只是跟 Tracker 交换数据才使用,跟其他用户连接是随机端口。
          或者使用专门的设备来下载,然后使用访问控制功能。

        2. 头像wkpars

          谢谢aa65535的回复!
          这样的话就不纠结了~

发表评论

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

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