Tomato-ARM部署ShadowSocks科学上网
  • 分类:Linux
  • 发表:2015-07-27
  • 围观(7,550)
  • 评论(2)

上次在 r6300v2 上成功安装了 entware,后来我又成功的格式化好了 jffs ,终于可以利用到路由器本身的64MB 空间,优点是比 U 盘稳定很多,还可以省下一个 USB 口接打印机。当然缺点就是空间小,不过装个 shadowsocks 还是戳戳有余。

r6300v2-jffs-setup

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 插件测试。

chrome-switchyomega-test-ss-local

4. 由于重启路由器后,刚才 /opt 的挂载会失效,所以我们要把这句命令加到启动init里。到“系统管理”-“脚本”-“初始化”里输入

mount -o bind /jffs/opt /opt

mount-jffs-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解析

dnsmasq

根据原文作者最新更新的步骤,在最后一步需要联网下载 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,体验无缝出墙的快感吧!

再贴一遍原文链接,作者还在不断更新。

http://www.router008.com/Tomato-ShadowSocsk.html

共有 2 条评论

  1. HOUZI

    感觉教程更新的太快了,跟不上喽!:mrgreen:

    1. 飞力

      啊,原作者乱入了!

Top