Shadowsocks for OpenWRT / LEDE 拾遗

本文是《Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动科学上网》的补充,介绍了一些额外的操作,可以解决一些特定的问题。本人也会持续更新这篇文章。

目录:

1、让路由器本身走SHADOWSOCKS

2、使用作者提供的软件源安装及更新SHADOWSOCKS

3、使用计划任务检测连接状态,发生异常时候自动重启SHADOWSOCKS

4、使用计划任务自动更新CHNROUTE(IGNORE.LIST)文件


1、让路由器本身走shadowsocks

这里的步骤,chnroute和gfwlist方案里都有提到,这里单列出来。

首先shadowsocks的访问控制设置中,“代理自身”这一项,根据自己需求选择“正常代理”或者“全局代理”:

然后,切换到WAN口设置→高级设置,取消“


2、使用作者提供的软件源安装及更新shadowsocks

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

由于该地址被部分ISP所墙,或者访问困难,所以这些ISP要以前面“1”的步骤为基础才能进行这一步。

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

下面是手动的步骤(请参照 http://openwrt-dist.sourceforge.net/ 里的说明:

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

打开Luci,定位到“系统”-“软件包”-“配置”选项卡,在软件源末尾加入两行:

OpenWrt:

LEDE:

OpenWrt请根据自己的CPU型号,LEDE请根据自己的CPU架构(可以执行 opkg print-architecture 查看),将ar71xx/mipsel_24kc替换成相应的文本,最后点击提交。

然后执行命令 opkg update ,如果卡住,就按Ctrl+C取消掉,然后重试,如果反复重试还是不行,那么你可能还是需要自行下载ipk后手工安装、更新。

相关的依赖包: ipset iptables-mod-tproxy libev libcares libpcre libmbedtls libsodium ,首次安装shadowsocks的话要先把这些依赖包的最新版本安装上,如果是升级shadowsocks,如果看到这些依赖包有新版本也推荐更新一下。

接下来可以在过滤器中输入关键词进行搜索,分别输入shadowsocks、chinadns、dns-forwarder进行搜索,找到最新的shadowsocks-libev, luci-app-shadowsocks, chinadns, luci-app-chinadns, dns-forwarder, luci-app-dns-forwarder,分别点击安装即可;

顺带说明,此软件源同样包含ShadowVPN和Redsocks2及其luci-app,作者都是a65535,有需要的可以自行下载安装。

而如果你需要让系统定期检查自动更新,可以参照:OpenWRT 自动更新软件包脚本


3、使用计划任务检测连接状态,发生异常时候自动重启shadowsocks

这一个也是以完成“1”的步骤为前提的,首先请确认已经安装了 ca-certificates ,如果是LEDE,还需要 ca-bundle 。同时要注意需要安装支持https的wget(opkg install wget)

新建一个脚本文件,比如 /root/ss_watchdog.sh :

把执行权限加上

该脚本通过尝试下载google主页(只是尝试下载并不会真的下载到路由器)来检测代理是否连通,如果尝试失败,会再次尝试下载百度主页,如果失败说明网络不通,此时什么都不做,如果下载成功,说明shadowsocks异常,那么就重启shadowsocks。 –timeout=10是指的超时时间,最好根据自己的链接速度调整一下,不要过长或者过短;网址可以根据自己的情况换成其他。

下面的步骤就是向crontab加上计划任务了(可以直接在Luci里面添加),比如每10分钟执行一次检测,就添加如下内容:

倒数第二行,前面的*/10就是每十分钟,接下来的4个* 是指任意小时、天、月、星期,这样一来 就是每10分钟执行一次了;后面是执行的命令/root/tester。

日志会输出到/var/log/shadowsocks_watchdog.log,可以通过它检查计划任务运行状态。

可以先停止shadowsocks,然后添加倒数第二行到计划任务并保存应用,此时计划任务内的命令会立即执行一遍,此时查看shadowsocks是否已经启动,并且查看日志文件。

而最后一行,在周日凌晨1点,定时清空日志文件,否则,如果你长期开着路由不管,不清空日志文件会变得非常大。


4、使用计划任务自动更新chnroute(ignore.list)文件

1.新建一个文件 /root/update_ignore_list.sh 写入如下内容:

2.使用 chmod +x /root/update_ignore_list.sh 添加可执行权限

3.打开路由器管.理页面 系统 - 计划任务 填写如下内容(每天 04:30 执行):


5、不开udp代理的chrome用户,禁用quic

不开UDP代理的话,chrome观看youtube视频可能会走quic协议,这个是基于udp的,如果没设置UDP代理,会直连,可能速度慢或者不通,建议直接关闭掉。

 

6、DNSMASQ的解析优化

这里直接引用之前某网友的问题和我的回答:

1.dnsmasq中配置uci add_list dhcp.@dnsmasq[0].cachesize=10000是配置查询dns缓存的大小吧,这个最大能设置多少呢?dns结果存路由器上占用的空间应该不大吧?

如果我没记错最大好像就是10000,具体大小酌情配置,主要看运行一段时间后内存占用情况;通常占用不会太高,调成10000没问题;改大可以让dnsmasq缓存更多的解析结果。不过实际效果不明显,因为大部分情况不会访问太多的网站。

2.按照上述,如果是dns缓存的话,那么第一次打开一个没打开过的外网,比如facebook,会慢一些,之后再次打开这个网站的话会很快,是吗?但实际上不是这样的,过一段时间(1分钟左右),打开facebook会发现很慢;我用dig查询了一下dns,第一次为700多ms,后面都为1s,过了几分钟dig查询,又变成了700多s, 所以想问下是否有缓存时间一说,如果有缓存时间,能否告知下怎么设置呢? 

dnsmasq的缓存除非你手工清除或者重启程序,默认情况下是不会清除的。但是要知道DNS记录有个东西叫TTL,说白了就是有效时间,假如你一次查询,得到的结果TTL剩余10分钟,那么10分钟之后重新查询,是不会读缓存的,因为此时认为缓存里的内容已经超过时效时间,变得无效了,因此会强制重新查询。由于现代网站大量使用CDN,而CDN服务商更新IP是很频繁的,因此CDN服务商的DNS record的TTL设置的时间都比较短,这是为了保证下游的DNS查询结果尽快更新到最新的IP。facebook用的CDN,我dig查询了一下,TTL似乎是一分钟,也就是,过了一分钟之后,系统还是会重新查询而不是读缓存。
其实CDN设这么短是为了保证CDN的可用性,大部分情况下不需要这么短;dnsmasq里面有一个选项,可以设置最小的TTL时间,如果DNS record的TTL小于这个值,就会被强制提升到这个值,官方的说明为:
–min-cache-ttl=

可知直接在/etc/dnsmasq.conf里添加一行设置这个值,单位是秒:
min-cache-ttl=1800
建议不要过大,3600以内吧,否则可能会有副作用

210 条评论

  1. peter 回复

    我记得有个DNS服务会根据国内或者国外的进行对比,再返回的,大致就是通过GFW里解释回来的如果是海外IP就是用本地解释(你文中提及的)。
    理论上讲,如果无DNS问题,你为什么不在iptable里进行分流?分大陆和海外的。

    1. cokebar 文章作者 回复

      就是iptables分流的啊。。。只不过用上了ipset 把冗长的大陆路由表搞到了一个ipset里面 这样只需一条iptables即可完成nat

      1. peter 回复

        博主,能不能提供一个iptables表,它是包含大陆IP端的,我想做分流,但你文章没提及。谢谢。

    2. cokebar 文章作者 回复

      这个包含分流了,ignore.list就是大陆的路由表

      1. peter 回复

        谢谢LZ,原来SS都有个列表,直接执行就好,我的是libev 1.6.2,这样可能效率更高吧,至少更简单。
        ss-local -c /etc/shadowsocks_vps.json -u –acl /root/shadowsocks-libev/acl/chn.acl

        1. cokebar 文章作者

          ss-local支持acl,ss-redir不支持,你要是用ss-local+redsocks可以这样搞

      2. peter 回复

        是的,目前就是用这样的组合,可惜我的VPS是windows,没有支持UDP转发的SS服务端,否则我进一步用SS做DNS转发。

        1. cokebar 文章作者

          我跑了个ss-local试了试 不知道为啥acl无效 国内依然走ss

        2. cokebar 文章作者

          自己搭非标端口DNS吧。话说自己写脚本不如装这种现成的省心,而且resocks2那种自动判断机制,等待时间太蛋疼了

      3. peter 回复

        我是这样写的:
        ss-local -c /etc/shadowsocks_vps.json -u –acl /root/shadowsocks-libev/acl/chn.acl
        你用国内的查IP和国外的查自己IP比较下嘛,这个你应该会啊,怎么会有问题我的版本是:shadowsocks-libev 1.6.2

  2. 引用: 实现 OpenWRT 自动翻墙 | 悠悠内心

  3. 海涛 回复

    请问怎么更新shadowsocks-libev-spec-polarssl版本呢?是在打开Luci,定位到“系统”-“软件包”中动作中直接搜索后点击最新版本安装,还是要先移除旧版本,再安装,现在用的是1.6.2-2,最新版是1.6.3-1

    1. aa65535 回复

      「刷新列表」后直接搜索安装新版就行了,会自动覆盖更新,不用先卸载旧版本。

      1. 海涛 回复

        谢谢,刚刚直接更新了ss和配套的luci,这样好方便。

    2. cokebar 文章作者 回复

      直接更新,你卸载旧版本会导致下不下来的。。。

      1. 海涛 回复

        谢谢,之前都是卸载后再装的,直接覆盖后也不用重新设置了。

  4. 海涛 回复

    第三步,脚本文件后缀是什么?用wincp直接建了一个tester文件(没有后缀名),测试不会自动重启ss

    1. cokebar 文章作者 回复

      不必考虑扩展名,Linux不管这个的,只要里面内容对就行。然后需要加上执行权限才行

  5. amon 回复

    请问为什么shadowsocks_watchdog.log里面提示没有权限?

    1. cokebar 文章作者 回复

      tester加上执行权限: chmod +x /root/tester 或者 chmod 755 /root/tester
      或者在winscp下改

  6. 海涛 回复

    相同的配置,一个路由有日志,一个没调用成功,没有输出日志。
    1、
    /bin/sh: /root/tester: not found
    2、
    [2015-01-06 02:10:01] No Problem.
    [2015-01-06 03:40:01] Problem decteted, restarting shadowsocks.
    sh: write error: Broken pipe

    这个输出日志sh: write error: Broken pipe是什么意思?重启成功了吧。
    还有需要定期更新ingoner.list吗?

    1. cokebar 文章作者 回复

      请尽量避免发之前的长回复 太长了很蛋疼的。提示not found要么是路径有误要么就是没有执行权限。ignore.list不更新也没啥大问题随着软件更新就行了。 至于broken pipe,你手动执行一下/etc/init.d/shadowsocks restart试试看是不是重启shadowsocks造成的。

      1. 白猪 回复

        shadowsocks_watchdog.log显示如下:
        /bin/sh: /root/tester: not found

        已经设置过权限了,文件位置也正确,这是为啥呢?谢谢!

        1. cokebar 文章作者

          不要使用Windows平台的记事本等文本编辑工具编辑Linux的脚本文件。使用WinSCP自带的文本编辑器或者使用Notepad++一类的文本编辑器,由于win和linux换行符不一样,所以会这样

        2. 白猪

          谢谢你!!
          确实是编辑器问题!太感谢了!!

        3. jack

          这个no found的问题,我终于搞明白了。有些路由器目录结构不是/root/test,所以你把作者的脚本改成/tester就没有这个提示了。一切正常。

  7. 引用: Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙 | Charles' Collection

  8. zz 回复

    wget -4 –spider –quiet –tries=1 –timeout=3 http://www.google.co.jp
    有错误,unrecognized option -4,-tries_1, `–timeout=10′ 怎么改?谢谢

    1. cokebar 文章作者 回复

      opkg update
      opkg install wget

  9. 三星 回复

    我的老是过些时间就无法访问外网,可以上内网期间,时间持续大约一分钟,用你的脚本,有时可以检测到,有时检测不到。可以没十分钟检查一次时刚好遇见吧

    请问是什么问题,如何解决?

    1. cokebar 文章作者 回复

      shadowsocks在openwrt下还是不够稳定啊。如果用的polarssl试着换成openssl;反之亦然。同时试试其他加密方式。

  10. 引用: openwrt路由器配置+SS+SAMBA+迅雷远程 | yfeer's blog

发表回复

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

请输入验证码 *