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. 引用: Shadowsocks + ChinaDNS 实现 OpenWRT 路由器自动翻墙 - 飞羽博客

  2. 海涛 回复

    几点都很实用。
    提个建议:1.4两步的代码是否可以提供修改好的版本,我直接下载后覆盖原文件即可?确实搞不懂那个需要修改,自己修改难度大。第3步,然后我们新建一个脚本文件,比如/root/tester,把执行权限加上,然后写入如下内容:怎么加权限?具体怎么操作?是否也可提供下载版本?
    还有一个小白问题:shadowsocks-libev-spec这四个插件,如果有更新openwrt是否可以自动更新?需要怎么操作?谢谢!

    1. cokebar 文章作者 回复

      第一部分不提供整个修改好的文件的原因是 不同版本内容有所不同 如果版本差的太多 可能引起不兼容的情况;稍后我会上传一个参考文件 但很有可能会在将来的新版本中造成不兼容的情况。
      第三部分,修改权限可以使用WinSCP右键属性直接修改,或者在shell中用chmod命令修改,这个必须要自己修改的,因为你用winscp从win拷贝一个文件进路由器,默认就是没有执行权限的。
      第四部分只需将内容直接添加进去即可,格式是server=/domain.com/DNS IP 一个一行 根据需求来,根据自己需求添加,但是一个站点的域名有很多,特别是cdn服务器的域名是五花八门,想找全这些域名也是需要一些操作,所以一般人无视这个就行了,毕竟很少见。
      总体来说这篇主要适合那些有一定Linux基础的人来操作。

      1. 海涛 回复

        补习一些基础知识后再操作,易信的域名是多少?被解析到国外了。

    2. cokebar 文章作者 回复

      第一个问题我已经向作者提交了issue,或许未来会增加进去,到时候就不用自己修改了

      1. 海涛 回复

        暂时可以正常上网,自己修改怕出问题,期待修改过的版本。

        1. cokebar 文章作者

          作者已经更新源码,不过还未编译成新的包;不过由于二进制文件并未更新,更新的只是脚本文件,所以可以直接覆盖,我把更改的文件贴出来了,可以先自己覆盖过去

  3. Halry 回复

    支持下,博主的blog真心不错。
    真心希望有黑名单的方法,这样就只有部分需要翻墙的网页才翻了,全局加白名单有时还是有些迅雷,百度盘下载的东西跑vps,速度太慢(出口国外只有500k,而长宽内部的有10mb/s。。。)

    1. cokebar 文章作者 回复

      包含法早都有了 只是因为我用的排除法 所以我没有写相关的东西 因为整理还是需要精力的 你可以参考这篇:
      https://kyonli.com/p/18

      1. Halry 回复

        谢谢,他的教程不够你的清楚,哈哈,但是已经看明白了,这周回家就配置好这个

  4. myliyifei 回复

    每隔10分钟写法是 */10 不用那么复杂

  5. myliyifei 回复

    IPV6 有可能出错,建议加上参数 -4

    # wget –spider -v –tries=2 –timeout=10 http://www.google.com
    Spider mode enabled. Check if remote file exists.
    –2014-12-27 23:23:46– http://www.google.com/
    Resolving http://www.google.com... 2404:6800:4005:807::1012, 173.194.127.244, 173.194.127.241, …
    Connecting to http://www.google.com|2404:6800:4005:807::1012|:80… failed: Address family not supported by protocol.

    1. cokebar 文章作者 回复

      建议关掉IPv6吧,要不你就得改ss-rules,让shadowsocks处理ipv6国外流量,否则IPv6会直连,遇到中间人攻击就得跪

      1. myliyifei 回复

        不,我就是因为没有IPV6,所以才出错的,有些OP默认开了IPV6

        1. cokebar 文章作者

          哦是的 BB正式版默认DHCPv6开启 Server模式 会为lan分配IPv6地址导致会得到AAAA地址,我刷完OP都是直接给关了的。。而且我们学校的IPv6也得用relay,本来就得改

        2. cokebar 文章作者

          我测试了一下 如果ipv6连接失败 会继续尝试ipv4的连接的 所以还不影响
          反而是有了IPv6时候,google.com通常可以直连,测试结果永远是通的,反而误导了 加个-4还是有必要的

  6. dover406 回复

    大神,有没有关于shadowvpn的教程呀

    1. cokebar 文章作者 回复

      ShadowVPN估计近期不会有,因为目前还不是很好用;主要也是作者没有额外精力去改善;目前那种启动脚本+停止脚本,改起配置来太麻烦了,而且目前也没人做个好用的win客户端。现在我是用ocserv做Cisco Anyconnect的服务端,这个iOS也能用。

  7. jackytang 回复

    要设置755权限么,按说应该chmod +x 就可以了吧

    1. cokebar 文章作者 回复

      和默认的保持一致嘛 强迫症者就可以接受了

  8. netcobra 回复

    能设置某个程序或者某台电脑不使用Shadowsocks吗?例如把下载机的BT下载和emule下载排除在Shadowsocks之外。

    1. cokebar 文章作者 回复

      luci里面有代理控制 可以指定白名单或者黑名单 有一台下载机的话 可以指定那一台的IP加到黑名单里面
      针对BT的话 目前这种排除法的代理模式无法区分P2P流量的 可以考虑的就是 高端口不走ss,修改方法可以参考这里:http://cokebar.info/archives/664/comment-page-9#comment-658

  9. ipiz 回复

    第一点让路由器自身走SS,会影响部分DDNS吧?!
    另外,现在的方案下,走不走代理是按国外和国内IP分的,我遇到一些IPTV软件不能用了,估计跟它们的服务器在国外有关,不知道怎么手动添加例外呢?如果自己加进chnroute和ignore list,下次更新又会没了吧?有没有一劳永逸的办法?

    1. cokebar 文章作者 回复

      DDNS的话,太特殊了。。很少人用到,我没考虑过这方面。 话说DDNS服务在国内的话应该没事儿,毕竟也是排除了国内IP的,国外的DDNS的话,首先可以看看DDNS服务用到的端口情况,排除本地客户端的端口,如果会写iptables的话,应该很容易办到;或者说排除远程服务器的IP,IP的话可以直接加到ignore.list里面;
      自己加ignore.list的话 可以自己新建一个文件使用不同的文件名免得更新时候被覆盖

      1. ipiz 回复

        嗯。我现在还是利用黑名单IP段设一段不走SS来解决IPTV的问题了。

  10. TwoBall 回复

    话说我搞好了计划任务文件,都给了777权限了,怎么不会生成日志呢?

    1. cokebar 文章作者 回复

      是否先试着手动执行过./tester测试一下先
      cron是开机运行 是否试着/etc/init.d/cron restart

1 2 3 4 5 9 10

发表回复

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

请输入验证码 *