對於已經有 QNAP NAS 裝置的人,雖然可以使用內建的 PPTP 或者 OpenVPN, 但不喜歡另外裝客戶端軟體或需要更彈性的人,何不試試使用 SoftEther 來架 L2TP/IPSec VPN 服務器? 本篇文章,山姆鍋將示範如何在 QNAP NAS 裝置上編譯安裝 SoftEther 軟體,並設定成適合自己使用。
工具介紹
本文是以山姆鍋自己有的 QNAP TS-419P II 的 NAS 服務器為標的,在上面使用 SoftEther 軟體架設 VPN 服務。
- QNAP NAS 裝置: 主要是當作存儲裝置,山姆鍋就是使用它來做資料備份並與遠端存儲服務同步,但本質上還是一台通用主機,在上面是很容易安裝其它軟體的。
- SoftEther Server 2.0: 一套支援多種協定的 VPN 服務軟體,L2TP/IPSec, OpenVPN, MS-SSTP 等,但本文只針對 L2TP/IPSec 的支援。Linux 上另一個支援 L2TP 的 VPN 軟體是 OpenSWAN,山姆鍋曾經在 VPS 上安裝過,不過沒成功。
- GCC/Make 等工具:由於 SoftEther 需要編譯,因此需要在 QNAP 上先安裝好這些基本工具。
- 關聯文章: 微型企業之雲端資料備援服務 - Symform
已知限制
Linux Kernel 有個限制,導致 SoftEther VPN 服務無法存取 SoftEther 所在的那台主機。 雖然存取其它主機沒有問題,但如果您同山姆鍋一樣需要存取 NAS 的話,就需要兩張網卡。 幸運的是,QNAP TS-419P II 就有兩張網卡,如果您的 QNAP 沒有的話, 那您要看這個限制是不是不符合您的需要再決定要不要繼續。
安裝基本工具
在 QNAP 上安裝應用程式有簡單的用戶界面可以使用,不過我們要做的比較低階, 需要我們從命令列執行。假設您已經有安裝 ipkg 軟體,沒有的話可以從 App Center 安裝。 下列是已知需要安裝的軟體:
- gcc
- make
- gconv-modules
- nano: 不是必要啦,只是山姆鍋習慣用這個編輯器。
其它可能還有 SoftEther 需要的套件,像是 OpenSSL,但應該都已經有預先安裝了。
# ipkg install gcc
# ipkg install make
# ipkg install gconv-module
# ipkg nano
下載安裝 SoftEther 服務軟體
到 SoftEther 的 軟體下載頁面 ⎘ ,根據項目來選擇:
- 組件:選擇 “SoftEther VPN Server”
- 系統(system): 選擇 “Linux”。
- CPU: 需要根據您的 QNAP 而定,山姆鍋的是 ARM EABI (32-bit)。
都選好後,下方就會出現下載聯結,找到您要的那個聯結後,複製它(您知道的,按右鍵?)。 使用 SSH 客戶端連到 NAS 服務器後,使用 wget 下載:
# cd /opt
# wget http://www.softether-download.com/files/softether/v2.00-9387-rtm-2013.09.16-tree/Linux/SoftEther%20VPN%20Server/32bit%20-%20ARM%20EABI/softether-vpnserver-v2.00-9387-rtm-2013.09.16-linux-arm_eabi-32bit.tar.gz
不要在 /root 下載,那個區隔(partition) 空間太小。使用 tar 指令解開下載完成的 SoftEther:
# tar zxvf softether-vpnserver-v2.00-9387-rtm-2013.09.16-linux-arm_eabi-32bit.tar.gz
解開後,在/opt/vpnserver 目錄就是 SoftEther 的原始碼?其實是預先編譯過的程式庫, 只是需要做一些聯結(link)產生最終執行檔。執行 make 來產生需要的執行檔:
# make
.
.
.
Did you read and understand the License Agreement ?
(If you couldn't read above text, Please read 'ReadMeFirst_License.txt'
file with any text editor.)
1. Yes
2. No
Please choose one of above number:
1
Did you agree the License Agreement ?
1. Agree
2. Do Not Agree
Please choose one of above number:
1
.
.
.
編譯到最後的部分,可能會看到下列的錯誤:
gcc code/vpnserver.a -O2 -fsigned-char -lm -ldl -lrt -Wl,--no-warn-mismatch -lpthread -L./ lib/libssl.a lib/libcrypto.a lib/libiconv.a lib/libcharset.a lib/libedit.a lib/libncurses.a lib/libz.a -o vpnserver
ranlib code/vpncmd.a
gcc code/vpncmd.a -O2 -fsigned-char -lm -ldl -lrt -Wl,--no-warn-mismatch -lpthread -L./ lib/libssl.a lib/libcrypto.a lib/libiconv.a lib/libcharset.a lib/libedit.a lib/libncurses.a lib/libz.a -o vpncmd
./vpncmd /tool /cmd:Check
-- Alert: SoftEther VPN Kernel --
String Library Init Failed.
Please check your locale settings and iconv() libraries.
\--------------------------------------------------------------
The preparation of SoftEther VPN Server is completed !
*** How to switch the display language of the SoftEther VPN Server Service ***
SoftEther VPN Server supports the following languages:
- Japanese
- English
- Simplified Chinese
You can choose your prefered language of SoftEther VPN Server at any time.
To switch the current language, open and edit the 'lang.config' file.
其中,有問題的訊息在於:
基本上是說 iconv 相關的錯誤。這篇文章 ⎘ 有提供解法,設定一個環境變數再重新編譯:
# export GCONV_PATH=/opt/lib/gconv
# make
終於到這邊了,您應該有一個編譯好的 SoftEther 服務軟體了。其中,主要的執行檔為:
- /opt/vpnserver/vpnserver : SoftEther 服務器程序。
- /opt/vpnserver/vpncmd:服務器命令列管理工具。
讓 SoftEther 在開機時自動執行
SoftEther 既然要提供服務,自然希望 QNAP 開機時可以自動執行。 這裡您會發現 QNAP 系統跟其它主流 Linux 發行版本其中一個很不一樣的地方: 它沒有完整支援 upstart 或者 init.d 來啟動服務。根據 QNAPedia 的這篇文章 ⎘ , 山姆鍋節錄相關步驟:
編輯 /etc/config/qpkg.conf 這個檔案:
# nano /etc/config/qpkg.conf
宣告一個 autorun 套件來利用 ipkg 自動啟動機制:
[autorun]
Name = autorun
Version = 0.1
Author = neomilium
Date = 2013-05-06
Shell = /share/MD0_DATA/.qpkg/autorun/autorun.sh
Install_Path = /share/MD0_DATA/.qpkg/autorun
QPKG_File = autorun.qpkg
Enable = TRUE
其中, ‘Shell’就是要被自動執行的 shell 腳本。每次 QNAP 啟動時,那個腳本就會被執行, 所以,我們可以將要自動被執行的程式碼寫在那個檔案內。請按照下列步驟建立 autorun.sh 檔案:
# mkdir -p /share/MD0_DATA/.qpkg/autorun
# nano /share/MD0_DATA/.qpkg/autorun/autorun.sh
# chmod +x /share/MD0_DATA/.qpkg/autorun/autorun.sh
autorun.sh 的內容會隨後續設定而修改,一個基本可以執行 vpnserver 的腳本:
#!/bin/sh
# GCONV_PATH is necessary otherwise SoftEther won't start due to locale issue.
export PATH=/opt/bin:/opt/sbin:$PATH
export GCONV_PATH=/opt/lib/gconv
# starts the VPN server
/opt/vpnserver/vpnserver start
結語
本文先針對 SoftEther 服務軟體在 QNAP 上的編譯安裝加以解說, 下篇文章將說明如何利用 SoftEther 提供的 SoftEther Server Manager for Windows 程式來設定。 安裝 SoftEther 又讓山姆鍋覺得回到使用 tar ball 來安裝程式的年代,希望 SoftEther 開源後, 會提供比較好的套件包裝方式。