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,由于先卸载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 文章合集目录

五、写在最后

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

1,971 条评论

  1. lqzh 回复

    您好,我在路由设置 1.1.1.1 的ss服务器后, 局域网下就无法访问 1.1.1.1 上的业务了。例如 22 端口 ssh,80端口网站等~ 都无法访问。我将路由的 ss 服务器改为 2.2.2.2 后,1.1.1.1 的就可以访问了。
    请问我是哪里弄错了么?

    1. cokebar 文章作者 回复

      ss服务器的IP地址所有通讯是会直连的,所以应该是你直连1.1.1.1的ssh/80端口无法连通,可能是被防火墙封杀。你路由上改成2.2.2.2后,访问1.1.1.1就会走2.2.2.2代理,2.2.2.2到1.1.1.1是通的,所以能连。

  2. 3ku 回复

    安装时总报这个错,请问是哪里的问题呢?
    Package ChinaDNS version 1.3.2-4 has no valid architecture, ignoring.
    Package libmbedtls version 2.2.1-1 has no valid architecture, ignoring.
    Package libpolarssl version 1.3.16-1 has no valid architecture, ignoring.
    Package redsocks2 version 0.60-2 has no valid architecture, ignoring.
    Package shadowsocks-libev version 2.4.8-3 has no valid architecture, ignoring.
    Package shadowsocks-libev-mbedtls version 2.4.8-3 has no valid architecture, ignoring.
    Package shadowsocks-libev-server version 2.4.8-3 has no valid architecture, ignoring.
    Package shadowsocks-libev-server-mbedtls version 2.4.8-3 has no valid architecture, ignoring.
    Package ShadowVPN version 0.2.0-1 has no valid architecture, ignoring.

    1. lqzh 回复

      架构不对~ 参考文章 1.1
      请根据自己的CPU架构(可以执行 opkg print-architecture 查看,或者参考“发行版软件源”里的URL里的文本),将mipsel_24kc替换成相应的文本,最后点击提交。

  3. GumpWong 回复

    飞羽大神:
    我原版OpenWrt 18.06.1 使用此教程。目前做到第二步完成。
    各项服务都显示启动。但是打开墙外网址都无法打开。显示ERR_ADDRESS_UNREACHABLE。
    清除过电脑和浏览器DNS缓存。
    以facebook.com为例:
    chrome显示错误的时候,后台显示的ip为:
    http://www.facebook.com IPV4 69.171.239.11300000 2018-10-22 22:34:10.347 0
    电脑Di结果如下:
    1、直接dig:
    dig http://www.facebook.com

    ; <> DiG 9.10.6 <> http://www.facebook.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 57547
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 1472
    ;; QUESTION SECTION:
    ;www.facebook.com. IN A

    ;; Query time: 684 msec
    ;; SERVER: 192.168.1.140#53(192.168.1.140)
    ;; WHEN: Mon Oct 22 22:32:11 CST 2018
    ;; MSG SIZE rcvd: 45
    2、路由5311端口dig:
    dig @192.168.2.1 -p 5311 http://www.facebook.com

    ; <> DiG 9.10.6 <> @192.168.2.1 -p 5311 http://www.facebook.com
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55644
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 512
    ;; QUESTION SECTION:
    ;www.facebook.com. IN A

    ;; ANSWER SECTION:
    http://www.facebook.com. 3599 IN CNAME star-mini.c10r.facebook.com.
    star-mini.c10r.facebook.com. 59 IN A 31.13.95.36

    ;; Query time: 1520 msec
    ;; SERVER: 192.168.2.1#5311(192.168.2.1)
    ;; WHEN: Mon Oct 22 22:33:10 CST 2018
    ;; MSG SIZE rcvd: 90
    3、路由5353端口dig:
    dig @192.168.2.1 -p 5353 http://www.facebook.com

    ; <> DiG 9.10.6 <> @192.168.2.1 -p 5353 http://www.facebook.com
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35009
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 512
    ;; QUESTION SECTION:
    ;www.facebook.com. IN A

    ;; ANSWER SECTION:
    http://www.facebook.com. 3599 IN CNAME star-mini.c10r.facebook.com.
    star-mini.c10r.facebook.com. 59 IN A 31.13.95.36

    ;; Query time: 364 msec
    ;; SERVER: 192.168.2.1#5353(192.168.2.1)
    ;; WHEN: Mon Oct 22 22:33:45 CST 2018
    ;; MSG SIZE rcvd: 90

    4、我的网络里另外有一台DNS服务器(pihole)指定用这台设备dig:
    dig @192.168.1.140 http://www.facebook.com

    ; <> DiG 9.10.6 <> @192.168.1.140 http://www.facebook.com
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57998
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;www.facebook.com. IN A

    ;; ANSWER SECTION:
    http://www.facebook.com. 3532 IN A 75.126.150.210

    ;; Query time: 5 msec
    ;; SERVER: 192.168.1.140#53(192.168.1.140)
    ;; WHEN: Mon Oct 22 22:35:24 CST 2018
    ;; MSG SIZE rcvd: 61

    我还有一个虚拟机是跑的koolshare的科学上网插件。切换到这个就一切正常。
    还请指教,如何排除?

  4. GumpWong 回复

    在尝试执行如下步骤的时候,遇到问题。
    然后为了正常使用下面用到的脚本,需要安装可信根证书以及curl:
    opkg install coreutils-base64 ca-certificates ca-bundle curl

    之前已经把源添加过了。但是执行这个命令提示如下:
    opkg install coreutils-base64 ca-certificates ca-bundle curl
    Unknown package ‘coreutils-base64’.
    Unknown package ‘ca-certificates’.
    Unknown package ‘ca-bundle’.
    Unknown package ‘curl’.
    Collected errors:
    * opkg_install_cmd: Cannot install package coreutils-base64.
    * opkg_install_cmd: Cannot install package ca-certificates.
    * opkg_install_cmd: Cannot install package ca-bundle.
    * opkg_install_cmd: Cannot install package curl.

    1. cokebar 文章作者 回复

      opkg update失败,请重试,直到没有下载出错的信息。Openwrt官网服务器国内网络直连速度比较慢。

  5. GumpWong 回复

    我原版OP参考教程执行到第二步DNS设置完成。
    TG已经能正常使用。但是各个墙外APP和WEB打开都会错误。
    清除了电脑和浏览器的缓存,分别用电脑\指定路由5311、5353端口DIG,结果一致。但是用指定我内网DNS(pihole)的IP,DIG结果是另外一个结果。
    同样的环境,把原版OP切换到Koolshare的就一切正常。
    还请指教如何进一步排除。

    1. cokebar 文章作者 回复

      wan口记得手动指定dns为127.0.0.1;你又加了一道pihole,这个东西我不了解,请确保它不会额外引入DNS污染

  6. captaintang 回复

    楼主,你好,有个问题请教一下!
    1.dnsmasq中配置uci add_list dhcp.@dnsmasq[0].cachesize=10000是配置查询dns缓存的大小吧,这个最大能设置多少呢?dns结果存路由器上占用的空间应该不大吧?
    2.按照上述,如果是dns缓存的话,那么第一次打开一个没打开过的外网,比如facebook,会慢一些,之后再次打开这个网站的话会很快,是吗?但实际上不是这样的,过一段时间(1分钟左右),打开facebook会发现很慢;我用dig查询了一下dns,第一次为700多ms,后面都为1s,过了几分钟dig查询,又变成了700多s, 所以想问下是否有缓存时间一说,如果有缓存时间,能否告知下怎么设置呢? 或者除了上面的缓存大小外,还应该配置其他东西? 万分感谢!

    1. cokebar 文章作者 回复

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

  7. wang 回复

    按照教程使用一年多,正常使用,有个问题是国内几个网站不能访问,提示DNS解析错误,比如:找不到 wx.qq.com 的服务器 IP 地址、百度云盘、QQ邮箱等,如何把这些网址加到白名单直接访问?我用的是ShadowSocksR+ChnRoute。以前是ShadowSocks+ChnRoute,也是同样的毛病。

    1. captaintang 回复

      我用ShadowSocks+ChnRoute,你上面所说的网站我都可以正常访问,你试试更新下chinadns, gfwlist.conf, domains.china.conf;另外自定义部分应该是在第三部分,你可以试试。

  8. wang 回复

    1、ShadowSocksR 客户端 运行模式 IP路由模式。访问控制 /etc/china_ssr.txt。这个是路由表。
    2、ChinaDNS 国内路由表指向 /etc/china_ssr.txt。
    3、dnsmasq指向 /etc/dnsmasq.ssr 目录,包含ad.conf gfw_list.conf myrules.conf。server=/.qq.com/127.0.0.1#5353
    ipset=/.qq.com/gfwlist ,这样还是访问不了wx.qq.com mail.qq.com。
    3a、如dnsmasq指向 /etc/dnsmasq.d,包含accelerated-domains.china.conf、custom_bypass.conf、custom_forward.conf、dnsmasq_gfwlist.conf,ShadowSocksR就不能正常运行了。

    1. cokebar 文章作者 回复

      用dig排查那一层出现了无法解析的问题

  9. Neo 回复

    lz好,
    按照教程完成了二 II 后已经可以实现了按照chinaDNS的list来上网。然后今天又按照教程 完成了二 III, 就无法上网了。请问如何退回到 之前的 二II 的状态。

    系统是LEDE。
    感谢!

  10. wni 回复

    厉害,恭喜已经可以fq.我的还在折腾呢。
    那你就恢复一下再来一次就OK了。

发表评论

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

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