上次在 r6300v2 上成功安装了 entware,后来我又成功的格式化好了 jffs ,终于可以利用到路由器本身的64MB 空间,优点是比 U 盘稳定很多,还可以省下一个 USB 口接打印机。当然缺点就是空间小,不过装个 shadowsocks 还是戳戳有余。
jffs 上安装 entware 的步骤和在 U 盘上差不多,只是路径不同,简单写一下。
root@unknown:/tmp/home/root# cd /jffs
root@unknown:/jffs# mkdir opt
root@unknown:/jffs# cd ../
root@unknown:/# mount -o bind /jffs/opt /opt
root@unknown:/# cd /opt
root@unknown:/# wget -O - http://qnapware.zyxmon.org/binaries-armv7/installer/entware_install_arm.sh | sh
安装好的信息是一样的,就不贴图了。
下面开始安装 shadowsocks。
entware 的源里有 shadowsocks-libev_2.2.1-1_armv7soft.ipk,然后 shadowsocks 的官方 github 也有提供 2.2.2-1 下载(貌似更新到 2.2.3 了,我暂时没更新),但是具网上搜索了解到的情况,这两个版本都有 bug,我使用的是 HOUZI 自己编译的 2.2.2-1 版本,本文也是根据他的教程而来。原文在这里,你在其他地方看到的基本都是原文 6 月份第一个版本的盗链: http://www.router008.com/Tomato-ShadowSocsk.html,原文有更新,文章末尾有 ipk 和所有用到的脚本的下载。我这里就不提供了。当然本文也加上了我自己遇到的问题。
1. 将下载的 shadowsocks-libev_2.2.2-1_armv7soft.ipk 上传到 /opt,安装
root@unknown:/# opkg install shadowsocks-libev_2.2.2-1_armv7soft.ipk
2. 编辑 /opt/etc/shadowsocks.json
{
"server":"server_ip",
"server_port":server-port,
"local_address":"0.0.0.0",
"local_port":1080,
"password":"password",
"timeout":60,
"method":"aes-256-cfb"
}
这里注意,server 是填写你的 ss 服务器的 IP;server_port 填写你的 ss 服务器端口; local_address 保持 0.0.0.0 不变; local_port 是路由器的端口,默认 1080 就行了;password 是服务器密码;method 是服务器的加密方式。
3. 配置好json文件后,
root@unknown:/# /jffs/opt/etc/init.d/S22shadowsocks start
Starting ss-local... done.
说明 shadowsocks 本地代理启动了,可以用 Chrome 浏览器加上 SwitchyOmega 插件测试。
4. 由于重启路由器后,刚才 /opt 的挂载会失效,所以我们要把这句命令加到启动init里。到“系统管理”-“脚本”-“初始化”里输入
mount -o bind /jffs/opt /opt
下面开始配置 ss-redir 透明代理
5. 编辑 /opt/etc/init.d/S22shadowsocks
找到
PROCS=ss-local
改成
PROCS=ss-redir
保存,输入命令
root@unknown:/# /jffs/opt/etc/init.d/S22shadowsocks restart
Starting ss-redir... done.
看到done就说明透明代理启动成功。
6. 配置 UDP 转发(可选,如果你的服务器不支持的话,不需要这一步)
ss-tunnel init启动脚本
新建 /opt/etc/init.d/S23ss-tunnel
#!/bin/sh
ENABLED=yes
PROCS=ss-tunnel
ARGS="-c /opt/etc/shadowsocks.json -b 0.0.0.0 -l 5300 -L 8.8.8.8:53 -u"
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /opt/etc/init.d/rc.func
保存,记得加上权限,以后不再特别说明权限
root@unknown:/# chmod 755 S23ss-tunnel -R
7. ss-redir、ss-tunnel开机启动脚本
新建 /jffs/run.sh
#!/bin/sh
# Copyright (C) 2015 OpenWrt.org
/opt/etc/init.d/S22shadowsocks start
# 如果你的服务器支持 UDP 的话,去掉注释
#/opt/etc/init.d/S23ss-tunnel start
同样把 run.sh 加到初始化里。
8. 配置 dnsmasq 配合 UDP 转发和 DNS 解析(二选一)
这里也是看你的服务器是否支持 UDP 转发,不支持就选方案 A,支持就选方案 B,我选的是 B。
注意!
配置前先把 gfwlist.conf (原文有下载)
文件放入 /jffs/dnsmasq.d
文件夹中(新建一个)
,该步骤配置完后就不能连接网络,直到把以下的步骤配置完成后重启就会正常!
高级设置 - DHCP/DNS-DHCP / DNS 服务器 (LAN) - Dnsmasq 框里输入
no-poll #轮训dns解析
no-resolv #不使用/etc/resolv.conf来进行上游dns服务器解析
all-servers #查询最快的DNS解析(根据自己的情况进行配置)
server=127.0.0.1#5353 #chinaDNS本地监控端口
conf-dir=/jffs/dnsmasq.d #用来自定义某些网站的DNS解析
根据原文作者最新更新的步骤,在最后一步需要联网下载 chnroutes,所以这个这个第八步才是最后一步。
9. ChinaDNS 防污染
配置 ChinaDNS init 脚本
9.1.下载原文后面提供的 chinadns for arm.zip
9.2.解压出来后把 chinadns 目录放到 /jffs ,再把 /bin 文件夹下的 chinadns 文件移动到 /opt/bin 或者 /jffs/opt/bin 目录(就是entware源的安装目录)
9.3.再赋予 /opt/bin 下 chinadns 可执行权限
方案 A.不开启UDP转发 ChinaDNS init 脚本:
/jffs/opt/etc/init.d/S24chinadns
#!/bin/sh
ENABLED=yes
PROCS=chinadns
ARGS="-b 127.0.0.1 -p 5353 -c /jffs/chinadns/share/chnroute.txt -s 114.114.114.114,208.67.222.222:443,8.8.8.8"
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /opt/etc/init.d/rc.func
B.开启UDP转发 ChinaDNS init 脚本(推荐,需要服务器支持):
/jffs/opt/etc/init.d/S24chinadns
#!/bin/sh
ENABLED=yes
PROCS=chinadns
ARGS="-b 127.0.0.1 -p 5353 -c /jffs/chinadns/share/chnroute.txt -s 114.114.114.114,127.0.0.1:5300"
PREARGS=""
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /opt/etc/init.d/rc.func
S24chinadns加入run.sh开机自启动脚本
接步骤.7的ss-redir、ss-tunnel开机启动脚本
#!/bin/sh
# Copyright (C) 2015 OpenWrt.org
/opt/etc/init.d/S22shadowsocks start
#/opt/etc/init.d/S23ss-tunnel start #UDP转发启用
/opt/etc/init.d/S24chinadns start
注意,方案A和B的区别只是 S24chinadns 和 run.sh 两个文件的内容不同。
10. 配置加载防火墙策略和加载 ipset 内核模块脚本(具有jffs)
说明!原文作者之前几次更新都是利用 gfwlist 来通过 dnsmasq 解析出来 IP 加入到 ipset 集合中,但最新的这次更新直接用 chnroutes 来导入中国 IP 段来判断。
加载 chnroutes 脚本配置(记得把 chnroute.txt 放到 /jffs 文件夹中)
/jffs/ipsetadd.sh
#!/bin/sh
# Copyright (C) 2015 OpenWrt.org
# HOUZI(hack)
_input=/jffs/ignore.list
IPS=/usr/sbin/ipset
# Load modules
insmod ip_set
insmod ip_set_bitmap_ip
insmod ip_set_bitmap_ipmac
insmod ip_set_bitmap_port
insmod ip_set_hash_ip
insmod ip_set_hash_ipport
insmod ip_set_hash_ipportip
insmod ip_set_hash_ipportnet
insmod ip_set_hash_net
insmod ip_set_hash_netport
insmod ip_set_list_set
insmod xt_set
# Batch loading
$IPS -N ss_spec_lan_ac hash:ip
$IPS -! -R <<EOF
create ss_spec_wan_ac hash:net
$(egrep -v "^#|^$" $_input | sed -e "s/^/add ss_spec_wan_ac /")
EOF
然后加入启动项(注意顺序)
mount -o bind /jffs/opt /opt
/jffs/ipsetadd.sh
/jffs/run.sh
加载防火墙规则脚本配置
iptables.sh
#!/bin/sh
# Copyright (C) 2007-2012 OpenWrt.org
#
# create a new chain named SHADOWSOCKS
iptables -t nat -N SS_SPEC_WAN_AC
iptables -t nat -N SS_SPEC_WAN_FW
# Ignore your shadowsocks server's addresses(注意!这里填写自己 server ip)
iptables -t nat -A SS_SPEC_WAN_AC -d 192.168.99.1 -j RETURN
# Ignore China route table
iptables -t nat -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN
# Apply the "SS_SPEC_WAN_AC" to the "SS_SPEC_WAN_FW" chain
iptables -t nat -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW
# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SS_SPEC_WAN_FW -p tcp -j REDIRECT --to-ports 1080
# Apply rules and specify ss-redir to take a specific port
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 22,80,443 -m set ! --match-set ss_spec_lan_ac src -j SS_SPEC_WAN_AC
# Router external agent
iptables -t nat -A OUTPUT -p tcp -m multiport --dports 22,80,443 -j SS_SPEC_WAN_AC
额外功能:
1.使用内网访问控制仅允许指定的 IP 可以使用 SS
ipset add ss_spec_lan_ac 192.168.1.17 #把该内网IP加入该ss_spec_lan_ac集合
ipset del ss_spec_lan_ac 192.168.1.17 #把该内网IP从该ss_spec_lan_ac集合中删除
加入自动启动init选项,Administration >> Scripts >> WAN Up选项写入/jffs/iptables.sh
11.更新chnroutes(必须操作的步骤)
jffs/add_ignore_ip
#!/bin/bash
# HOUZI (hack) http://wwww.router008.com
# Determine whether a file exists "ignore.list"
if [ -f "/jffs/ignore.list" ]
then
rm -f /jffs/ignore.list
else
touch /jffs/ignore.list
fi
# Path to save you rule file
RULE_FILE=/jffs/ignore_tmp.txt
LINE=/jffs/ignore.list
# Ignore the local network segment
EX_DOMAIN='0.0.0.0/8
10.0.0.0/8
100.64.0.0/10
127.0.0.0/8
169.254.0.0/16
172.16.0.0/12
192.0.0.0/24
192.0.2.0/24
192.88.99.0/24
192.168.0.0/16
198.18.0.0/15
198.51.100.0/24
203.0.113.0/24
224.0.0.0/4
240.0.0.0/4'
# Create "ignore.list"
for each_line in $EX_DOMAIN
do
echo $each_line >> $LINE
done
# China routing table updates
sh /jffs/update_chnroutes.sh
# The combined "ignore.list" and "ignore_tmp.txt"
cat $RULE_FILE >> $LINE
/jffs/update_chnroutes
#!/bin/sh
# ShadowSocks
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)) }' > /jffs/ignore_tmp.txt
# 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)) }' > /jffs/opt/etc/chnroute.txt
执行
/jffs/add_ignore_ip.sh
12. 最后,重启路由器,然后你关掉电脑/手机上的shadowsocks,体验无缝出墙的快感吧!
再贴一遍原文链接,作者还在不断更新。
HOUZI
感觉教程更新的太快了,跟不上喽!:mrgreen:
飞力
啊,原作者乱入了!