對於已經有 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,但應該都已經有預先安裝了。

1
2
3
4
# 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 下載:

1
2
# 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:

1
# tar zxvf softether-vpnserver-v2.00-9387-rtm-2013.09.16-linux-arm_eabi-32bit.tar.gz

解開後,在 / opt/vpnserver 目錄就是 SoftEther 的原始碼?其實是預先編譯過的程式庫, 只是需要做一些聯結 (link) 產生最終執行檔。執行 make 來產生需要的執行檔:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 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

.
.
.

編譯到最後的部分,可能會看到下列的錯誤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 相關的錯誤。這篇文章 有提供解法,設定一個環境變數再重新編譯:

1
2
# 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 的 < a href="http://wiki.qnap.com/wiki/Running_Your_Own_Application_at_Startup" target="_blank" rel="noopener">這篇文章 , 山姆鍋節錄相關步驟:

編輯 /etc/config/qpkg.conf 這個檔案:

1
# nano /etc/config/qpkg.conf

宣告一個 autorun 套件來利用 ipkg 自動啟動機制:

1
2
3
4
5
6
7
8
9
[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 檔案:

1
2
3
# 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 的腳本:

1
2
3
4
5
6
7
8
#!/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 開源後, 會提供比較好的套件包裝方式。