SoftEtherによるVPN(IPSec)に、IPhone及び、OS X からの接続してみた
1 はじめに
SoftEther VPN Server は、筑波大学の研究プロジェクトとして開発されているもので、現在OSSとして公開されています。
各種のプラットフォームで利用可能ですが、今回は、AWS上のEC2(t2.micro Amazon Linux)にこれをインストールして、L2TP over IPSec のVPNサーバを構築し、IPhone及びOS Xから接続してみました。
なお、OS Xの場合も、iPhoneの場合も、VPNの設定の中に IPSec という表現が有るのですが、L2TPv3/IPsec(Cisco)との区別に注意が必要です。
OS Xの場合は、L2TP over IPSec を使用して下さい。
iPhoneでは、L2TPという選択になっており、一瞬レイヤ2接続のように見えますが、これが L2TP/IPSec の事です。
2 SoftEther VPN Serverのセットアップ
(1) インストール
サーバー(EC2)にSoftEther VPN Serverをインストール手順は以下のとおりです。
$ sudo yum install -y gcc // makeを使用するため $ wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz $ tar -zxvf softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz $ cd vpnserver $ make // ここでLicenceに関する質問があるので、承諾する場合は、全部 **1** で答えるとmakeが始まります。
次に、 vpnserver を /usr/local に置き、権限を制限します。
$ cd .. $ sudo mv ./vpnserver /usr/local $ cd /usr/local/vpnserver/ $ chmod 600 * $ chmod 700 vpncmd $ chmod 700 vpnserver
(2) 設定確認
vpncmdのメニュー3(VPN Tools)からCheckコマンドを利用して、正しく設定できているかどうかの確認ができます。
$ ./vpncmd 1. VPN Server または VPN Bridge の管理 2. VPN Client の管理 3. VPN Tools コマンドの使用 (証明書作成や通信速度測定) 1 - 3 を選択: 3 <= 3を選択する VPN Tools> Check <= Checkコマンドを使用する Check コマンド - SoftEther VPN の動作が可能かどうかチェックする --------------------------------------------------- SoftEther VPN 動作環境チェックツール 'カーネル系' のチェック中... [合格] ○ 'メモリ操作系' のチェック中... [合格] ○ 'ANSI / Unicode 文字列処理系' のチェック中... [合格] ○ 'ファイルシステム' のチェック中... [合格] ○ 'スレッド処理システム' のチェック中... [合格] ○ 'ネットワークシステム' のチェック中... [合格] ○ すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。 コマンドは正常に終了しました。 VPN Tools> exit <= exitでコマンドを終了します。 $
(3) 起動、停止及び、再起動
start(stop,restart) コマンドで、vpnserver 起動(再起動,停止)します。
$ sudo /usr/local/vpnserver/vpnserver start(stop,restart) The SoftEther VPN Server service has been started.
(4) プロセスの確認
psコマンドで起動しているプロセスを確認すると、次のようになっています。
$ ps -ael | grep vpnserver 4 S 0 2807 1 0 60 -20 - 4380 - ? 00:00:00 vpnserver 5 S 0 2808 2807 0 60 -20 - 169025 - ? 00:00:00 vpnserver
(5) ポートの確認
vpnserverが使用するポードは、UDPの500と4500です。
$ netstat -atnu | grep 500 udp 0 0 127.0.0.1:4500 0.0.0.0:* udp 0 0 10.0.0.217:4500 0.0.0.0:* udp 0 0 127.0.0.1:500 0.0.0.0:* udp 0 0 10.0.0.217:500 0.0.0.0:* udp 0 0 ::1:4500 :::* udp 0 0 fe80::407:49ff:fe58:bdf:4500 :::* udp 0 0 ::1:500 :::* udp 0 0 fe80::407:49ff:fe58:bdff:500 :::*
lsofでもPID 2808 のプロセスが500と4500を使用していることが確認できます。
$ sudo lsof -i:500 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vpnserver 2808 root 63u IPv4 15619 0t0 UDP 10.0.0.217:isakmp vpnserver 2808 root 67u IPv4 15623 0t0 UDP localhost:isakmp vpnserver 2808 root 71u IPv6 15629 0t0 UDP [fe80::407:49ff:fe58:bdff]:isakmp vpnserver 2808 root 75u IPv6 15633 0t0 UDP localhost:isakmp $ sudo lsof -i:4500 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vpnserver 2808 root 64u IPv4 15620 0t0 UDP 10.0.0.217:ipsec-nat-t vpnserver 2808 root 68u IPv4 15624 0t0 UDP localhost:ipsec-nat-t vpnserver 2808 root 72u IPv6 15630 0t0 UDP [fe80::407:49ff:fe58:bdff]:ipsec-nat-t vpnserver 2808 root 76u IPv6 15634 0t0 UDP localhost:ipsec-nat-t
このため、EC2で使用する場合、インバウンドで UDP 500と4500を許可する必要があります。
(6) ログの確認
SoftEtherのログは、packet_log,security_log,server_logの下に出力されます。
$ ls -la /usr/local/vpnserver/ | grep log drwx------ 2 root root 4096 8月 7 14:31 packet_log drwx------ 4 root root 4096 8月 7 14:31 security_log drwx------ 2 root root 4096 8月 7 14:31 server_log
事後の作業は、server_logの下のログ(日付ごと)を出力しながら進めると、分かりやすいかも知れません。
$ sudo ls -la /usr/local/vpnserver/server_log/ -rw------- 1 root root 24014 8月 7 14:42 vpn_20160807.log $ sudo tail -f /usr/local/vpnserver/server_log/vpn_20160807.log
(7) 仮想HUB
SoftEther VPN Server では、レイヤ2の通信を扱う部分を仮想 HUBと呼んでおり、複数設定することが出来ますが、インストール時にDEFAULTという名前の仮想HUBが一つ設定されておりますので、今回は、これをそのまま利用することにします。
vpncmd の メニュー1(VPN Server または VPN Bridge の管理) から HubListコマンド を利用して、設定されている仮想HUBの一覧を確認できます。
$ sudo ./vpncmd 1. VPN Server または VPN Bridge の管理 2. VPN Client の管理 3. VPN Tools コマンドの使用 (証明書作成や通信速度測定) 1 - 3 を選択: 1 <= 1を選択する <= このあとプロンプトに対して入力無しでEnterを2回押すと、localhost:443でVPN Serverに接続されます。 VPN Server>hublist HubList コマンド - 仮想 HUB の一覧の取得 項目 |値 ----------------+------------------- 仮想 HUB 名 |DEFAULT 状態 |オンライン 種類 |スタンドアロン ユーザー |0 グループ |0 セッション |0 MAC テーブル |0 IP テーブル |0 ログイン回数 |0 最終ログイン日時|2016-08-06 23:05:57 最終通信日時 |2016-08-06 23:05:57 転送バイト数 |0 転送パケット数 |0 コマンドは正常に終了しました。
(8) ユーザの作成
仮想HUBに接続するには、ユーザが必要です。仮想HUB(DEFAULT) には、当初、ユーザが設定されておりませんので、ここで作成します。
上記の、メニュー1(VPN Server または VPN Bridge の管理) から引き続き行います。
当初、HUBコマンドで DEFAULT の設定に入ります。(プロンプトが VPN Server/DEFAULT に変わります)
VPN Server>Hub default Hub コマンド - 管理する仮想 HUB の選択 仮想 HUB "DEFAULT" を選択しました。 コマンドは正常に終了しました。 VPN Server/DEFAULT>
続いて、UserCreateコマンドでユーザを作成します。ここでは、user1という名前で作成しました。 参加するグループ、ユーザの本名、ユーザの説明は、空でも大丈夫です。
VPN Server/DEFAULT>UserCreate UserCreate コマンド - ユーザーの作成 ユーザー名: user1 参加するグループ名: ユーザーの本名: ユーザーの説明: コマンドは正常に終了しました。 VPN Server/DEFAULT>
UserListコマンドで、作成されたユーザを確認しておきましょう。
VPN Server/DEFAULT>UserList UserList コマンド - ユーザー一覧の取得 項目 |値 ----------------+-------------- ユーザー名 |user1 本名 | 所属グループ |- 説明 | 認証方法 |パスワード認証 ログイン回数 |0 最終ログイン日時|(なし) 有効期限 |無期限 転送バイト数 |0 転送パケット数 |0 コマンドは正常に終了しました。 VPN Server/DEFAULT>
(9) ユーザのパスワードの設定
ユーザにパスワードを設定しないと、利用することが出来ません。
パスワード設定も、引き続き、仮想HUB(DEFAULT)の設定(VPN Server/DEFAULT)プロンプトからUserPasswordSetコマンドで行います。
VPN Server/DEFAULT>UserPasswordSet UserPasswordSet コマンド - ユーザーの認証方法をパスワード認証に設定しパスワードを設定 ユーザー名: user1 パスワードを入力してください。キャンセルするには Ctrl+D キーを押してください。 パスワード: *** 確認入力 : *** コマンドは正常に終了しました。 VPN Server/DEFAULT>
次の図は、OS XでVPN接続を設定する場合の、認証情報の入力画面ですが、UserPasswordSetコマンドを使用すると、5種類ある認証方式のうち、この一番上の方式を選択したことになります。
(10) IPSecの設定
ここまでで、レイヤ2(仮想HUB)までの設定は、完了です。続いて、この上で IPSecを使用するように設定を進めます。
設定は、IPsecEnableコマンドで行い、「L2TP over IPsec サーバー機能を有効」 という質問に対してだけ yes を設定します。
VPN Server/DEFAULT>IPsecEnable IPsecEnable コマンド - IPsec VPN サーバー機能の有効化 / 無効化 L2TP over IPsec サーバー機能を有効 (yes / no): yes <= yesを入力 Raw L2TP サーバー機能を有効 (yes / no): no <= noを入力 EtherIP / L2TPv3 over IPsec サーバー機能を有効 (yes / no): no <= noを入力 IPsec 事前共有鍵の文字列 (9 文字以下を推奨): xxxxxx <= IPsec 事前共有鍵の文字列を決めて入力する VPN 接続時に仮想 HUB 名が省略された場合のデフォルト仮想 HUB 名: DEFAULT <=DEFAULTを入力する コマンドは正常に終了しました。
途中、「IPsec 事前共有鍵の文字列」を設定しますが、これが、クライアント設定の下記の部分になります。
(11) NATの設定
最後は、NATの設定です。これも、仮想HUBごとの設定ですので、(VPN Server/DEFAULT)のプロンプトから行います。
使用するコマンドは、SecureNatEnableです。
VPN Server/DEFAULT>SecureNatEnable SecureNatEnable コマンド - 仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の有効化 コマンドは正常に終了しました。 VPN Server/DEFAULT>
3 OS Xからの接続
(1) 設定
「ネットワーク環境設定」から、新しいネットワークを作成します。 インターフェースとして VPN を選択し、VPNタイプは L2TP over IPSec を選択します。
サーバアドレスは、今回、SoftEther VPN Serverが動作しているEC2のグローバルアドレス、アカウント名は、仮想HUBのユーザ名です。
入力が終わったら、引き続き「認証設定...」を選択します。
こちらでは、ユーザのパスワード及び、IPSecの共有シークレットを入力します。
「接続」ボタンを押すと、VPN接続が完了します。
「詳細」を開いて、オプショのページで「すべてのトラフィックをVPN経由で送信」にチェックを入れると、全部の通信がVPNに向かいます。
(2) 動作確認
下図は、EC2上に立てたWebサーバに、VPC上のローカルアドレスからアクセスしている様子です。 VPN接続を利用すると、このようにVPCの中で立ち上げたサービスを、外部に公開することなくセキュアにアクセスすることが出来ます。
4 iPhoneからの接続
(1) 設定
「設定」ー「一般」ー「VPN」と辿り、「VPN構成を追加」を選択します。
タイプは L2TP 、サーバは、EC2のグローバルアドレス、アカウントは仮想HUBのユーザ名、パスワードは、ユーザのパスワード、シークレットは、IPSecの共有シークレットをそれぞれ入力します。 (「説明」につては、入力が必須ですが、なんでも構いません)
「接続」スイッチで、VPN接続が開始されます。
(2) 動作確認
こちらも、VPC内のアドレスでアクセスしてみました。
5 最後に
今回、L2TP over IPSecの端末(iPhone/OS X)からの接続について纏めてみました。 ネットワークをVPNで接続するのと違って、ルータなどの設定が必要なく、端末単位で設定できるので非常に簡単です。
なお、今回のような接続は、VPN接続した端末からのアクセスのみを許可するもので、この繋がった端末でデザリングなどを行っても、そちらからのルーティングは出来ないことにご注意下さい。
おまけです。 下記は、VPNの通信をモニタしたものです。UDP4500で通信しているパケットが確認できます。wiresharkでは、ProtocolでESPとなっています。
6 参考にさせて頂いたリンク
SoftEther VPN プロジェクト
AWS(EC2)でSoftEtherを使ってL2TP/IPsecなVPNを構築する (Mac)
[Amazon VPC] ハードウェアVPN接続についてまとめてみた Developers.IO
[Amazon VPC] ハードウェアVPN接続を設定する Developers.IO