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.openwrt.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 文章合集目录

五、写在最后

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

2,072 条评论

  1. 头像Ku.u 回复

    在最新版上不work呀 v18.06.1

  2. 头像Icarus Radio 回复

    羽大,最近我在 OpenWrt v18.06.1 上按照教程配置到 “II. DNS转发链的基本配置” 后,无论路由器还是客户端 DNS 都解析不出域名。我用的ss ChinaDNS 和 dns-forwarder 都是作者仓库里最新的。
    以前用您的教程在 LEDE v17.01.4 上成功配置过,不知道为什么现在失败了。

    1. 头像K.U. 回复

      一样的现象,DNS有问题。新版本就是不能上,很多坑,不知道是shadowsocks的还是openwrt的

    2. 头像xiaosyu 回复

      我刚设好的时候是好的,过了一会儿后,也变成你这样……

  3. 头像huto 回复

    自己按网上的教程装了个Unbound,结果是有些网站可以打开,有些打不开。像google这种被墙的网站打开没问题,国内网站也没问题,而有些网站就打不开,你的博客就是其中之一。

  4. 头像liangcaoxong 回复

    别的都正常,Xbox 丢包100% nat类型为限制.开了udp服务器和端口转发,关了dns-forwarder.有办法解决吗?

      1. 头像liangcaoxong 回复

        我的xb1x现在仍然不能设置MTU。nat类型可以解决,就是丢包显示100%解决不了。不过,虽然显示100%丢包MTU显示为0。但并不影响正常联机游戏,这可能是个bug。

  5. 头像xiaosyu 回复

    您好,我按照教程,一直做到设置代理那一步,但是透明代理始终处于未运行状态的,现在卡在这里进行不下去了……

    1. cokebarcokebar 文章作者 回复

      重启试试,我18.06.1系统貌似装完需要重启一次

      1. 头像xiaosyu 回复

        稀里糊涂的折腾了半天现在好像是work了,但是dns那块还是有问题,我下载了你的脚本,也重启过了dnsmasq服务,但是好像没什么作用,表现在个别网站,比如新浪微博,就总是解析不了域名,或者解析到北美去……

      2. 头像xiaosyu 回复

        update一下……
        我基本上把整个设置倒回去,dnsmasq也重新装了一次,然后从头一直设置到chinadns和dns-forwarder那个地方,后续的dns优化没做,仅靠chinadns来分流,暂时还行……改天再试试gfwlist做一下看看……

  6. 头像Chafels 回复

    没有弄GFWList那一步,其他都ok了,Google也可以打开了,但是Android的Google Play还是不行啊
    有界面,但是一直刷不出内容,什么原因呢?谢谢

    1. 头像Dingles 回复

      加一条自宝义解析
      server=/services.googleapis.cn/1.1.1.1

  7. 头像muronghan 回复

    是不是这个原因:http://koolshare.cn/thread-89303-1-1.html

  8. 头像shuffleming 回复

    其他没问题, 但在配置指定域名强制代理出现该错误, .sh 里的gfwlist.txt 的url 是不是变化了?Fetching GfwList…
    Failed to fetch gfwlist.txt. Please check your Internet connection.

  9. 头像小恐龙 回复

    请教各位
    (1). “二.III.2. 添加gfwlist和China-List配置文件”【下简称“前者”】与“三、按域名指定是否走代理(可选)”【下简称“后者”】有什么区别?为什么后者需要替换dnsmasq为dnsmasq-full而前者就不需要?
    (2). 后者可以 “自定义域名强制直连”或 “自定义域名强制走代理”,前者能不能做到?
    (3). 如果前者能做到,是不是就是直接修改accelerated-domains.china.conf文件,在末尾添上形如:
    server=/someweb.com/114.114.114.114
    的一行就可以让,这个网站的数据直接走国内而不经过ss?

    恳求大神们指点,谢谢!!!

    1. cokebarcokebar 文章作者 回复

      (1) 因为后者使用了dnsmasq的ipset rule,这个需要dnsmasq-full才支持
      (2) 前者只是控制这些域名的解析走国内还是国外DNS,走不走代理还是由chnroute.txt来判断;后者除过控制DNS解析,还利用dnsmasq的ipset rule将这些域名解析的IP加入到对应的ipset中,从而控制这些IP走不走代理,因此可以强制这些域名对应的ip走不走代理。
      (3) 本质上后者就是在前者的规则基础上增加了对应的ipset rule,实现强制网站不走ss,除过安装dnsmasq-full之外还要写两条规则:
      server=/someweb.com/114.114.114.114, 这条保证走国内DNS解析
      ipset=/someweb.com/ss_spec_dst_bp,这条将网站的解析的IP添加到ss_spec_dst_bp这个ipset中;这个ipset中的IP会直连,不走代理(可参考ss-rules脚本的内容以及luci-app-shadowsocks的github wiki)。

    2. cokebarcokebar 文章作者 回复

      当然你也可以让某国外域名强制直连,第一条写成server=/someweb.com/8.8.8.8或者不写都行,只写第二条的ipset rule

  10. 头像小恐龙 回复

    膜拜!大神解释的太清楚了,我理解了!ヽ(^‥^=ゞ)

    所以为了让Plex的远程连接正常工作,我就必须要使用【“三、按域名指定是否走代理(可选)”+自定义域名强制直连】方案,在 /etc/dnsmasq.d 目录下新建的 custom_forward.conf 中添加一行ipset=/plex.tv/ss_spec_dst_bp
    对吗?

发表评论

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

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