Shadowsocks + ChnRoute 实现 OpenWRT / LEDE 路由器自动翻墙

shadowsocks 服务器合租招募

本站发布的三种使用 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下图形化配置,大大简化了配置过程。配置完成后,路由器本身获得自动翻墙能力,所有连入该路由的设备都可无障碍访问被墙的站点。是运行于路由器的透明代理。

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

顺便吐槽一下OP/LEDE的包名,这也是各种Linux Distribution的通病了吧,OpenWrt里的ip,到了LEDE里弄成俩:ip-tiny和ip-full,ca-certificates也变成俩,多出来一个ca-bundle,真是日了狗了,搞这篇文章时候被这俩不同系统的不同之处弄得抓狂。

方案简介
一、安装

适用于 openwrt-shadowsocks 3.0.1及以上版本,搭配 luci-app-shadowsocks 1.6.0及后续版本。

所需软件列表
如果所用网络环境直连sourceforge.net和downloads.openwrt.org/downloads.lede-project.org没有问题的话,可以直接使用作者提供的软件源安装及更新SHADOWSOCKS

如果直连遇到困难(无法连接或者过程中下载总是中断),请继续下面的步骤来安装。实测国内许多ISP,执行 opkg update 和 opkg install 下载安装的时候都可能会遇到卡住、中断的情况,请多试几次。如果尝试多次仍然失败,请参考下面的依赖列表,手动至官方下载站点手工下载。

依赖包要装全!依赖包要装全!依赖包要装全!重要的事情说三遍!遇到安装问题请参考下列以来列表,看自己装全了没有!

依赖列表
安装过程中如果出现错误提示无法解决,可以留言。LEDE已发布正式版,建议从OpenWrt更新至LEDE。本篇文章将逐步放弃更新OpenWrt的步骤,最终将只描述LEDE上的步骤。

OpenWRT CC 15.05.1 及更早版本安装步骤
LEDE 安装步骤
二、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:

I. China-List强制直连 自定义域名强制直连
II. GFWList强制走代理 自定义域名强制走代理
四、其他

一些强烈推荐的额外设置项(涉及到更新、维护)可以参考:《Shadowsocks for OpenWRT / LEDE 拾遗》

1,578 条评论

  1. cici 回复

    楼主的教程还需要像之前那篇用到dnsmasq-full吗?按照这篇教程的步骤shadowsocks一直启动不了

    1. cokebar 文章作者 回复

      我之前那篇也没用到啊。这个方式没用到dnsmasq的ipset功能,不用装那个。 启动不了可以直接手动执行ss-redir -c /etc/shadowsocks/config.json看看自己配置文件到底写对了没 如果有误 通常会有异常输出出现

    2. aa65535 回复

      需要保证 luci 界面里必要的信息都填写完整了。
      有的 input 留空时会有一个提示用的 placeholder ,但是那个不是实际值,还是需要填写的。

      1. cokebar 文章作者 回复

        现在这种灰色容易误导人。。luci其他地方 灰色就代表默认值 可以不填

        1. aa65535

          下个版本会解决这个问题。

        2. cici

          还真是被这个灰色的值误导了。感谢

  2. saiwei 回复

    谢了,参考你的文档,Shadowsocks 已配置成功

  3. Halry 回复

    如果我在内网用windows搭建了个ss客户端,监听的是0.0.0.0,现在想把要翻墙的流量转发到那个客户端上面怎么弄?ss客户端在192.168.1.100上,想把全家的要翻墙的流量转到那上面,怎么弄?

    1. cokebar 文章作者 回复

      windows客户端用的是ss-local,除过作为ss的客户端,也是一个socks5代理服务端。首先确保192.168.1.100的PC上防火墙允许ss客户端的所有进站出站流量。然后就看你的需求了,看你只是需要浏览器翻墙还是需要全局翻墙(支持除浏览器外其他程序)。
      假设你ss客户端本地端口是1080,那么,浏览器翻墙的话,和客户端所在PC一样,在Chrome安装SwithySharp(Firefox安装AutoProxy)。配置代理方式为socks5,服务器IP为192.168.1.100,端口1080即可。如果想全局,那么,推荐用Proxifier PE,下载后在各个机子里面安装,先添加proxy,IP为192.168.1.1,端口1080,然后添加proxy rules,可以制定Default走ss,就是全局了,也可以手动指定哪些程序走ss,手动输入exe文件名即可。同时注意,192.168.1.100那台机子如果也想用Proxifier,那么需要多添加一条规则,将ss客户端添加进去,指定为Direct不走代理,要不就死循环了。

      1. Halry 回复

        我是想在openwrt上面进行转发,想用pac文件或者gfwlist来做个规则,不想在chrome上面再进行配置,也不想配置全局。
        在路由器上面配置ss怕不稳定,导致路由宕机。由于我高三党,一个星期才回那几个小时家,路由宕机了父母也不会修。。。

        1. cokebar 文章作者

          1、chrome插件就是gfwlist方案,如果不想用Chrome,其他webkit内核的浏览器也行,大部分国产浏览器的极速模式都支持。
          2、LAN特定IP全局转发至LAN特定IP,iptables可以做到,不过一旦192.168.1.100的PC下线,其他设备全部断网,至少是断国外,额外的操作是重启路由器防火墙,操作更加繁琐,一旦操作失误可能直接无法连接路由器,必须fail-safe
          3、这种转发需要ss-redir,如果按你的来,需要自行编译windows版本的ss-redir
          3、shadowsocks是socks代理,协议层的东西,只能做到IP层面的转发;gfwlist是应用层,涉及到http(s),shadowsocks做不到。目前虽也有gfwlist的方案,但那是通过dnsmasq将gfwlist中涉及的域名转化成IP后在处理,本质上还是按IP转发。
          4、稳定性问题,除非有bug,否则运行是很稳定的;遇到问题重启基本也能解决。而如果是代理服务器连接不上,那ss装哪里都一样;而且性能消耗很大程度也落在了转发上面,chnroute是很长的,iptables规则数量很多,越多负载越高;
          5、如果shadowsocks进程挂掉,基本只是国外网站挂掉。可开启openwrt的wan口ssh,用手机的ssh客户端可远程解决

        2. Halry

          首先谢谢你的回复,那么长,呵呵。。
          我仔细想了想,也对,这是不可行的,恩恩。
          你说做软路由我也不敢,自己已经有3部pc了(服务器,自己的,下载机),再装会被骂死。看来也只好在路由器上面装了。
          想问下chinadns能提供防污染吗(防止运营商劫持)。
          还有就是你觉得ar9344+128mb的内存够用吗,路由器是wndr4300。最近预算较为充足,需要换一部吗。
          有适用于openwrt的watchdog吗。卡死了自动reboot那种。
          题外话:我那部服务器还有什么用,4核xeon+8g当nas太浪费了。。。。现在连DNS都不用它解析了。。。

        3. ssw

          请问哪里有下载openwrt的适配4530R的固件?

        4. cokebar 文章作者

          实在不想用路由器运行ss的话,可以考虑用一台PC做软路由

    2. cokebar 文章作者 回复

      只要你ISP不封公共DNS,就能解决运营商DNS劫持,ChinaDNS默认国内用的114DNS,目前算是国内最好的公共DNS了(不考虑GFW的DNS污染); 如果不能用114,只要运营商没给你加广告啥的(应用层劫持了,成本挺高的),用着也无所谓,反正国内网嘛(他给你加广告你就打电话投诉)。。其他一些国内公众DNS也有,你可以去找。
      wndr4300是目前最火的型号之一,配置绝对够用了,OpenWRT官方适配了的型号里算是高配了。我现在用的 GL-iNet,5V供电的小路由,64MB内存,8MB ROM,空闲内存长期7成以上。

      1. Halry 回复

        好的,已经决定了。在router上装ss和chinadns。
        dns污染已经想到办法了,server继续做dns解析器就可,就能防污染了。
        server上面弄个虚拟机装个CentOS,做个小小的dmz就能当墙内的ss的server了。
        谢谢解答呀,让我瞬间开朗了:)
        对了,在搬瓦工的vps里面怎么优化一下ss,搬瓦工的openvz没有hybla。。。。用的是centos 6

      2. myliyifei 回复

        wdr4300性能是足够了。百兆带宽略有不足。

  4. fan of u 回复

    首先感谢文章与付出,能否再详细点,简单点呢?从路由器说起,步骤环扣,相信会造福千百万小白!

    1. cokebar 文章作者 回复

      OpenWRT要从零说起我写五六篇文都不一定能讲完啊。。

  5. cici 回复

    我用方案一的自己VPS搭建的DNS服务器访问网站慢得可耻,换回方案二就好了,不知什么原因

  6. Halry 回复

    发现一个问题,装了那两个luci-app后还是用不了呀,没有图形界面,我的luci是英文的,关事吗

    1. cokebar 文章作者 回复

      装luci-i18n-chinese调到中文试试,应该不会。难道不兼容?

    2. aa65535 回复

      luci-app 有 i18n ,默认就是英文的,不显示界面应该是因为你的 chinadns 和 shadowsocks 不是最新版本,/etc/config 下面没有对应的配置文件。

      1. Halry 回复

        可以了,谢谢。果然是我的问题

  7. bilibili 回复

    发现作者好耐心,有些很小白的问题都一一回答了,点赞。。。
    另外上次折腾你这个发现某个奇葩的问题,两个vps上一样的系统ss一样的配置,发现某个vps居然死活无法转发dns。。。坑死了

    1. cokebar 文章作者 回复

      服务端启动时候加-u

  8. ssw 回复

    请问你有4530r的包不?我对linux不是非常熟悉。所以想简化下配置。直接刷入你整合好的固件。

    如可以请邮件给我下固件,地址如下
    sangsw@gmail.com

    1. cokebar 文章作者 回复

      整合这个的固件目前是没有的,至少现在不会有人去做,aa65535最近更新也很频繁,功能也是不断增加,易用性不断增强。你只能从刷官方OpenWRT开始,手动安装。这个版本已经方便多了,也就是几个包的安装用了SSH,其他都是图形化配置了,已经没啥难度了。之前的可是全程SSH,还要改配置文件、启动脚本

        1. cokebar 文章作者

          感谢 不过我这里联通测试 不爬墙连不了sourceforge.. 对于首次装的童鞋还是要换下载源。
          如果ss能发到openwrt官方就爽了

        2. nobody

          我已经把openwrt_dist_install.sh从你的网站上下载到我的电脑上了,然后用MINIHTTP加载,
          在OPENWRT里 wget -O- xxx |sh也不行吗?

          如果我用winscp上传到路由器,再sh ./openwrt_dist_install.sh ,就可以了吗?

        3. aa65535

          直接在路由上执行上面两条命令就行了。

    2. Halry 回复

      用别人的整合包不怕吗,里面整合个backdoor什么的。。。就哈哈哈了。

      1. ssw 回复

        请问哪里有下载openwrt的适配4530R的固件?

  9. Mingdong 回复

    谢谢这么详细的指南
    按照方案三设置好以后可以打开google无误,不过打开脸谱和推特甚至youtube都会超时,nslookup观察返回的dns仍然是污染过的。路由器内chinadns正常运行。
    另外,我按照方案二设置不成功,墙内地址正常墙外地址全部超时
    请问这是大概从哪里开始排查呢,麻烦了

    1. Mingdong 回复

      本地缓存和hosts都清空过

    2. cokebar 文章作者 回复

      windows自带那个nslookup不大靠谱,按照这篇装个dig,用dig排查:http://cokebar.info/archives/402

    3. cokebar 文章作者 回复

      方案二不成功基本是服务端不支持UDP转发造成的。你可以用手机客户端试试,开UPD转发如果造成无法联网就是不支持UDP转发

    4. cokebar 文章作者 回复

      用dig排查,一级一级来,先检查dnsmasq这一级:
      dig @192.168.1.1 www.youtube.com
      然后再看ChinaDNS这一层:
      dig @192.168.1.1 -p 5353 www.youtube.com
      还有就是,测试前要重启dnsmasq或者重启路由器,路由器DNS服务也有缓存的:
      /etc/init.d/dnsmasq restart

      1. Mingdong 回复

        果然dig的结果完全正常,是我自己太蠢没有修改本地网卡dns,改成自动获取就完全ok了,感谢耐心的指导

  10. ssw 回复

    请问作者,在使用方案2的情况下,日本的ip的vps,怎么才能访问https://plus.google.com/u/0/?tab=mX 这种类型的网站呢?是哪里解析出现问题导致的?

    1. cokebar 文章作者 回复

      按照这篇装个dig,用dig排查:http://cokebar.info/archives/402

    2. cokebar 文章作者 回复

      我是Linode东京,解析结果如下,你可以对比:
      ;; ANSWER SECTION:
      plus.google.com. 16813 IN A 173.194.117.165
      plus.google.com. 16813 IN A 173.194.117.164
      plus.google.com. 16813 IN A 173.194.117.162
      plus.google.com. 16813 IN A 173.194.117.166
      plus.google.com. 16813 IN A 173.194.117.160
      plus.google.com. 16813 IN A 173.194.117.174
      plus.google.com. 16813 IN A 173.194.117.169
      plus.google.com. 16813 IN A 173.194.117.168
      plus.google.com. 16813 IN A 173.194.117.167
      plus.google.com. 16813 IN A 173.194.117.161
      plus.google.com. 16813 IN A 173.194.117.163

      1. ssw 回复

        我现在的发现我使用了方案2,并且升级了chnroute,但是我发现我baidu的ip显示出来的居然是vps的地址,我感觉我打开所有的网站都是通过vps的。所以我想请问就这个问题,通常是哪里出现了问题。

        1. cokebar 文章作者

          是不是升级chnroute出错,你查看下/etc下面的chnroute.txt文件内容 应该很长

        2. ssw

          的确非常长,应该是升级完毕的。毕竟我是看见它跑完100%的。

        3. ssw

          估计是百度解析出来的是国外ip导致的。。我发现有些国内网站是正常的解析。

        4. ssw

          我现在恢复正常了。但是发现4530的路由的SS进程会无故停止,刚刚已经发现2次无法上网,回头一看ss的进程not running。。有解不?

    3. cokebar 文章作者 回复

      你OpenWRT啥版本的 我这里小路由运行也挺稳定的啊 没出现意外退出
      这情况只能写个计划任务脚本,定期检查ss-redir进程是否运行,如果没有就重新运行

      1. ssw 回复

        Firmware Version OpenWrt Barrier Breaker 14.07 / LuCI Trunk (0.12+svn-r10530)
        Kernel Version 3.10.49

        希望这个问题能解决吧。顺便问下。我能和你合租Linode东京的服务器不?我自己的优点慢。个人的。

        1. cokebar 文章作者

          这一期人够了 承诺了不再加人了 我是一季度一周期收费,下次在年底

      2. ssw 回复

        cokebar:

        我发现在Firmware Version OpenWrt Barrier Breaker 14.07 / LuCI Trunk (0.12+svn-r10530)
        Kernel Version 3.10.49
        的情况下,一旦安装了libopenssl之后,重启就发现ppoe无法建立连接的情况了。能有什么好的解决方法?换libpolarssl?

        1. cokebar 文章作者

          额好蛋疼 你试试吧 好迷的情况

        2. ssw

          我发现无论安装了那个ssl之后,我的ppoe都不起作用了。有什么命令可以查看ppoe的进程是否工作?
          我想找到ppoe不工作的原因。
          并且mac系统ssh登录的时候提示认证错误。有没有什么好的方法?比如导入公钥之类的。有教程不?

        3. ssw

          今天重新安装了factory的版本,ssl又没有问题了.现在看起来一切都正常了..
          谢谢你了啊

发表评论

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

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