SoftEther VPN ServerをLinux上で使ってみる

長年お世話になっているPacketix VPNですが、全く同じ作りでSoftEther VPN というソフトがフリーソフトで提供されています。少し機能に差があるそうですが、難しい事は良く分かりません。とりあえず、VPNしたい、ネットワークを暗号化して接続したいという場合にはほとんど違いがないのだと思います。

しかもOSもフリーで利用できるLinuxに対応しています。

Screenshot of ja.softether.org

ちなみに、当初はStrech 64bitに、vpnserver64bi版のインストールを試みましたが、
softether-vpnserver-v4.18-9570-rtm-2015.07.26-linux-x64-64bit.tar.gz

をダウンロードしmakeするも

/usr/bin/ld: lib/libintelaes.a(intel_aes.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object。 -fPIC を付けて再コンパイルしてください。
/usr/bin/ld: 最終リンクに失敗しました: 出力に対応するセクションがありません
collect2: error: ld returned 1 exit status

と表示され、パラメータを変えつつ試したが力尽きました。

そこで、気を取り直してStrech32bitでインストールし直しました。

Makeできる環境を準備します。

apt-get install build-essential
wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/32bit_-_Intel_x86/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x86-32bit.tar.gz
# tar -xvvzf softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x86-32bit.tar.gz

できた

vpnserver

フォルダに入り、

# make
--------------------------------------------------------------------

SoftEther VPN Server (Ver 4.20, Build 9608, Intel x86) for Linux Install Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.

--------------------------------------------------------------------

Do you want to read the License Agreement for this software ?

1. Yes
2. No

Please choose one of above number:
1

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

make[1]: ディレクトリ '/home/hanako/vpnserver' に入ります
Preparing SoftEther VPN Server...
ranlib lib/libcharset.a
ranlib lib/libcrypto.a
ranlib lib/libedit.a
ranlib lib/libiconv.a
ranlib lib/libintelaes.a
ranlib lib/libncurses.a
ranlib lib/libssl.a
ranlib lib/libz.a
ranlib code/vpnserver.a
gcc code/vpnserver.a -O2 -fsigned-char -pthread -m32 -lm -ldl -lrt -lpthread -L./ lib/libssl.a lib/libcrypto.a lib/libiconv.a lib/libcharset.a lib/libedit.a lib/libncurses.a lib/libz.a lib/libintelaes.a -o vpnserver
ranlib code/vpncmd.a
gcc code/vpncmd.a -O2 -fsigned-char -pthread -m32 -lm -ldl -lrt -lpthread -L./ lib/libssl.a lib/libcrypto.a lib/libiconv.a lib/libcharset.a lib/libedit.a lib/libncurses.a lib/libz.a lib/libintelaes.a -o vpncmd
./vpncmd /tool /cmd:Check
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.20 Build 9608 (Japanese)
Compiled 2016/04/17 21:59:35 by yagi at pc30
Copyright (c) SoftEther VPN Project. All Rights Reserved.

VPN Tools を起動しました。HELP と入力すると、使用できるコマンド一覧が表示できます。

VPN Tools>Check
Check コマンド - SoftEther VPN の動作が可能かどうかチェックする
---------------------------------------------------
SoftEther VPN 動作環境チェックツール

Copyright (c) SoftEther VPN Project.
All Rights Reserved.

この動作環境チェックツールを実行したシステムがテストに合格した場合は、SoftEther VPN ソフトウェアが動作する可能性が高いです。チェックにはしばらく時間がかかる場合があります。そのままお待ちください...

'カーネル系' のチェック中...
[合格] ○
'メモリ操作系' のチェック中...
[合格] ○
'ANSI / Unicode 文字列処理系' のチェック中...
[合格] ○
'ファイルシステム' のチェック中...
[合格] ○
'スレッド処理システム' のチェック中...
[合格] ○
'ネットワークシステム' のチェック中...
[合格] ○

すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。

コマンドは正常に終了しました。

--------------------------------------------------------------------
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.

*** How to start the SoftEther VPN Server Service ***

Please execute './vpnserver start' to run the SoftEther VPN Server Background Service.
And please execute './vpncmd' to run the SoftEther VPN Command-Line Utility to configure SoftEther VPN Server.
Of course, you can use the VPN Server Manager GUI Application for Windows on the other Windows PC in order to configure the SoftEther VPN Server remotely.
--------------------------------------------------------------------

make[1]: ディレクトリ '/home/hanako/vpnserver' から出ます

 

# mv vpnserver/ /usr/local/

root@PacketixSmart:/usr/local/vpnserver# chmod 600 *
root@PacketixSmart:/usr/local/vpnserver# chmod 700 vpncmd
root@PacketixSmart:/usr/local/vpnserver# chmod 700 vpnserver

起動スクリプトを作成します。

/etc/init.d に vpnserverというファイルを作成

root@PacketixSmart:/etc/init.d#vi vpnserver
#!/bin/sh
### BEGIN INIT INFO
# Provides: vpnserver
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: SoftEther VPN Server
# Description: SoftEther VPN Server
### END INIT INFO

DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

test -x $DAEMON || exit 0

case "$1" in
start)
$DAEMON start
touch $LOCK
;;
stop)
$DAEMON stop
rm $LOCK
;;
restart)
$DAEMON stop
sleep 3
$DAEMON start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac

exit 0

 

root@PacketixSmart:/etc/init.d# apt-get install insserv

root@PacketixSmart:/etc/init.d# insserv vpnserver

root@PacketixSmart:/etc/init.d# ./vpnserver start
The SoftEther VPN Server service has been started.

VPNサーバ管理マネージャを利用して設定します。私はこの部分はWindowsクライアントから行っています。

こちらをダウンロードしてインストール
http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Windows/SoftEther_VPN_Server_and_VPN_Bridge/softether-vpnserver_vpnbridge-v4.20-9608-rtm-2016.04.17-windows-x86_x64-intel.exe

SoftEther VPNサーバ管理マネージャ(管理ツールのみ)
をインストールします。

vpnserver02.jpg

新しい接続先設定から新しいサーバを指定します。

vpnserver03.jpg
vpnserver01.jpg

初回起動時はパスワードを設定するように求められます。

vpnserver04.jpg

リモートアクセスVPNサーバを構築します。

vpnserver05.jpg

携帯電話からL2TPでVPNを張ってDMZの中に入る事ができるようになります。

iPhoneでも、iPadでも、Androidでも接続可能です。内部で公開しているwebサーバをvpnサーバ越しに公開するという事を実現しました。

イメージ的にはこんな感じです。核になるのはSecureNAT機能になります。DHCP機能でスマートフォンにIPアドレスを割り当てる事ができ、パケットをSecureNATで受け付けた外側のppp0のIPアドレスにNATし、LAN内にパケットを回す事ができます。

もしかしたら、eth1のアドレスにSecureNATできるのではないかとも思ったのですが、ちょっと実現できずでした。

Screenshot of www.softether.jp

こちらを参考にしました。

細かい設定については上記内容をサイトを参考にされるのが良いかと思います。

この中でもSecure NATについてはかなり強力な機能。使える機能だと思います。これさえあれば、LAN何にパケットを招き入れるのも簡単になります。

私どもの環境ではブリッジ設定なども考えられたのですが、SecureNATでIPアドレスをマスカレードし、中に入れ込むという設定にしました。

詳細はこちらで。

Screenshot of ja.softether.org
# PacketixVPN接続test
iptables -A INPUT -i ppp0 -p udp -m udp --dport 500 -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -m udp --dport 4500 -j ACCEPT

ゲートウェイになっているので、ここでファイヤーウォールに穴をあけておかないとパケットが入ってきません。L2TPで利用するのが udp 500,4500ポートです。こちらを接続可能な状態にします。

ちなみにiptablesを触って、次回再起動時に有効にしたい場合は

iptables-save > /etc/iptables/rules.v4

としておく

スマートフォンからSoftether VPN Serverに接続ができるようになると、SecureNAT機能により、Softether VPN Serverで受け付けたNICに割り振っているIPアドレスにNATする事ができます。

今回ppp0で受け付けたので、NATさらたIPパケットのソースアドレスは、ppp0のアドレスになっていました。ここに気づくのに時間がかかりました。てっきり、eth1になるのではないかと思っていたのですが、tcpdumpすると、外側のppp0にNATされているのが分かりました。

そこで、アクセスさせたいサーバに ppp0からきたパケットはeth1に戻るようroute addしました。こうする事で、アクセスさせたいサーバに接続できるようになりました。

スマホでの接続は全く問題ないのですが、パソコンでVPN Clientから接続するとこんなメッセージが頻繁に出ました。

2017-12-04 15:13:14.819 コネクション “CID-80” は理由 “VPN セッションの通信がタイムアウトしました。クライアントから VPN Server への接続が切断された可能性があります。” (コード 13) で終了しました。

接続完了するものの、すぐにVPNセッションが切れて、このエラーメッセージが表示されます。

インタネットセッションを張っているルータ(Debian Jennie)に設定しました。LAN内からのアクセスでは全く問題でないのにWAN側からのセッションだけこのようなエラーが表示されます。

iptablesの設定を見直し、問題ない。ppp0側にきたpacketをeth0側にpreroutingしてみたりと、設定を色々試してみました。

解決!! 結局Pakcetixクライアントマネージャにて

UDP高速化機能を無効にするのチェックを入れたら、安定して接続できるようになりました。

UDP高速化機能について

Screenshot of www.softether.jp

 

VPN Server と VPN Client / Bridge との間では、最初に HTTPS ベースで VPN 接続が確立されます。VPN 接続が一端確立されると、両者は互いに UDP パケットを物理的に送り合い、UDP による疎通が可能であるかどうかを検証します。
もし UDP による疎通が可能であることが検出された場合は、それ以降は、HTTPS トンネルはキープアライブの目的でのみ使用され、VPN 通信のペイロードは UDP 経由で送受信されるようになります。

ユーザ認証の方法のうち、「証明書認証」と「外部サーバ認証」はオープンソース版には搭載がありませんでした。ちゃんと差別化されてるんだなぁ、と改めて感心しました。ほとんど機能に違いがなければ、オープンソース版を使っていく事にしようと思いましたが、電子証明書認証をメインで利用していた私にとっては、正規のサーバを購入する意味で動機づけができました。