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.lede-project.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:

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

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

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

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

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

五、写在最后

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

1,920 条评论

  1. 小小白 回复

    hi羽大!http://openwrt-dist.sourceforge.net已经被墙了还是!作者自己下架了吗!现在这边完全代理还是连接不上!

    1. 小小白 回复

      已可以了。有点当心啊

    2. cokebar 文章作者 回复

      sourceforge.net经常抽风的,跟墙没关系

  2. 小小白 回复

    hi羽大。打扰了有木有兴趣看一下GoQuiet,GoQuiet是一个shadowsocks的混淆插件,基本原理为模拟TLS的流量同时将服务器伪装成一个正常的网站服务器。听说对simple-obfs进行了比较大的改善。

    1. cokebar 文章作者 回复

      感谢推荐,这个值得尝试,对于单端口ss很实用,伪装到443端口即可,可用来对抗深度包检测。不过还是稍有遗憾,对于多用户多端口环境,没法伪装到单一的443端口了;golang的实现对于某些小ROM路由器也不是特别友好。

  3. 开心就好 回复

    羽大,麻烦问一下,gfwlist如何定期更新,是不是按照文章中关于gfwlist的配置,做一个计划任务就可以了?

  4. 小小白 回复

    羽大我这边也有一个小小的请求,要不写一个更新GFWList和China-List的自动更新的sh,然后这边号设置成为自动更新。

  5. Amao_Three 回复

    Hi, 羽大:
    非常棒的教程,谢谢。但是我还是在校大学生,上网环境还是校园网。经过你的设置后,会出现下面两个问题,希望能帮忙解决一下,先谢过。
    1. 所有校园内网(比如网管登陆页,教务系统等)均无法打开,因为需要校园DNS去解析。
    2. ipv6就直接废了,不能用。
    我还是个小白,能指点一下应当怎么设置嘛?
    再谢。

    1. Amao_Three 回复

      自己做了几点改动是一些治标不治本的方法:比如在PC的hosts文件里绑定好每一个校内网页的ip(多而繁琐……)
      然后把“DNS转发”那里的上游DNS用google的v6DNS代替了8.8.8.8并且用别人分享的常用的一些网站的v6地址写入了hosts,这样就目前来说还可以。

      但是实际运行总感觉怪怪的……说不出来哪里怪了。

    2. cokebar 文章作者 回复

      1. 根据III.1中的步骤,添加学校网站的域到custom_bypass中,并指定其DNS走校园网DNS。
      2. Shadowsocks-libev的作者曾说过,ipv4/ipv6双栈着实是一个灾难(https://github.com/shadowsocks/shadowsocks-libev/issues/942#issuecomment-260100482),我也曾遇到这样的问题,也是通过直接将常用网站写入hosts或者dnsmasq的配置文件来解决。问题所在就是,你很难控制操作系统访问特定一个网站时候应该走v4还是v6。操作系统总是优先使用ipv6。除非有一个dns程序,可以定制化的按需求丢弃解析出的AAAA记录。比如像chinadns一样,同时通过国外DNS和国内DNS解析,如果返回结果里AAAA记录只有国内,那么就采用国内DNS的结果,保留AAAA记录(当然,防污染措施也要做),如果不是上述情况,则采用国外DNS解析结果,并且如果存在AAAA记录,则丢弃掉,防止客户端解析出ipv6地址导致走ipv6. 然而目前没发现有这种软件。
      3. 未来假如ipv6普及了,就反而就没这个问题了,aa65535的这个luci-app-shadowsocks更新一个支持ipv6的版本就可以了。

  6. babydoll 回复

    感谢博主,我的LEDE为 Reboot (17.01.4, r3560-79f57e422d),按照教程一步步都正常执行完成。但是服务-影梭下透明代理、socks5代理、端口转发都显示未运行,尝试执行root@LEDE:~# sh ss_watchdog.sh,结果如下,没全部列出的。
    [2018-03-11 22:41:55] Problem decteted, restarting shadowsocks.
    Error loading shared library libmbedcrypto.so.0: No such file or directory (need ed by /usr/bin/ss-redir)
    Error relocating /usr/bin/ss-redir: mbedtls_cipher_update: symbol not found
    Error relocating /usr/bin/ss-redir: mbedtls_cipher_free: symbol not found
    Error relocating /usr/bin/ss-redir: mbedtls_cipher_auth_decrypt: symbol not found
    Error relocating /usr/bin/ss-redir: mbedtls_cipher_setkey: symbol not found
    网上查了说可以建立软连接,命令如下:
    ln -s /usr/lib/libmbedcrypto.so.1 /usr/lib/libmbedcrypto.so.0
    再次执行root@LEDE:~# sh ss_watchdog.sh,结果就是如下3行:
    [2018-03-11 23:16:37] Problem decteted, restarting shadowsocks.
    Error relocating /usr/bin/ss-redir: mbedtls_md5: symbol not found
    Error relocating /usr/bin/ss-tunnel: mbedtls_md5: symbol not found
    想麻烦博主帮我分析下什么问题,如何解决呀。万分感谢!

    1. cokebar 文章作者 回复

      mbedtls 2.7版本的一个变化导致的兼容问题,新版本生成的二进制文件数量有变化(这么大change…真是蛋疼)。两种解决方法(软链接记得删了):
      1. 暂时回退到openwrt-dist.sourceforge.net上面的2.6版本,并等待aa65535更新从2.7的mbedtls编译过来的ss版本
      2. 自己利用lede-sdk,使用2.7版本mbedtls源码重新编译ss

      LEDE开始,package的更新就和之前不同,变得非常激进了。之前和其他发行版Linux一样,某个稳定版里的package也会选定一个稳定版,只更新修补性的更新,不做功能性更新。现在则是会很快的更新到最新的版本。这两种策略各有优点,但缺点也很明显,结果就是经常引发依赖地狱。

      1. babydoll 回复

        谢谢!但是请问回退到openwrt-dist.sourceforge.net上面的2.6版本,是指ss的版本吗,还是mbedtls的版本?我打开这个网页,好像不知道哪里下载呀,下载哪个呢,还请博主指点。

      2. babydoll 回复

        我看了我的LEDE中,安装的是libmbedtls – 2.7.0-1,是将它卸载,再安装2.6版本的吗

      3. babydoll 回复

        执行卸载,提示有依赖:
        root@LEDE:/etc/opkg# opkg remove libmbedtls – 2.7.0-1
        No packages removed.
        Collected errors:
        * print_dependents_warning: Package libmbedtls is depended upon by packages:
        * print_dependents_warning: shadowsocks-libev
        * print_dependents_warning: libcurl
        * print_dependents_warning: These might cease to work if package libmbedtls is removed.

        * print_dependents_warning: Force removal of this package with –force-depends.
        * print_dependents_warning: Force removal of this package and its dependents
        * print_dependents_warning: with –force-removal-of-dependent-packages.
        是需要强制卸载,然后安装旧版本吗?我已经从http://openwrt-dist.sourceforge.net/packages/LEDE/base/mips_24kc/下载了libmbedtls_2.6.0-2_mips_24kc.ipk了。非常感谢!

        1. cokebar 文章作者

          加上参数强制卸载然后重装2.6即可

    2. wawaguan 回复

      用科大的源重新安装软件

    1. cokebar 文章作者 回复

      opkg update以后,系统有了软件源服务器上的软件列表,发现服务器上的版本高,就会优先去下载新版本;不过由于这个列表存在/tmp目录下,重启后会清空,所以重启一下 不要opkg update,直接装旧版本就行了。

  7. 小小白 回复

    3.15号a66535已经更新了ss版本与最新的libmbedtls 2.7版本已经兼容无任何问题。飞羽有空可以改一下。

  8. signigelchan 回复

    感谢博主精心提供的教程集,在最新版部署中出现了很费解的问题:

    我在使用 shadowsocks-libev-3.1.3 之前(version < 3.1.3),使用完全没有问题;前两天更新了最新版本后,就出现不能访问国外的问题,然后以最新版本为基础,从零开始重新部署,仍然没有解决;退回到3.1.2版本就没有问题。然后我向 shadowsocks-libev 作者提出了一个 Issue,作者回复说是 DNS 污染问题,可是这个教程已经提供了 ChineDNS 和 DNS-Forwarder 来防止 DNS 污染的方案,很是困解。

    于是前来请教博主,不知道是哪个环节出了问题。

  9. signigelchan 回复

    附 Github Issue 地址:https://github.com/shadowsocks/shadowsocks-libev/issues/1986

发表评论

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

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