筆記: DS216j 安裝 shadowsocks server
最近親戚弄了台 Synology DS216j 想拿來架 shadowsocks 的 server,這篇文章筆記我架這個 server 所走的路。
changelogs
- 2017-10-12 紀錄一下,現在上游有編好的 package 能用了
折騰過程
提到在 NAS 上架 shadowsocks,可以查到很多用 docker 的解決方法,不過網路上的幾篇文章都說這台機器不能用 docker,所以我直接往 binary 的方法前進。
一開始看到的是這篇 Synology DS216Play 安装 ShadowSocks,從這篇文章中得出:
- 原來有 package manager 可以用
- shadowsocks 有用 python 跟 libev 的實作可以選
安裝package manager
朝著安裝 package manager 的方向前進後找到了這篇Synology DS216j Optware IPKG 介紹。
看了看發現這是篇翻譯文,而原文有了更新的版本🇯🇵,發現到有 entware-ng 這個比 ipkg 更新的 package manager 能用,而且已經有 shadowsocks 的套件能用。
安裝 entware-ng
安裝的過程不難,大致上就是開好SSH、照著其 wiki 上寫的步驟就行。
筆記一下步驟:
建立一個套件管理用的目錄,因為韌體更新會清 /opt ,所以要在外面建並 symlink 回去:
mkdir -p /volume1/@entware-ng/opt rm -rf /opt ln -sf /volume1/@entware-ng/opt /opt
安裝 entware
wget -O - http://pkg.entware.net/binaries/armv7/installer/entware_install.sh | /bin/sh
設定啟動腳本(重開機時把 entware 裝的服務也帶起來)
編輯 /usr/local/etc/rc.d/entware-startup.sh (教學上沒有,但是我有順便做chmod +x
)#!/bin/sh case $1 in start) mkdir -p /opt mount -o bind /volume1/@entware-ng/opt /opt /opt/etc/init.d/rc.unslung start ;; stop) ;; esac
在登入時自動把
/opt/bin
/opt/sbin
加到PATH
裡面:在 /etc/profile 內加上一行. /opt/etc/profile
裝完之後就是開心地來裝 shadowsocks
opkg update
opkg install shadowsocks-libev
但是裝完卻發現沒有 ss-server
這個執行檔!原因似乎是因為 entware-ng 沒有跟上流的 openwrt 同步 https://github.com/Entware-ng/entware-packages/commit/e3793bbbde8b907842f84731bfec292ccb069114,而不知為何的明明就有新的 Makefile ,除了 mipsel 以外卻沒有新的 binary package 能用。
2017/10/12 更新
前一陣子 entware 有跟上游同步過,所以直接安裝 shadowsocks-libev-ss-server
跟 shadowsocks-libev-config
就行了
opkg install shadowsocks-libev-config
opkg install shadowsocks-libev-ss-server
手動編譯
沒辦法,只好來自己編。幸好 entware 的 wiki 頁上也有教學,也是照著做就好。
Entware-ng 用的是 OpenWrt Buildroot,所以需要先裝好它依賴的套件。
為了不把主力機的 Arch Linux 給搞髒了,我決定用找 docker 的方式來解決。
網路上可以找到一個用 arch 為底的 Dockerfile(arch-docker-buildroot),但是實際編譯時會出先一些版本上的不相容問題,所以我還是乖乖的用 ubuntu 的 image 來做。
FROM ubuntu
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential subversion libncurses5-dev zlib1g-dev gawk gcc-multilib flex git-core gettext libssl-dev unzip python-dev python file wget sudo
# 編譯時需要非 root 帳號
RUN useradd -m openwrt &&\
'openwrt ALL=NOPASSWD: ALL' > /etc/sudoers.d/openwrt
echo USER openwrt
WORKDIR /home/openwrt
CMD ["/bin/bash"]
docker 環境準備好、進入其 shell 之後我用不同的顏色來區別 docker 環境內的操作
準備 entware 跟更新其 package feeds:
git clone https://github.com/Entware-ng/Entware-ng.git cd Entware-ng make package/symlinks cp configs/armv7.config .config
安裝編譯需要 tools/toolchain,這一步驟需要很長一段時間,我就跑去打 Splatoon 的 Salmon Run 了。
make -j4 tools/install make -j4 toolchain/install
確認 .config 裡面有啟用
shadowsocks-libev
跟shadowsocks-libev-ss-server
兩個套件,我在編的時候沒確認到這點,花了好一段時間研究為什麼編完沒有 binary 檔。make menuconfig # 選好 shadowsocks (Network 的 Web Servers/Proxies 底下)
或是直接在 .config 加上
CONFIG_PACKAGE_shadowsocks-libev-config=m CONFIG_PACKAGE_shadowsocks-libev-ss-server=m
然後編譯需要的套件
make -j4 package/shadowsocks-libev/compile
編譯完之後會在 bin 下面找到對應的 .ipkg 檔,接著就是傳到 NAS 上
用 opkg 安裝:
opkg install shadowsocks-libev-config_3.0.6-2_armv7soft.ipk opkg install shadowsocks-libev-ss-server_3.0.6-2_armv7soft.ipk
設定好
/opt/etc/shadowsocks.json
跟/opt/etc/init.d/S22shadowsocks
:sed -ir 's/PROCS=ss-local/PROCS=ss-server/' /opt/etc/init.d/S22shadowsocks
確認 shadowsocks-libev 可以啟動
/opt/etc/init.d/S22shadowsocks start
設定好 router 的 NAT,然後用手機之類的測試會動之後,收工。