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. ipisliao 回复

    我的openwrt貌似默认没有启用crond,建议在第三步描述脚本的位置添加检查crond是否有启动的方式和如何启用的方式

    1. cokebar 文章作者 回复

      openwrt.org的都是默认启用的 开机启动并启用一个程序就是在luci里面 切到启动项 切成启用 点击开始就行了,下面两行也可以,都是一样的操作。你这种情况是少数。
      /etc/init.d/xxx enable
      /etc/init.d/xxx start

      1. ipisliao 回复

        我也觉得很奇怪,crontab默认竟然没有启用,最后还是用ps确认的。
        多谢好文!

      2. BOSSCAT 回复

        请问如何测试shadowsocks监测脚本的运行情况?看log文件一直都是no problem,但是实际上经常无法连接。

  2. lqzh 回复

    LZ 我想问个端口排除的问题
    我翻了前面的评论 (https://cokebar.info/archives/664/comment-page-5/#comments)
    iptables -t nat -I SHADOWSOCKS 10 -p tcp –dport 15689 -j RETURN
    iptables -t nat -I SHADOWSOCKS 11 -p udp –dport 15689 -j RETURN
    这条只要加到 /etc/firewall.user 中就可以排除ss走 15689 端口么? SHADOWSOCKS后面的10,11什么意思?
    如果让ss只走 1:10000端口 应该怎么写呢? 前面的评论中链接标注失效了。
    (https://cokebar.info/archives/664/comment-page-9/#comments)
    iptables -t nat -A PREROUTING -p tcp -m multiport –dports 1:10000
    请问是这样么?

      1. lqzh 回复

        我是这样测试的。
        先说下测试环境,
        采用Shadowsocks + ChnRoute 加方案1(自建DNS服务器),
        有两台国外VPS, 路由通过A VPS(128.199.X.X)翻墙。 B vps, (107.170.X.X)
        首先在https://github.com/shadowsocks/openwrt-shadowsocks/blob/master/files/shadowsocks.rule#L29-L29
        添加 EXT_ARGS=”-m multiport –dports 9999:10000″ (这样应该就是只有9999,10000端口走SS了吧。相当于变相禁用SS)
        重启路由,PC上使用putty连接B VPS,然后在 /var/log/secure日志中查看来访IP,发现还是A VPS的IP(128.199.X.X), 但是我只允许ss走9999,10000端口后, B VPS中的来访IP不应该是 PC机的么?
        求教~

      2. lqzh 回复

        我改成
        EXT_ARGS=”-m multiport –dports 1:10000″后
        连接B VPS, 日志里面还是显示的A VPS的IP,说明还是通过ss链接的。。
        而且这样设定 应该是墙外的站也打不开的吧,(80,443端口) 但是我还是可以照常打开Y2B等
        百思不得其解了…… 求大神解救

  3. Jermin 回复

    感谢!非常好的教程。看了你的教程实现了OpenWRT 路由器自动翻墙。

    但是我有一个疑问

    为什么这里的第5条端口用5300,而不用《Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙》里面说的5353?

    1. 江川 回复

      这个随意的

        1. 江川

          这个端口在不和其他端口冲突情况下保持任意的一对相同数字就行

      1. Song 回复

        弱弱的问下,是说这俩端口只要没有冲突不必要一样,还是说作者随意些的,实际还是要保持一致。

        1. cokebar 文章作者

          此处写的5300是shadowsocks的UDP转发的端口

        2. cokebar 文章作者

          当然如果你有自己的非标端口DNS的话 写成那个的就行;不要写成ChinaDNS的端口 这里是为了强制走国外 要绕开ChinaDNS

      2. Song 回复

        重读了一次配置那个文章,好像明白了,是要保持和 ChinaDNS 的上游服务器里的一样。

  4. isbase 回复

    执行的命令/root/tester 提示/bin/sh: /root/tester: not found tester已经加了执行权限

  5. Jerry 回复

    加了你的twitter,想跟你请教下openwrt用daemontools监控shadowsocks运行的问题

  6. dohtem 回复

    你好博主,请教一个基础问题,为什么win端的shadowsocks-csharp客户端可以直接用pac代理,编辑方便,不需要顾忌dns污染、解析问题?
    路由器上的ss则需要chinadns或者dnsmaq之类的?
    路由上的ss有没有直接设置pac文件走代理的方式?我试了好多都没找到。

    自己设置pac的话,自己指定的某些国内网站和没有被墙的国外网站也可以走代理,速度有时候更快。
    一直有这个疑问,请教一下楼主。
    谢谢楼主一直分享教程,很有用。

    1. cokebar 文章作者 回复

      PAC是带access control的http代理 将http协议封装到代理隧道中 工作在应用层
      这里的路由是透明代理 代理TCP/UDP协议 工作在网络层

      1. dohtem 回复

        谢谢博主热心解答,如博主所说,之前在v2ex上看到win版ss作者的说明,C#客户端确实走的http代理。
        那么,路由上只能用SS配合各种dns解析、防污染软件吗?有没有像编辑PAC文件一样方便的方式呢?

  7. electroun 回复

    博主你好 为什么我试着sh tester总是提示如下 请帮忙看看 多谢
    root@TPlink:~# sh tester
    : not founde 2:
    tester: line 16: syntax error: unexpected “fi” (expecting “then”)

  8. sxx 回复

    实际测试在实际情况下 就算SS断线了 使用网络检测脚本也会提示没有问题。。。。。。 目测是DNS污染导致的下载伪google页面成功导致脚本失效???

    1. sxx 回复

      –2015-04-06 15:52:59– http://%A8cspider/
      Resolving \250cspider… ::, 60.191.124.236
      Connecting to %A8cspider|::|:80… connected.
      HTTP request sent, awaiting response… 200 OK
      Length: 419 [text/html]
      Saving to: ‘index.html.1’

      index.html.1 100%[============================>] 419 –.-KB/s in 0.001s

      2015-04-06 15:52:59 (593 KB/s) – ‘index.html.1’ saved [419/419]

      –2015-04-06 15:52:59– http://%A8cquiet/
      Resolving \250cquiet… ::, 60.191.124.236
      Connecting to %A8cquiet|::|:80… connected.
      HTTP request sent, awaiting response… 200 OK
      Length: 419 [text/html]
      Saving to: ‘index.html.2’

      index.html.2 100%[============================>] 419 –.-KB/s in 0s

      2015-04-06 15:52:59 (2.09 MB/s) – ‘index.html.2’ saved [419/419]

      –2015-04-06 15:52:59– http://www.google.co.jp/
      Resolving http://www.google.co.jp... 2404:6800:4003:c01::5e, 74.125.130.94
      Connecting to http://www.google.co.jp|2404:6800:4003:c01::5e|:80… failed: Permission denied.
      Connecting to http://www.google.co.jp|74.125.130.94|:80… connected.
      HTTP request sent, awaiting response… 200 OK
      Length: unspecified [text/html]
      Saving to: ‘index.html.3’

      index.html.3 [ ] 17.62K –.-KB/s in 0.1s

      2015-04-06 15:53:00 (148 KB/s) – ‘index.html.3’ saved [18045]

      FINISHED –2015-04-06 15:53:00–
      Total wall clock time: 0.6s
      Downloaded: 3 files, 18K in 0.1s (154 KB/s)
      [2015-04-06 15:52:59] No Problem.

      测试SS链接断开是 google可以下载

      1. cokebar 文章作者 回复

        改用https试试

        1. sxx

          需要加上 –no-check-certificate 参数才能正常下载

        2. sxx

          wget –no-check-certificate https://www.google.com.hk
          –2015-04-11 20:46:54– https://www.google.com.hk/
          Resolving http://www.google.com.hk... 2404:6800:4003:c01::5e, 74.125.130.94
          Connecting to http://www.google.com.hk|2404:6800:4003:c01::5e|:443… failed: Permission denied.
          Connecting to http://www.google.com.hk|74.125.130.94|:443… connected.
          WARNING: cannot verify http://www.google.com.hk‘s certificate, issued by ‘CN=Google Internet Authority G2,O=Google Inc,C=US’:
          Unable to locally verify the issuer’s authority.
          HTTP request sent, awaiting response… 200 OK
          Length: unspecified [text/html]
          Saving to: ‘index.html’

          index.html [ ] 17.84K –.-KB/s in 0.1s

          2015-04-11 20:46:55 (185 KB/s) – ‘index.html’ saved [18272]

          但是这样的话 我在SS断开时 还是能下载

        3. cokebar 文章作者

          可能是有中间人攻击 换个其他的验证页面吧 那种彻底封了的

        4. sxx

          看了下 下载到的文件 好像确实是 目标网站的的 index.html 但是浏览器是不能访问目标站点的

        5. sxx

          算了 看能不能直接在源码上 加上断线重连机制吧 自动检测SOCKET链接断开

        6. sxx

          直接ps 得到SS 进程下面的ip参数就能识别有没有断线 断线是0.0.0.0

    2. sxx 回复

      正在 Ping http://www.google.co.jp [74.125.130.94] 具有 32 字节的数据:
      请求超时。
      请求超时。
      请求超时。
      请求超时。
      请求超时。

    3. sxx 回复

      下载谷歌页面改成下载 鸭子搜索之类 就变成了每次检测都是SS未连接会去重启SS

    4. sxx 回复

      不行 https 就是每次都是提示SS未连接了

    5. sxx 回复

      突然间想起 驻波的主页是被fuck的 然后替换了一下 完美解决

    6. sxx 回复

      发现确实是 dns污染 问题 每个域名只能使用一次 https 还不支持。。。

  9. Jack 回复

    咨询下楼主,关于解决CHINADNS将一些国内站点解析到国外IP这点,我测试了一下,似乎不行,我是用用shadowsocks和chinadns,启用udp转发

发表回复

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

请输入验证码 *