正向翻墙科技备忘录 – 飞羽博客 三种shadowsocks在openwrt上的自动翻墙方案

飞羽博客的shadowsocks的详细教程,如果回国了,估计得买vps了,人肉备份如下

本站发布的三种shadowsocks在openwrt上的自动翻墙方案:

1、Shadowsocks + ChnRoute 实现 OpenWRT 路由器自动翻墙
2、Shadowsocks + Redsocks 实现 OpenWRT 路由器自动翻墙
3、Shadowsocks + GfwList 实现 OpenWRT 路由器自动翻墙

这篇文章介绍的方法基于aa65535的shadowsocks-spec for openwrt,介绍了如何在OpenWRT下配置自动翻墙,新版本支持在Luci下图形化配置,大大简化了配置过程。配置完成后,路由器本身获得自动翻 墙能力,所有连入该路由的设备都可无障碍访问被墙的站点。是运行于路由器的透明代理。

方案根据IP判断是否代理,国内IP不代理,国外IP走代理。代理通过shadowsocks所带ss-redir做TCP转发实现,分国内外IP 通过国内IP段列表文件chnroute来区别,并通过iptables规则分别处理(这些功能已经全部集成到shadowsocks-spec里了无需 额外配置)。由于是基于IP的判定,故需要解决DNS污染的问题,故搭配使用ChinaDNS来解决。

由于只要国外IP均走代理,而不是被墙才走代理,那么本方案的优缺点也就很明显了。

优点:基本不会有漏网之鱼,保证所有被墙站点能访问;能够一定程度改善国内访问一些国外网站缓慢的问题,如果你的服务器速度很好,那么甚至可以起到加速国外站点访问的作用。

缺点:如果服务器速度一般,访问一些网站甚至会减速;对一些限制IP的站点和软件应用可能会造成麻烦。总之,请酌情选择。

写在前面:由于近期2.2.3版本,aa65535调整了软件的配 置文件安排,导致多处配置改变,从2.2.3之前版本升级以及安装2.2.3版本的用户请多加注意两个版本的不同,避免遇到错误。升级到2.2.3的用户 升级shadowsocks-libev-spec版本的同时一定不要忘记升级luci-app-shadowsock-spec和luci-app- chinadns。由于此次更新出现多处前后版本不同,故暂时保留了新老版本两种截图并且配置(如端口号)可能有区别,请自行注意保持前后一致。

一、shadowsocks 安装

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

opkg update

shadowsocks有openssl(文件名是shadowsocks-libev-spec-X.XX.ipk)和polarssl(文件名是 shadowsocks-libev-spec-polarssl-X.XX.ipk)两个版本选择,ROM空间吃紧的就选择后者吧。

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

opkg install ip ipset libopenssl iptables-mod-tproxy

先安装必要的包,如果要用polarssl版本的shadowsocks(polarssl体积更小):

opkg install ip ipset libpolarssl iptables-mod-tproxy

期间可能会遇到类似以下的错误提示:

kmod: failed to insert /lib/modules/3.10.44/ip_set.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ip.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ipmac.ko
...

没关系,这时因为安装ipset包后需要重启,我们此时先重启一次路由器。

注:部分ISP访问download.openwrt.org可能会非常缓慢甚至下载失败,此时需要自行在PC上下载上面的依赖包以后自行上传至路由器目录手动安装。你可能还需额外下载如下的依赖包:

kmod-nfnetlink kmod-ipt-ipset kmod-ipt-tproxy libmnl libpthread

然后下载shadowsocks-libev-spec, ChinaDNS, luci-app-shadowsocks, luci-app-chinadns四个包,前两个ipk包需要根据自己CPU型号选择:

http://openwrt-dist.sourceforge.net/releases/

 

接着将下载的包通过WinSCP之类的工具上传至路由器的/tmp目录。

接着安装shadowsocks和chinadns,一步步执行:

cd /tmp
opkg install shadowsocks-libev-spec_x.x.x-x_ar71xx.ipk
opkg install ChinaDNS_x.x.x-x_ar71xx.ipk
opkg install luci-app-chinadns_x.x.x-x_all.ipk
opkg install luci-app-shadowsocks-spec_x.x.x-x_all.ipk

2.2.3版本用户新步骤:2.2.3需要自行下载忽略列表文件,该命令将文件下载至/etc/ignore.list:

wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/ignore.list

升级到2.2.3版本的用户注意,以前忽略列表的位置默认放在/etc /shadowsocks/ignore.list,然而新版本中并不包含这个文件,升级后建议删除原有文件并执行上面的命令重新下载该文件。需要注意, 本文新版本截图中统一放至/etc/ignore.list,和之前版本位置不同。这个位置在etc目录下可以按自己喜好放置,但要保证在 shadowsocks和chinadns的luci配置界面中正确填写文件位置否则无法启动。

安装完成后,shadowsocks和chinadns应该会被配置成开机启动(可以在luci的启动项页面中查看状态),如果发现没有生效,运行:

/etc/init.d/shadowsocks enable
/etc/init.d/chinadns enable
二、shadowsocks 配置

我们登陆Luci,指向“服务”,此时应该能够看到shadowsocks和chinadns了。

点击shadowsocks,取消勾选“使用配置文件”,新的选项就出来了,我们把服务器信息填进去,代理方式选择“忽略列表”,然后保存并应用(选项不要留空)。服务器地址请尽量填入IP,否则容易出问题! 全部完成后,刷新页面,确保shadowsocks是已启动状态,否则请检查配置。(左图为老版本图,右图为新版本luci-app)新版本请填写忽略列表文件完整路径

shadowsocks settingsss new 1

 

(2.2.3新)下图配置UDP中继,打开后开启TCP+UDP协议的透明代理,禁用后仅开启TCP协议的透明代理。想用shadowsocks代 理玩外服游戏的可能用得到。顺带说一下不少ISP环境下,代理的UDP连接远不如TCP稳定。而且shadowsocks的超时机制断开连接可能导致你闲 置时候掉线,所以不大建议用ss做代理玩外服游戏,还是加速器或者VPN好些。最后一个自定义的功能可以为UDP中继配置一个不同的服务器地址,具体作用 和用法不在本篇范围内讨论。

udp-relay

 

然后看一下ChinaDNS的配置界面,此时可以先按照默认的配置来,确保ChinaDNS可以正常启动,也可以参考下面(右侧是新版luci-app-chinadns界面),:

chinadns new

做出说明:

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和等待时间将禁用(因为用不到了)。

然后,在Luci中切换至“网络”-“DHCP/DNS”设置,如下图,在”DNS转发”中填入127.0.0.1#35353

dnsmasq

其中,35353是ChinaDNS的端口,如果你在之前设置界面里端口号不是35353,这里记得和前面保持一致。

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

4

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

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

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

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

4、对于一些UDP方式被干扰或屏蔽的情况,可以使用:TCP 方式查询解决 DNS 污染问题

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

方案一

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

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

114.114.114.114,3.4.5.6:5050;有些ISP使用114DNS可能效果不佳,此时可以将114DNS换成本地ISP的;勾选“启用压缩指针”;国内路由表填写之前下载下来的ignore.list的完整路径:

chinadns1

最后,确保shadowsocks的设置页面里面的UDP转发是关闭状态。

2

最后确认shadowsocks和chinadns都显示已启动后,就可以测试一下了~

方案二

使用shadowsocks代理DNS请求。首先开启shadowsocks的DNS转发,并确保端口号不和ChinaDNS的一样,比如说我们改成5151;转发地址留默认的GoogleDNS即可,你也可以自行更改,格式是“IP:端口”。

5

然后配置ChinaDNS的上游DNS服务器为: 114.114.114.114,127.0.0.1:5151;有些ISP使用114DNS可能效果不佳,此时可以将114DNS换成本地ISP的;勾 选“启用压缩指针”;国内路由表填写之前下载下来的ignore.list的完整路径:

chinadns2

保存并应用,确认shadowsocks和chinadns都显示已启动后,Enjoy~

方案三

首先确保shadowsocks配置页面的UDP转发关闭;并且确保你可以正常使用国外公共DNS服务。

切换至ChinaDNS界面,填入上游服务器地址,如:114.114.114.114,8.8.8.8

勾选“启用压缩指针”:

chinadns3

双向过滤可以打开;有些ISP使用114DNS可能效果不佳,此时可以将114DNS换成本地ISP的。

确认shadowsocks和chinadns都显示已启动后,Enjoy~;

注:长城宽带由于ISP劫持Google DNS,不支持此方案。

由于ChinaDNS机制的缺点,可能存在部分站点的误判,如国内站点却使用国外DNS结果解析到国外IP,再比如国内DNS劫持 到国内IP时候也可能造成无法正确解析(压缩指针打开时)。如果你发现按照上面的配置后依然有污染或者有国内网站走代理的情况,请参考这篇配置:《OpenWRT 自动翻墙路由器 DNS 解析的改善》


所有的步骤完成后,可以尝试一些额外的步骤,比如:

使用作者提供的源来更加方便地更新shadowsocks和chinadns

定时检测代理状态遇到异常自动重启

具体参考此篇文章:《Shadowsocks for OpenWRT 拾遗》

PS1:ignore.list的定期更新以匹配最新IP段分配,长时间不更新可能导致部分国内IP走代理或者国外不走代理,可以使用下面的命令,注意将最后的/etc/ignore.list替换成你想保存的位置,注意和shadowsocks和ChinaDNS的忽略列表保持一致:

wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/ignore.list

PS2:如遇到别的被墙站点没问题但YouTube, Facebook, Twitter打不开,应该是DNS污染造成,请用dig命令排查。

PS3:有些ISP会禁用外部DNS,只能用ISP的,此时不要使用114DNS等公共DNS而要使用ISP的DNS;有些ISP做了DNS劫持,可能会导致指针压缩失效;有些ISP封杀国外UDP端口,会造成三种方案全部失效,请考虑TCP方式。

PS4:发现dnsmasq有时候会占用5353等非标端口,导致ChinaDNS无法启动,这种情况可以将ChinaDNS的端口改成10000-65535的高端口来规避,取多少随意,比如35353

 

本方案在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命令安装):

opkg update

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

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

opkg install libpolarssl

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

opkg install libopenssl

然后需要根据自己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/

最后当然是安装了

cd /tmp
opkg install shadowsocks-libev_x.x.x-x_ar71xx.ipk
opkg install ChinaDNS_x.x.x-x_ar71xx.ipk
opkg install luci-app-chinadns_x.x.x-x_all.ipk
opkg install redsocks2_x.x.x-x_ar71xx.ipk
opkg install luci-app-redsocks2_x.x.x-x_all.ipk

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

二、配置

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

{
      "server": "X.X.X.X",
      "server_port": "443",
      "password": "password",
      "local_port": "1080",
      "method": "rc4-md5"
}

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

/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks start

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的重复:

#!/bin/sh /etc/rc.common

START=95

SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
SERVICE_PID_FILE=/var/run/shadowsocks.pid
CONFIG=/etc/shadowsocks.json
DNS=8.8.8.8:53
TUNNEL_PORT=5151

start() {
	# Client Mode
	service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
	# Proxy Mode
	#service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
	# Tunnel
	service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l $TUNNEL_PORT -L $DNS
}

stop() {
	# Client Mode
	service_stop /usr/bin/ss-local
	# Proxy Mode
	#service_stop /usr/bin/ss-redir
	# Tunnel
	service_stop /usr/bin/ss-tunnel
}

然后配置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 污染问题

 

 

本方案依靠GFWList,List中的域名站点走代理,不再List中的域名不走代理,根据域名只能判断。然而其实本质上依然是根据IP判断是否 代理,列表内的IP走代理,列表外的直连;而这个IP列表我们可以通过dnsmasq-full来自动生成;dnsmasq-full可以将解析域名得到 的IP加到一个ipset中,利用这个ipset来判断走不走代理。实际是完成了gfwlist(域名列表)到dnsmasq的ipset规则再到IP地 址的转换。同样,本方案依然可以搭配ChinaDNS搭配使用,也可以使用ss-tunnel,或者是自己的DNS服务器。

本方案的优点明确,只有被墙的站点才走代理,但是gfwlist并不能100%涵盖被墙站点,而且有些国外站点直连速度远不如走代理,特别是你代理服务器速度较快,希望通过代理加速国外访问时,此方案就不是那么好用了。请酌情选择你所使用的方案。

一、安装

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

opkg update

shadowsocks有openssl(文件名是shadowsocks-libev-X.XX.ipk)和polarssl(文件名是shadowsocks-libev-polarssl-X.XX.ipk)两个版本选择,ROM空间吃紧的就选择后者吧。

下载链接如下,请根据自己CPU型号选取相应版本:

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

先安装必要的包,如果要用polarssl版本的shadowsocks(polarssl体积更小):

opkg install iptables-mod-nat-extra ipset libpolarssl

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

opkg install iptables-mod-nat-extra ipset libopenssl

期间可能遇到如下错误提示:

kmod: failed to insert /lib/modules/3.10.44/ip_set.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ip.ko
kmod: failed to insert /lib/modules/3.10.44/ip_set_bitmap_ipmac.ko
...

没关系这是因为安装的包需要重启系统,我们做完剩下的步骤最后再重启。

然后卸载dnsmasq并安装dnsmasq-full以及剩下的包

opkg remove dnsmasq && opkg install dnsmasq-full
cd /tmp
opkg install shadowsocks-libev_x.x.x-x_ar71xx.ipk
二、配置

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

{
      "server": "X.X.X.X",
      "server_port": "443",
      "password": "password",
      "local_port": "1080",
      "method": "rc4-md5"
}

修改 /etc/init.d/shadowsocks ,其实就是把Client Mode注释掉再把Proxy Mode的注释去掉:

#!/bin/sh /etc/rc.common

START=95

SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
SERVICE_PID_FILE=/var/run/shadowsocks.pid
CONFIG=/etc/shadowsocks.json
DNS=8.8.8.8:53
TUNNEL_PORT=5353

start() {
	# Client Mode
	#service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
	# Proxy Mode
	service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
	# Tunnel
	#service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l $TUNNEL_PORT -L $DNS
}

stop() {
	# Client Mode
	#service_stop /usr/bin/ss-local
	# Proxy Mode
	service_stop /usr/bin/ss-redir
	# Tunnel
	#service_stop /usr/bin/ss-tunnel
}

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

/etc/init.d/shadowsocks enable
/etc/init.d/shadowsocks start

2、配置dnsmasq和ipset

将如下规则加入自定义防火墙规则中(最后的1080是shadowsocks的本地端口 酌情修改):

ipset -N gfwlist iphash
iptables -t nat -A PREROUTING -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080

上述第一条的作用可以让连入路由的设备走代理,第二条可以让路由器自身走代理。如果使用了第二条,需要手动将路由器联网的interface的DNS服务器手动设置为127.0.0.1。

修改 /etc/dnsmasq.conf ,在最后加入 confdir=/etc/dnsmasq.d ,新建并进入目录 /etc/dnsmasq.d ,下载 dnsmasq_list.conf 后放入该目录(这个列表本人每周更新一次)。

自动生成dnsmasq_list.conf 的脚本本人放在这里:https://github.com/cokebar/gfwlist2dnsmasq

你可能需要自行修改这个文件,格式如下:

#使用不受污染干扰的DNS解析该域名 可以将此IP改为自己使用的DNS服务器
server=/google.com/127.0.0.1#5353
#将解析出来的IP保存到名为gfwlist的ipset表中
ipset=/google.com/gfwlist

下面详细说一下DNS的方案,有三种:

方案一:

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

比如说DNS服务器IP是:3.4.5.6,端口是5050,那么使用替换功能将 /etc/dnsmasq.d/dnsmasq_list.conf 里面的 127.0.0.1#5353 全部替换成 3.4.5.6#5050 即可。

最后重启路由器即可。

方案二:

使用ss-tunnel转发UDP的DNS请求,修改 /etc/init.d/shadowsocks 文件,如需修改上游DNS,请修改 DNS=8.8.8.8:53 字段,本地端口修改 TUNNEL_PORT=5353

#!/bin/sh /etc/rc.common

START=95

SERVICE_USE_PID=1
SERVICE_WRITE_PID=1
SERVICE_DAEMONIZE=1
SERVICE_PID_FILE=/var/run/shadowsocks.pid
CONFIG=/etc/shadowsocks.json
DNS=8.8.8.8:53
TUNNEL_PORT=5353

start() {
	# Client Mode
	#service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
	# Proxy Mode
	service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0 -f $SERVICE_PID_FILE
	# Tunnel
	service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -u -l $TUNNEL_PORT -L $DNS
}

stop() {
	# Client Mode
	#service_stop /usr/bin/ss-local
	# Proxy Mode
	service_stop /usr/bin/ss-redir
	# Tunnel
	service_stop /usr/bin/ss-tunnel
}

最后重启路由器即可。

方案三:

此方案使用ChinaDNS来做防DNS污染,先下载并安装相应的包:

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

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

opkg install ChinaDNS_x.x.x-x_ar71xx.ipk
opkg install luci-app-chinadns_x.x.x-x_all.ipk

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

安装完成后,进到luci,指向服务,点击ChinaDNS,填入上游服务器地址,可以保留默认的 114.114.114.114,8.8.4.4,确保本地端口是5353(也就是和dnsmasq_list.conf里面的 127.0.0.1#5353保持一致),勾选“启用压缩指针”,然后保存并应用。

method3

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

method3

最后重启路由器即可。对于特殊情况,如长宽用户无法使用方案一和方案二时(长宽用户不支持方案三),可以考虑换成TCP方式,参照《TCP 方式查询解决 DNS 污染问题

PS:默认只有连接路由的设备翻了墙,为了让路由器自身也能够翻墙(如使用路由器获取gfwlist更新dnsmasq_list.conf时候,gfwlist的URL是被墙站点,此时需要路由器自身也要翻墙)做出如下配置,先在自定义防火墙规则中额外加一条:

iptables -t nat -A OUTPUT -p tcp -m set --match-set gfwlist dst -j REDIRECT --to-port 1080

然后再WAN口配置中如图所示,将DNS手动指定为127.0.0.1:

ss222


参考文章:https://kyonli.com/p/18

ps 本文转贴时使用的regex: 为了贴出下面的代码,[ 换成 [ ] 换成]

<div id\=\"crayon-[^>]*>((?!data-settings="dblclick">)[\s\S])*data-settings="dblclick">(((?!<\/textarea>)[\s\S])*)((?!\/tbody)[\s\S])*\/tbody>\n<\/table>\n<\/div>\n<\/div>

"[code]\n"+_2+"\n[/code]"

正向翻墙科技备忘录 – 飞羽博客 三种shadowsocks在openwrt上的自动翻墙方案”的一个响应

留下评论