Shadowsocks Openwrt Setup

  1. wall

正常来讲我本来不想写一篇 “Yet another Shadowsocks installation guide“,不过前几天升级路由发现又得编译一次然后之前的工具又不见了的时候,又得到 Google “翻箱倒柜”找编译步骤,不如记下来顺便发一下吧。

编译环境

Openwrt 找到路由器对应的 SDK 下载条目,我路由器是 WNDR4300,版本是 lede 17.01.4,SDK 名字是 lede-sdk-17.01.4-ar71xx-nand_gcc-5.4.0_musl-1.1.16.Linux-x86_64.tar.xz 之所以先看名字是想确定 gcc 的版本,据经验来看,使用其他版本的 gcc 编译会很惨(此处省略 200 字抱怨)。

由于这时候还没有翻墙,所以编译最好在一个墙外的 VPS 上搞定。(安装 docker 这种步骤就先跳过了)。

#+NAME prepare gcc

docker run -it --name lede gcc:5.4 bash

cd /usr/src
curl $SDK_URL -O
tar xvf $SDK_FILENAME
mv $SDK_DIR lede-sdk
cd lede-sdk

编译

这两位 openwrt-shadowsocks & luci-app-shadowsocks

git clone https://github.com/shadowsocks/openwrt-feeds.git package/feeds
git clone https://github.com/shadowsocks/openwrt-shadowsocks.git package/shadowsocks-libev


git clone https://github.com/shadowsocks/luci-app-shadowsocks.git package/luci-app-shadowsocks

pushd package/luci-app-shadowsocks/tools/po2lmo
make && make install
popd

make menuconfig

make package/shadowsocks-libev/compile V=99
make package/luci-app-shadowsocks/compile V=99

打包

mkdir ipks

# 有些是不需要的,不过懒得花时间去排除了
cp bin/packages/mips_24kc/base/*.ipk ipks/
cp bin/packages/mips_24kc/packages/*.ipk ipks/
cp bin/targets/ar71xx/nand/pacakges/*.ipk ipks/

tar cvf notimportant.tar ipks

exit

docker cp lede:/usr/src/lede-sdk/notimportant.tar ./

安装

scp notimportant.tar root@lede:/tmp/

ssh root@lede
cd /tmp
tar xvf notimportant.tar
cd ipks
opkg install *.ipk

opkg update
opkg install iptables-mod-tproxy

DNS 和 chnroutes

这里用的是 dnsmasq-china-list

git clone https://github.com/felixonmars/dnsmasq-china-list.git
cd dnsmasq-china-list
scp *.conf root@lede:~/

ssh root@lede
mkdir /etc/dnsmasq.conf.d
mv *.conf /etc/dnsmasq.conf.d/

# opkg install vim
vim /etc/dnsmasq.conf
# insert conf-dir=/etc/dnsmasq.conf.d/

opkg remove dnsmasq && opkg install dnsmasq-full
/etc/init.d/dnsmasq restart

然后再配置一个没有污染的 DNS,最好在 luci 里面,方便修改。

最后是 chnroutes

vim /usr/bin/update-ignore-list

# insert
#!/bin/sh

set -e -o pipefail

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)) }' > \
    /tmp/ignore.list

mv /tmp/ignore.list /etc/

if pidof ss-redir>/dev/null; then
    /etc/init.d/shadowsocks rules
fi

# end

chmod +x /usr/bin/update-ignore-list

update-ignore-list

crontab -e
30 4 * * 0 /usr/bin/update-ignore-list >> /var/log/update_ignore_list.log

Note to self: 下次最好升级之前先弄好。