前言

對於已經有 QNAP NAS 裝置的人 , 雖然可以使用內建的 PPTP 或者 OpenVPN, 但不喜歡另外裝客戶端軟體或需要更彈性的人 , 何不試試使用 SoftEther 來架 L2TP/IPSec VPN 服務器 ? 本篇文章 , 山姆鍋將示範如何在 QNAP NAS 裝置上編譯安裝 SoftEther 軟體 , 並設定成適合自己使用 。

工具介紹

本文是以山姆鍋自己有的 QNAP TS-419P II 的 NAS 服務器為標的 , 在上面使用 SoftEther 軟體架設 VPN 服務 。

  1. QNAP NAS 裝置 : 主要是當作存儲裝置 , 山姆鍋就是使用它來做資料備份並與遠端存儲服務同步 , 但本質上還是一台通用主機 , 在上面是很容易安裝其它軟體的 。
  2. SoftEther Server 2.0: 一套支援多種協定的 VPN 服務軟體 ,L2TP/IPSec, OpenVPN, MS-SSTP 等 , 但本文只針對 L2TP/IPSec 的支援 。Linux 上另一個支援 L2TP 的 VPN 軟體是 OpenSWAN, 山姆鍋曾經在 VPS 上安裝過 , 不過沒成功 。
  3. GCC/Make 等工具 : 由於 SoftEther 需要編譯 , 因此需要在 QNAP 上先安裝好這些基本工具 。

已知限制

Linux Kernel 有個限制 , 導致 SoftEther VPN 服務無法存取 SoftEther 所在的那台主機 。 雖然存取其它主機沒有問題 , 但如果您同山姆鍋一樣需要存取 NAS 的話 , 就需要兩張網卡 。 幸運的是 ,QNAP TS-419P II 就有兩張網卡 , 如果您的 QNAP 沒有的話 , 那您要看這個限制是不是不符合您的需要再決定要不要繼續 。

安裝基本工具

在 QNAP 上安裝應用程式有簡單的用戶界面可以使用 , 不過我們要做的比較低階 , 需要我們從命令列執行 。 假設您已經有安裝 ipkg 軟體 , 沒有的話可以從 App Center 安裝 。 下列是已知需要安裝的軟體 :

  1. gcc
  2. make
  3. gconv-modules
  4. 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)。
SoftEther download

都選好後 , 下方就會出現下載聯結 , 找到您要的那個聯結後 , 複製它 ( 您知道的 , 按右鍵 ?)。 使用 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.

其中 , 有問題的訊息在於 :

./vpncmd /tool /cmd:Check -- Alert: SoftEther VPN Kernel -- String Library Init Failed. Please check your locale settings and iconv() libraries.

基本上是說 iconv 相關的錯誤 。 這篇文章 有提供解法 , 設定一個環境變數再重新編譯 :

# export GCONV_PATH=/opt/lib/gconv
# make

終於到這邊了 , 您應該有一個編譯好的 SoftEther 服務軟體了 。 其中 , 主要的執行檔為 :

  1. /opt/vpnserver/vpnserver : SoftEther 服務器程序 。
  2. /opt/vpnserver/vpncmd: 服務器命令列管理工具 。

讓 SoftEther 在開機時自動執行

SoftEther 既然要提供服務 , 自然希望 QNAP 開機時可以自動執行 。 這裡您會發現 QNAP 系統跟其它主流 Linux 發行版本其中一個很不一樣的地方 : 它沒有完整支援 upstart 或者 init.d 來啟動服務 。 根據 QNAPedia 的 ` 這篇文章 <http://wiki.qnap.com/wiki/Running_Your_Own_Application_at_Startup>`_ , 山姆鍋節錄相關步驟 :

編輯 /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 開源後 , 會提供比較好的套件包裝方式 。