Shadowsocks + Redsocks 实现 OpenWRT 路由器自动科学上网 (停止更新)

写在前面: 由于使用本方案的人很少,因此不再更新!建议使用其他两种方案!

本站发布的三种shadowsocks在openwrt上的自动科学上网方案:

1、Shadowsocks + Chnroute 实现 OpenWRT / LEDE 路由器自动科学上网
2、Shadowsocks + Redsocks 实现 OpenWRT 路由器自动科学上网 (停止更新)
3、Shadowsocks + GfwList 实现 OpenWRT / LEDE  路由器自动科学上网

本方案在openwrt上运行ss-local(相当于 shadowsocks 客户端以及本地socks5服务端),然后利用 redsocks (相当于socks5客户端)可完成openwrt的自动科学上网。该方案同样使用aa65535提供的包,并且redsocks具有luci界面,方便开关和配置。

本方案适合那些不喜欢国外IP全走代理,而是被墙才走代理的人使用;redsocks2无需chnroute也无需gfwlist,采用自动判断机制,省心省力;但缺点也很明显,自动判断机制会先尝试连接站点,需要等待一个时间连接失败才会转到代理上,等待时间会让有些人难受;而且可能无法应对gfw的中间人攻击,对于非http/https的应用的自动判定可能支持也不太好。

此方案同样推荐搭配ChinaDNS使用,做防DNS污染以及解析优化。

一、安装

首次安装的话,先安装必要的包,确保路由器联网,先更新软件包列表(下载有问题的请手动到openwrt.org下载所有需要的包并上传到路由器上使用opkg install XXX.ipk命令安装):

shadowsocks有openssl和polarssl两个版本选择,ROM空间吃紧的就选择后者吧。

如果要用polarssl版本的shadowsocks(polarssl体积更小):

如果要用普通版本(openssl)的shadowsocks,那么(openssl兼容性更好):

然后需要根据自己CPU型号选择包,请选择不带spec的包:

shadowsocks-libev: http://sourceforge.net/projects/openwrt-dist/files/shadowsocks-libev/

chinadns-openwrt: http://sourceforge.net/projects/openwrt-dist/files/chinadns/

luci-app-chinadns: http://sourceforge.net/projects/openwrt-dist/files/luci-app/chinadns/

redsocks2: http://sourceforge.net/projects/openwrt-dist/files/redsocks2/

luci-app-redsocks2: http://sourceforge.net/projects/openwrt-dist/files/luci-app/redsocks2/

最后当然是安装了

特别提醒:2015.1.8,由于ChinaDNS-C更名为ChinaDNS,所以包名有变化,此前安装过ChinaDNS-C的,需要手动卸载并重新安装新版。

二、配置

1、配置/etc/shadowsocks.json,格式如下:

然后启动shadowsocks,并设置开机运行:

2、配置Redsocks2

此步骤可以在luci中完成,指向服务应该就可以看到redsocks2的配置了,保留默认即可,勾选启用,点击“保存并应用”生效。

redsocks2

3、配置DNS转发

先转到Luci中的DNS/DHCP设置中,配置转发DNS为127.0.0.1#5353:

dnsmasq dns forward

其中,5353是ChinaDNS的端口,如果你在之前设置界面里改了,这里记得别填错。

然后切到HOSTS和解析文件选项卡,勾中“忽略解析文件”

4

接着配置ChinaDNS,对配置的选项做出说明:

ChinaDNS参数说明

1、虚假IP列表:默认值:/etc/chinadns_iplist.txt

     是GFW常见的DNS污染用IP列表,解析出列表中的IP结果时候,ChinaDNS会自动抛弃,保留默认即可;

2、chnroute文件:默认值:/etc/chinadns_chnroute.txt

     此文件标识哪些IP属于国内。用于ChinaDNS判断解析结果。ChinaDNS要求解析结果与DNS要匹配,国内网站采用国内DNS解析的结果,国外网站采用国外DNS解析结果,等等规则;确保以上两个文件内容完整无误,否则会造成无法启动;

3、本地端口:默认值:5353

     ChinaDNS所监听的端口。根据实际情况更改,注意不能和其他服务的端口重复(特别是dnsmasq和shadowsocks);

4、上游服务器:默认值:114.114.114.114,8.8.8.8

     可填入一系列的上游DNS服务器,根据实际情况来,可以保留默认,注意逗号后面不能有空格。有些ISP会封杀公共DNS,此时请将114DNS改为ISP的DNS;此处必须至少填入一个国内IP的DNS和一个国外IP的DNS,否则会造成ChinaDNS启动失败。

4、等待时间: 默认值:0.3

     为防止GFW的DNS污染抢答,而设置一个等待时间,请根据自己填写的国外DNS延迟值来填写,留下一定的裕度。GoogleDNS在国内延迟一般在100-200ms,留0.3比较合适。过大的值会造成DNS解析较大的延迟时间,过小的值可能导致无法接收正确的解析结果。

5、双向过滤: 默认:勾选

     勾选时,当国外DNS服务器返回的查询结果是国内IP,或者当国内DNS服务器返回的查询结果是国外IP,则过滤掉这个结果(较为严格的模式);去掉勾选的话只是过滤国内DNS的国外IP结果。

6、启用压缩指针: 默认:不勾选

     利用GFW遇到压缩指针时的一个bug来精确识别来自GFW的抢答污染,从而极大提高识别的准确性和识别的效率,推荐启用,启用后,IPList和等待时间将禁用(因为用不到了)。

接下来的步骤会有区别,通过ChinaDNS进行防DNS污染及解析结果优化,方案有三:

1、对于shadowsocks是用自己服务器搭建的,推荐方案一,在自己服务器上搭建DNS服务;

2、如果没有这个条件,但服务器支持UDP转发(较新版本Shadowsocks均支持),那么案二

3、如果服务器Shadowsocks版本老,不支持UDP转发,那么可用方案三要求版本>=1.2.0

前两种方案,目前来说是绝对没有DNS污染现象的,此时ChinaDNS的作用完全就是为国外站点做解析优化,因为DNS查询由代理服务器转发,DNS查询的发起者相当于代理服务器,获得的解析结果都是就近于代理服务器的;而方案三则会直面DNS污染,此时ChinaDNS的防污染功能发挥作用,同时方案三无法做到国外网站解析结果优化,因为获得的IP是就近于你的位置的。

然而对于前两种方案,也可能存在一些问题(很少见):详见“Shadowoscks for OpenWRT 拾遗

方案一

在代理服务器上搭建DNS服务来解析国外网站,可用dnsmasq或者pdnsd,监听非53端口。

比如说服务器IP是:3.4.5.6,dns服务端口是5050,那么,把ChinaDNS的上游服务器更改为:

114.114.114.114,3.4.5.6:5050,等待时间改为0.1,其他酌情:

method1

最后,确保shadowsocks的设置页面里面的UDP转发是关闭状态。保存并应用,确认shadowsocks和chinadns都显示已启动后,就可以测试一下了~

方案二

使用ss-tunnel转发DNS请求。修改 /etc/init.d/shadowsocks ,加入ss-tunnel;如需修改上游DNS,请修改 DNS=8.8.8.8:53 字段,本地端口修改 TUNNEL_PORT=5151 ,注意不要和ChinaDNS的重复:

然后配置ChinaDNS的上游DNS服务器为: 114.114.114.114,127.0.0.1:5151,等待时间填0.1,其他酌情填写:

method2

保存并应用,Enjoy~

方案三

填入上游服务器地址,可以保留默认的114.114.114.114,8.8.4.4,勾选“启用压缩指针”,保存并应用即可:

method3

或者不勾选“启用压缩指针”,但要酌情填写延迟时间,默认0.3秒:

method3

方案三如果不好用可以考虑换成TCP方式:TCP 方式查询解决 DNS 污染问题

55 条评论

  1. 莫星超 回复

    我有ss三个里选哪个能让路由器翻墙

  2. 莫星超 回复

    怎么在路由器上用ss 小白真心求助

    1. 酱油 回复

      如果不会,根据你的你路由型号,直接去刷集成了SS的固件。

      1. 莫星超 回复

        不会编程的哭瞎 有攻略吗 912003771qq求加大神教我

        1. 酱油

          QQ N年不用呵呵,不过这个真不需要什么编程。只需要些简单的openwrt操作知识或两三个小软件,Google你的(路由型号)加openwrt 你会在山上找到你需要的。或你直接说说你路由型号,也许博主就是同样的型号哦,他的固件就能直接给你 )

    2. 莫星超 回复

      华为HG255d 可以否

      1. 射日 回复

        地址:http://goo.gl/SEzc2x
        刷日期为20141228那一个,还因为20141228才支持原厂Uboot。
        昨天又更新了一个,但不太熟悉更新了什么,所以还是1228那个保险点。
        也可以直接搜索里面的文件名到相关网站看一下固件介绍。
        刷机有风险,刷前请掌握好刷机万一失败如何恢复的技术:)

  3. shadow 回复

    请问怎么代理非dns类型的udp。还是有好多udp被墙了的,比如手机hangouts的拨打接听google voice

    1. cokebar 文章作者 回复

      拨打接听Google Voice 需要使用VPN

    2. cokebar 文章作者 回复

      新版shadowsocks的ss-redir模式支持了udp方式 你可以重新尝试一下 加上 -u参数即可

  4. 引用: 折腾╮(╯_╰)╭ | 红红火火红红火火哼哼哈嘿恍恍惚惚

  5. 引用: _(┐「ε:)_生命在于折腾╮(╯∀╰)╭ | 红红火火红红火火哼哼哈嘿恍恍惚惚

  6. Yun 回复

    大师你好,我的DIR-505路由是挂在出口路由后面做无线AP使用,按照你第二种方案配置了,但为什么接入这个AP的手机跟笔电还是不能透明代理呢?手动指向路由IP的话可以全局代理,DIR-505的DHCP是关闭的,下面所有终端所获取的IP都是由出口路由分配。

    1. cokebar 文章作者 回复

      不是网关无法NAT

  7. necrosakuya 回复

    跑完之后才发现原来有这个问题要注意的Orz.. 忘记了.

  8. 杂食 回复

    谢谢您写的文章,给我很大的启发,终于”几乎”搞好了.
    我的路由器是网件 4300,我现在的方案是 openWRT+dnsmasq+ipset+shadowsocks

    简单说,我建立了一个fuckgfw的列表,ex:
    #Twitter
    server=/.twitter.com/208.67.222.222#443
    ipset=/.twitter.com/fuckgfw
    ,
    然后router启动时候建立一个 ipset,name = fuckgfw.
    ipset -N fuckgfw iphash
    然后指定ipset里面的domain name 走 1080端口.
    iptables -t nat -A PREROUTING -p tcp -m set –match-set fuckgfw dst -j REDIRECT –to-port 1080

    1080端口是shadowsocks, 效果不错,现在facebook, twitter,youtube都可以打开.
    就是google.com打不开.

    但是如果我在笔记本上打开全局的shadowsocks 客户端,google也可以打开.

    看着好像是dns污染,但是我用nslookup得到的地址,直接用地址(74.125.20.138)访问也打开不了.

    Documents>nslookup google.com 209.244.0.3
    Server: 209.244.0.3
    Address: 209.244.0.3#53

    Non-authoritative answer:
    Name: google.com
    Address: 74.125.20.100
    Name: google.com
    Address: 74.125.20.102
    Name: google.com
    Address: 74.125.20.139
    Name: google.com
    Address: 74.125.20.138
    Name: google.com
    Address: 74.125.20.113
    Name: google.com
    Address: 74.125.20.101

    我在router上手工把地址加到 ipset里面,也还不行.

    这种情况大概什么原因? 如何解决呢? 非常感谢!

    必须再装chinadns吗?

    1. cokebar 文章作者 回复

      你这方法就是我的这篇GFWLIST方案啊:https://cokebar.info/archives/962
      一个站点引用的资源非常多,像是google,就有google.com, gstatic.com, googleusercontent.com,1e100.net等等,你需要将这些都添加进去,而且google还有一些特殊的比如说google.com.hk,google.co.jp这些你一条ipset=/google.com/fuckgfw是不够的
      参照我的GFWLIST方案,里面有从gfwlist转化过来的dnsmasq的ipset列表

  9. 杂食 回复

    收到,谢谢! 我实验完告诉你结果啊, 没想到这么快就回复了.

  10. leo 回复

    你好博主,我在小米迷你路由刷入了潘多拉,SS+Redsocks2+chinaDns设置好后,PC可以科学上网,但是同局域网的手机和平板都不行,一直找不到解决办法,请博主指点一二,谢谢

发表回复

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

请输入验证码 *