QNAP TS412でVPN(IPsec)をやろうとして挫折した話[追記あり]

2016年10月12日NAS

前、QNAPのNASを持っていました。やった事を、次のページにまとめています。

これ以外でも、機能を拡張しようと奮闘していましたが、諦めた事があります。

その頃(約2年前)に挑戦していた事を掘り起こしてみたいと思います。なお、以下の内容は途中で投げ出してしまったため、不完全です。

[amazonjs asin="B00VW99HM0" locale="JP"]

IPSecサーバにする

QNAP TS-412には、PPTPとOpenVPNの、2種類のVPNサーバ機能を持っています。PTPはiOSでサポートされていますが、セキュリティの問題から、使用が推奨されていません。

VPNとしては、PPTP, OpenVPNの他、L2TP/IPsecが在ります。

iOSでPPTPとOpenVPNが使えないとすると、TS-412にL2TP/IPSecを載せるしかありません。

strongSwanのインストール

フリーのL2TP/IPSec機能を実現するソフトとして、OpenSwanとStrongSwanがあります。ですが、OpenSwaは、TS-412のipkgとして用意されていません。StrongSwanなら、バージョンは古い物の、用意されていました。

# ipkg list | egrep -i strongswan
strongswan - 4.5.3-2 - A IPsec implementation.

理由は忘れてしまったのですが、このバージョンだと上手く行かなかった様です。そのため、当時の最新版の5.0.2をインストールしようとしました。インストールするなら、パッケージ化してインストールした方が、管理が楽です。次の様な手順です。

ソースをダウンロードして来て、ビルドします。次の方法で、strongSwanのパッケージをダウンロードして展開します。

# wget strongswan-5.0.2.tar.gz
# tar xvzf strongswan-5.0.2.tar.gz
# cd strongswan-5.0.2
# ./configure --prefix=/opt

なお、strongSwanのインストールの仕方は、次のウェブサイトを参考にしていました。

そして、controlファイルを修正して、ipkファイルを作ります。。

# ipkg download strongswan
# tar xvzf strongswan.ipk
# cd strongswan5_5.0.2-1
# mkdir CONTROL
# tar xvzf ../../control.tar.gz
# vi control

ipkファイルの作り方は、次の記事をご覧ください。

パッケージ化したstrongSwanのインストールが終わったら起動します。その前に、カーネルモジュールを使える様にします。

# mkdir /opt/lib/module
# cd /opt/lib/modules
# ln -s /lib/modules 2.6.33.2
# depmod -a

起動します。

# ipsec start
Starting strongSwan 5.0.2 IPsec [starter]...
modprobe: module af_key not found.
modprobe: failed to load module af_key
no netkey IPsec stack detected
modprobe: module ipsec not found.
modprobe: failed to load module ipsec
no KLIPS IPsec stack detected
no known IPsec stack detected, ignoring!

Kernel Modleの、"af_key"と"ipsec"が無いため、通信できないと言われてしまいました。

カーネルモジュールの追加

カーネルモジュールを追加しようとして、カーネルのビルドに挑戦しました。

次のウェブページを参考に、カーネルモジュールをビルドしました。

# /usr/bin/wget --no-check-certificate https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.33.2.tar.gz

証明書をチェックしないようにするために、"–no-check-certificate"オプションが必要です。

QNAPから、GNUライセンスのソース一式をコピーしてきます。QNAPのトップページから、オンラインサポートGLPソースからダウンロードします。

中には、カーネル以外のソース一式も含まれています。

# wget http://downloads.sourceforge.net/project/qosgpl/QNAP%20NAS%20GPL%20Source/GPL_TS-20121119-3.8.0.tar.gz?r=&ts=1365453723&use_mirror=jaist
# tar xvzf ../QNAP_GPL_3.6.x_20120220.tar.gz

TS-412用の物が無かったので、TS-410Pの物をコピーしてきました。他の、TS-410U, TS-419P, TS-419Uのコンフィグレーションファイルと比べてみましたが、日付以外は一緒でした。

# cp -p ../../kernel_cfg/TS-410P/linux-2.6.33.2-arm.cfg ./.config

モジュールをリンクしておきます。リブートすると、消えてしまう様です。

# ln -s /opt/lib/libncurses.so /lib/libncurses.so
# ln -s /opt/lib/libncurses.so.5 /lib/libncurses.so.5
# ln -s /opt/lib/libncurses.so.5.7 /lib/libncurses.so.5.7
# ln -s /opt/lib/libncursesw.so /lib/libncursesw.so
# ln -s /opt/lib/libncursesw.so.5 /lib/libncursesw.so.5
# ln -s /opt/lib/libncursesw.so.7 /lib/libncursesw.so.7

もしくは、LD_LIBRARY_PATHを変更します。

# export LD_LIBRARY_PATH /opt/lib

.configに追加したのは、次の行です。

#
# IPSec
#
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_NET_KEY=y
CONFIG_NET_KEY_MIGRATE=y

ビルドの手順を以下にまとめます。

次に、変更した内容を反映させます。

# make oldconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf -o arch/arm/Kconfig
.config:1975:warning: override: reassigning to symbol NET_KEY

このディレクトリに、オリジナルのカーネルのコンフィグレーションファイルをコピーしてきます。

メモによると、約6時間かかった様です。

途中で、arm-none-linux-gnueabi-ldが必要とされるので、リンクしておきます。

# ln -s /opt/arm-none-linux-gnueabi/bin/ld /opt/bin/arm-none-linux-gnueabi-ld

これを設定しておかないと、ビルドの途中で、次のエラーになります。

/bin/sh: arm-none-linux-gnueabi-ld: command not found
make[2]: *** [fs/autofs/autofs.o] Error 127
make[1]: *** [fs/autofs] Error 2
make: *** [fs] Error 2

いよいよ、モジュールのビルドです。

# make modules

ちなみに、GPL_TS/src/linux-2.6.33.2-armの下でビルドすると、次のエラーになりました。必要なファイルが足りないみたいです。 (追記 2015-06-10 21:13)構造体(struct)ext4_super_blockを参照している名前’s_rsved_gdt_blks_large’, 's_feature_qnap_compat’が違うというエラーです。

CHK     include/linux/version.h
CHK     include/generated/utsrelease.h
make[1]: `include/generated/mach-types.h' is up to date.
CALL    scripts/checksyscalls.sh
CC [M]  fs/ext4/resize.o
fs/ext4/resize.c: In function 'verify_group_input':
fs/ext4/resize.c:33: error: 'struct ext4_super_block' has no member named 's_rsved_gdt_blks_large'
fs/ext4/resize.c: In function 'setup_new_qnap_group_blocks':
fs/ext4/resize.c:1197: error: 'struct ext4_super_block' has no member named 's_rsved_gdt_blks_large'
fs/ext4/resize.c: In function 'add_new_qnap_gdb':
fs/ext4/resize.c:1489: error: 'struct ext4_super_block' has no member named 's_rsved_gdt_blks_large'
fs/ext4/resize.c:1493: error: 'struct ext4_super_block' has no member named 's_rsved_gdt_blks_large'
fs/ext4/resize.c: In function 'reserve_qnap_backup_gdb':
fs/ext4/resize.c:1534: error: 'struct ext4_super_block' has no member named 's_rsved_gdt_blks_large'
fs/ext4/resize.c: In function 'ext4_qnap_group_add':
fs/ext4/resize.c:1689: error: 'struct ext4_super_block' has no member named 's_rsved_gdt_blks_large'
fs/ext4/resize.c:1720: error: 'struct ext4_super_block' has no member named 's_feature_qnap_compat'
fs/ext4/resize.c:1721: error: 'struct ext4_super_block' has no member named 's_rsved_gdt_blks_large'
make[2]: *** [fs/ext4/resize.o] Error 1
make[1]: *** [fs/ext4] Error 2
make: *** [fs] Error 2

ここまで頑張って、手詰まりになりました。

(追記 2015-06-10 21:13) 名前の定義を追加してあげれば良いみたいです。

OpenVPNで、いいんじゃない?

QNAPはOpenVPNサーバとしては機能します。iPhoneからでも、以下の方法でOpenVPNサーバにつなぐ事ができる様です。

(追記 2015-06-10 21:13)

nsbyさんにコメントで教えていただきました。ありがとうございます。次のウェブページ(ディスカッション)に従って、ヘッダファイルを修正すれば良いそうです。

Posted by お市のかた