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. 头像dalton 回复

    首先谢谢您的工作,真是造福千家万户:)
    有一个疑问:使用gfwlist是为了优化效率,减轻路由器负担吗?如果是,脚本中base-url改用tinylist是否效果更好?但tinylist似乎两三年没有维护了,也许是没什么可增减改动的,那么,现在使用tinylist是否适宜?

    1. cokebarcokebar 文章作者 回复

      我没试过tinylist,你可以尝试一下,应该没啥问题,最近gfwlist更新的站点大多数是一些不大的乱七八糟的站点,对tinylist没啥影响。本来我的脚本准备更新一下加个参数,让人能手工指定base-url的,但是因为懒,所以一直没弄

      1. 头像dalton 回复

        试了一下,不大方便,比如google play 店下载就有问题,放弃了。现在用gfwlist,在挂着samba的情况下,路由器CPU占用不到3%,内存最多时10%多一点,这个方案还是效率很高的。

  2. 头像wang 回复

    感谢大神分享此方案,有个问题,dnsmasq重启提示udhcpc: started, v1.25.1
    udhcpc: sending discover
    udhcpc: no lease, failing,是什么错误。另外接在此路由器下的nas解析本机公网ip为ss的ip,而不是电信公网ip。

    1. cokebarcokebar 文章作者 回复

      dnsmasq重启的udhcpc的信息是ipv6相关的东西,不配置ipv6环境的话不用理会,而且当前版本的luci-app-shadowsocks并不支持ipv6,也建议不要开启ipv6
      如果你是想让NAS上的DDNS工作,建议要么让NAS不走ss,要么想办法搞清楚NAS是从通过访问哪个URL获取IP地址的,然后将这个域名添加到custom bypass规则里

    2. 头像dalton 回复

      这是正常的,设计如此。要是不failing倒有问题了。dnsmasq启动时先向自身发出一个dhcp请求,目的是检测网段里有没有别的(冒牌)dhcp服务。
      如果dmesg输出有许多udhcpc报警,可以关闭ipv6,比如把这两行加到/etc/sysctl.conf里:
      net.ipv6.conf.all.disable_ipv6=1
      net.ipv6.conf.default.disable_ipv6=1
      我是这么做的。供参考。

      1. 头像wang 回复

        好的,谢谢朋友。

  3. 头像wang 回复

    谢谢博主及时回复,上述问题已清楚明白了。文章里没有提到要修改/etc/dnsmasq.conf 添加 conf-dir=/etc/dnsmasq.d 还是无需这一条?

    1. cokebarcokebar 文章作者 回复

      现在已经支持通过uci配置这条规则了,文中使用了如下命令:
      uci add_list dhcp.@dnsmasq[0].confdir=/etc/dnsmasq.d
      其实就是修改了/etc/config/dhcp,在这个文件的dnsmasq的section下加了confdir这个option,值为/etc/dnsmasq.d,起相同效果。虽然直接修改/etc/dnsmasq.conf也可以,但原则是能用uci的就用uci。

      1. 头像dalton 回复

        我按您说的用UCI加了一下,重启dnsmasq,然后uci show dnsmasq,找不到confdir这条呀?

        1. cokebarcokebar 文章作者

          uci show dhcp, 有这一条
          list confdir ‘/etc/dnsmasq.d’

  4. 头像wang 回复

    谢谢博主解疑。

    1. cokebarcokebar 文章作者 回复

      回破坏掉走代理时候的DNS解析优化,因此不会考虑这种方案

  5. 头像lele 回复

    谢谢,我发现在如果不设置DNS什么的,只打开SS,连着wifi的设备可以访问youtube,但是不能放视频,显示是googlevideo.com加载失败,也不能使用google。我尝试把内网外网都调成全局代理,也没有解决这个问题。可能是因为设置的路由器wan口接的是另一个路由器lan口,所以不需要设置DNS?可是为什么打不开google呢?

  6. 头像pexcn 回复

    你好作者,关于 MTU 设置我有个疑问,我的 OpenWRT PPPoE 拨号 ifconfig 显示 wan 口的 MTU 是 1492, VPS 上面的接口的 MTU 是 1500.
    所以我在服务端的 ss-server 的 –mtu 参数指定为 1500, 本地 ss-redir 的 –mtu 参数设置为 wan 口的 1492, 测试 UDP, 看了 OpenWRT 的 log, 出现大量的:[udp] remote_recv_recvfrom fragmentation, MTU at least be: 1500, 随后我把 OpenWRT ss-redir 的 –mtu 参数改成 1500, 以上的 log 就没有了,看似正常了。我还测试了把 ss-server 的 –mtu 改成 1492, 同样的服务端的日志也出现了大量的 [udp] remote_recv_recvfrom fragmentation, MTU at least be: 1500, 改成 1500 后正常。这是不是说明要把 MTU 设置成 VPS 接口的 MTU 一致才能正常运行?

    1. cokebarcokebar 文章作者 回复

      都改成1492试试。udp relay下无法检测mtu值(因为中间套了一个tproxy)所以最好两边设置成一样的。由于国内大部分都是pppoe,所以推荐都设置成1492,设成1500会导致出了wan口就被拆分

    2. cokebarcokebar 文章作者 回复

      对了,由于wifi/lan链接的mtu是1500,所以如果有udp relay的需求,那么连入路由设备最好也手工设置一下mtu为1492,比如ps4

  7. 头像123 回复

    你一天不解决DNS污染,你就一天也别想看YouTube开Google。

  8. 头像pexcn 回复

    这几天都测试了 1500 和 1492, 似乎没有什么影响,暂时先用着 1500 了,出了问题再改成 1492 试试…

  9. 头像XW 回复

    WAN口为什么不能静态?pppoe不是一定要WAN口拨的。

    1. cokebarcokebar 文章作者 回复

      那你就是上级路由或者光猫拨号了?那你设不设静态和能不能上网有啥关系,动态不也能上

发表评论

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

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