在Synology群晖NAS上使用shadowsocks-libev、polipo

  翻墙一直主要使用的是SSH动态端口映射,SSH代理数据传输的安全性自然没必要担心,但据说有较明显的流量特征,服务器较易暴露,再加上SSH代理在Windows下使用并不那么友好,因此在自己购买了VPS后就决定要用shadowsocks做代理服务器。

  Python版的shadowsocks因作者clowwindy被请喝茶早就停止更新,托开源的福,shadowsock有众多其它语言版本,比如纯C的shadowsocks-libev,较低的资源消耗更适合配置一般的VPS和我那内存仅区区128M的NAS。

  VPS操作系统是Ubuntu,因此服务端不论是自己编译还是从软件源安装都很简单,Windows和Mac OS X上也有客户端可以直接使用,唯一有点麻烦的就是群晖NAS。NAS配置低的惨不忍睹,而且缺少编译环境,只能在其他Linux服务器上进行交叉编译。关于交叉编译,Synology提供了详尽的开发指南可供参考。

一、环境准备

  1. 准备编译服务器,一般常见的Linux发行版都没有问题,但需要注意的是如果是32位的系统需要额外安装libc6-i386,我是在Paralels Desktop虚拟机里安装的Ubuntu 16.04 amd64。

  2. 确定NAS的CPU类型、DSM版本,下载对应的Tool Chains,如我的老爷机DS211j,CPU: Marvell mv6282 DSM: 6.0,需要下载的就是6281-gcc464_glibc215_88f6281-GPL.txz

  3. 上传Tool Chains到编译服务器。

  注意:下文脚本假定工作目录为/home/jinnlynn/nas,Tool Chains也被上传到该目录下

二、编译
# 工作目录,前文下载的6281-gcc464_glibc215_88f6281-GPL.txz在该目录下
WDIR=/home/jinnlynn/nas
# 目标目录,编译好的文件将会保存在这
DIST=$WDIR/dist

cd $WDIR

# 安装工具
sudo apt-get -y install make binutils
# 64位系统上需安装32位libc
uname -p | grep -q 64 && sudo apt -y install libc6-i386

# 解压Tool Chains,将生成arm-marvell-linux-gnueabi文件夹
tar xvf 6281-gcc464_glibc215_88f6281-GPL.txz

# 编译环境变量,不同的CPU环境可能不同,详见Synology开发指南的Compile Open Source Projects章节
export CC=$WDIR/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-gcc
export LD=$WDIR/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-ld
export RANLIB=$WDIR/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-ranlib
export CFLAGS="-I$WDIR/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc/include"
export LDFLAGS="-L$WDIR/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc/lib"

# 依赖zlib,下载编译
curl -O http://zlib.net/zlib-1.2.8.tar.gz
tar xvf zlib-1.2.8.tar.gz
cd zlib-1.2.8/
./configure --prefix=$DIST/zlib-1.2.8
make install
cd $WDIR

# 依赖openssl,下载编译
curl -O https://www.openssl.org/source/openssl-1.0.2h.tar.gz
tar xvf openssl-1.0.2h.tar.gz
cd openssl-1.0.2h
./Configure dist --prefix=$DIST/openssl-1.0.2h
make
make install
cd $WDIR

# 编译shadowsocks-libev
curl -OL https://github.com/shadowsocks/shadowsocks-libev/archive/v2.4.6.tar.gz
tar xvf v2.4.6.tar.gz
cd shadowsocks-libev-2.4.6
# 配置 需要注意的是--host选项,目标NAS不同值可能也会不同
# 详见Synology开发指南的Compile Open Source Projects章节
./configure \
    --with-zlib=$DIST/zlib-1.2.8 \
    --with-openssl=$DIST/openssl-1.0.2h \
    --prefix=$DIST/shadowsocks-libev-2.4.6 \
    --host=armle-unknown-linux
make
make install
cd $WDIR

  将生成的shadowsocks-libev-2.4.6目录拷贝到NAS即可正常使用了。

三、编译polipo

  shadowsocks-libev是socks5代理,但某些应用可能只能使用HTTP代理,因此需要转换,软件个人推荐polipo,轻量高效,ipkg软件源上也有但版本较低,最好也自己编译。

# 工作目录
WDIR=/home/jinnlynn/nas
# 目标目录,编译好的文件将会保存在这
DIST=$WDIR/dist/

cd $WDIR

# 安装工具
sudo apt-get -y install texinfo

# 编译环境变量,不同的CPU环境可能不同,详见Synology开发指南的Compile Open Source Projects章节
export CC=$WDIR/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-gcc
export LD=$WDIR/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-ld
export RANLIB=$WDIR/arm-marvell-linux-gnueabi/bin/arm-marvell-linux-gnueabi-ranlib
export CFLAGS="-I$WDIR/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc/include"
export LDFLAGS="-L$WDIR/arm-marvell-linux-gnueabi/arm-marvell-linux-gnueabi/libc/lib"

curl -OL https://github.com/jech/polipo/archive/polipo-1.1.1.tar.gz
tar xvf polipo-1.1.1.tar.gz
cd polipo-polipo-1.1.1/

make all

# polipo的make install默认将安装到当前系统目录
# 这里自己拷贝出所需文件
PREFIX=$DIST/polipo-1.1.1
mkdir -p $PREFIX/bin
mkdir -p $PREFIX/share/www/doc
rm -f $PREFIX/bin/polipo
cp -f polipo $PREFIX/bin/
cp -f html/* $PREFIX/share/www/doc
cp -f localindex.html $PREFIX/share/www/index.html
mkdir -p $PREFIX/man/man1
mkdir -p $PREFIX/info
cp -f polipo.man $PREFIX/man/man1/polipo.1
cp polipo.info $PREFIX/info/

  同样的拷贝polipo-1.1.1目录到NAS即可,要注意的一点是运行时可能出现Disabling disk cache: No such file or directoryDisabling local tree: No such file or directory提示,这是因为编译默认的缓存目录和本地文档目录在NAS上不一定存在,只要运行时给polipo添加localDocumentRootdiskCacheRoot选项,设置正确的目录就没有问题了。

Read more...