« ZZTセリカ(1ZZ/2ZZエンジン)で使えそうなサーモスタット | トップページ | Autogauge製ファンコントローラーAGTT-03について »

クライアント版WindowsをL2TP/IPSecサーバーにしてiPhoneから接続する

 PPTPと(カプセル化されていない「素」の)MS-CHAPv2を組み合わせた場合の脆弱性が明らかになり、クライアント版Windows(XP、7など)でも利用できるPPTPサーバー(着信接続)機能を、よりセキュアな方式で代替する必要が出てきた。ここではiPhone(iOSデバイス)をクライアントとして接続することを念頭に、Windows 7をL2TP/IPSecサーバーとして利用する方法を説明する。

前提

  • ルーターが存在しない(サーバーとなるマシンがネットに直接接続)、ルーターがVPN(IPSec)パススルーに対応していて設定できる、あるいは自分でポートが開けられる。
  • L2TP/IPSecサーバーとなるマシンのWAN側アドレスを知っている。(グローバルIPアドレス固定、DDNS利用など)

既にWindows 7をPPTPサーバーとしてiPhoneから接続したことがある場合は、特に問題なくL2TP/IPSecに移行できると思われる。

2012-10-10:
証明書トリックを追記、手順を整理。
2013-04-05:
Vistaに関する記述を訂正。
2013-07-24:
コピーした証明書の削除に関する記述を訂正。

手順

①証明書の設定

  1. スタートボタンをクリックして検索ボックスに「mmc」と入力、必ず管理者権限でmmc(管理コンソール)を開く。
  2. 「ファイル」メニューから「スナップインの追加と削除」を選ぶ。
  3. ダイアログが表示されるので、「利用できるスナップイン」の中から「証明書」を選択して「追加」をクリックする。
  4. 「証明書スナップイン」ダイアログで「コンピューターアカウント」ラジオボタンを選択して「次へ」。
  5. 「ローカルコンピューター」ラジオボタンが選択されていることを確認して「完了」。
  6. 「OK」をクリックして「スナップインの追加と削除」ダイアログを閉じる。
  7. 左ペインの「証明書(ローカルコンピューター)」を展開して、「信頼されたルート証明機関」の証明書から「目的」が「<すべて>」になっている、もしくは「サーバー認証, クライアント認証」が含まれているものをどれでも良いので1つ探して「個人」フォルダにコピーする。
     

②着信接続(L2TP)の作成

  • 「コントロールパネル」からたどって「ネットワーク接続」を開き、「新しい着信接続」を作成しておく(PPTPと同様のため詳細割愛)。既にPPTPサーバーとして利用している場合も、一旦既存の「着信接続」を削除して作り直す。

③IPSecの設定

  1. 「セキュリティが強化されたWindowsファイアウォール」を管理者権限で開く。
  2. 左ペインから「セキュリティの規則」を選択。
  3. 「操作」から「新しい規則...」を選ぶとダイアログが開くので、「カスタム」ラジオボタンを選択して「次へ」。
  4. エンドポイントのIPアドレスは特に指定せず「任意のIPアドレス」のまま「次へ」(もしくは「エンドポイント1」にサーバー機のアドレスを入れる)。
  5. 「受信接続と送信接続の認証を要求する」を選択して「次へ」。
  6. 「詳細設定」を選択して「カスタマイズ」ボタンをクリック。
  7. 「詳細な認証方法のカスタマイズ」ダイアログが開くので、「1番目の認証方法」枠の「追加」を選び、「事前共有キー(推奨されません)」ラジオボタンを選択し適切なキーを入力して「OK」をクリックする。(半角英数記号で20文字以上推奨、256文字まで(?)。長ければ長いほど良い)これがiPhone上で言う「シークレット」となるが(後述)、「"(ダブルクオーテーション)」はiPhone側のバグ(仕様?)で利用できないので避ける(キーが一致していても「応答しません」になってしまう)。また「|(バーティカルバー、縦線)」もWindows側の設定ダイアログにはじかれて使用できない。
  8. もう一度「OK」をクリックしてダイアログを閉じ、「次へ」。
  9. 「プロトコルの種類」は「L2TP」もしくは「UDP」を選び、「UDP」を指定した場合は「エンドポイント1のポート」を「特定のポート」にし、「1701」と入力して「次へ」。
  10. 適宜L2TPを利用する予定のネットワークのプロファイルを選択して「次へ」。わからなければ全てにチェックを入れておく。
  11. 「名前」欄には「IPSec PSK for L2TP」、「説明(省略可)」欄には「L2TP/IPSecサーバー用のIPSec設定」などと入力して「完了」をクリック。
  12. 作成された規則が「有効」になっていることを確認しておく。

④ルーターのポートを開ける

  • 対象は、UDP500、UDP4500の3つ。UDP1701を開ける必要はない。
  • PPTPからの切り替えの場合はUDP1723とGRE(プロトコル番号47)を閉じておく。

⑤iPhoneの設定

  1. 「設定」、「一般」、「ネットワーク」、「VPN」とたどり、「VPN構成を追加...」を選んで「L2TP」から各種設定を入力する。
  2. 「説明」は「自宅VPN」などと入力。これはあとで「VPN」画面に表示される。
  3. 「サーバ」欄にはサーバーにアクセス可能なグローバルIPアドレスもしくは完全修飾ドメイン名を入力。
  4. 「アカウント」は着信接続を作成・設定したときに指定したユーザーアカウント名。
  5. 「RSA SecurID」はオフ。
  6. 「パスワード」には着信接続を作成・設定したときに指定したユーザーに設定したパスワードを入力。
  7. 「シークレット」欄に先ほどの「事前共有キー」を入力。
  8. 「プロキシ」は「オフ」。
  9. 以上の設定を「保存」して、追加した構成を選択した状態で「VPN」を「オン」にすればWindows 7のVPN(L2TP/IPSec)サーバーに接続される。

備考

  • 上記手順は、Windows 7 SP1とiPhone 4S(iOS 5.1.1/6.0)で確認。事前共有キー(共有シークレット)ではなく、証明書を使ったL2TP/IPSec接続は、(記事執筆時点では)iOS側の仕様で利用できない。
  • ポイントは、証明書(ローカルコンピューター)スナップインを利用して、「個人」フォルダに何らかの証明書が入った状態で「着信接続」を作成するというトリック。これをやらないとWindowsはL2TPを受け付けない。この証明書はWindowsにL2TPを有効にさせるためのスイッチの役目でしかなく、L2TP/IPSecそのものの認証や暗号化とは一切関係がない。着信接続を作った後、「個人」フォルダの証明書を全て削除して再起動するとL2TPが無効になる場合があるため削除しないことを推奨。
  • PPTPの場合と違い、L2TP/IPSecサーバーとなったWindowsマシンは自分自身にL2TP/IPSec接続することができない。接続テストにはiPhoneを用いるか、他のWindowsマシン等を用意する必要がある。
  • iPhone構成ユーティリティ」を使ってプロファイルを構成、iPhoneにインストールすると、PC上で事前共有キー(共有シークレット)などを入力できるので手間と間違いが減る。
  • Windows XPでも「ローカルセキュリティポリシー」内から「IPセキュリティポリシー」を作成することでL2TP/IPSecサーバーになれるが、IPSecの暗号化にAESが利用できず3DESとなる。3DESはAESと比べて弱い上に遅い。iPhoneはAESをハードウェアで処理できるので、できればWindows 7機をサーバーにしてAESで使いたいところ。
    Windows 7であっても「IPセキュリティポリシー」を使って設定してしまうと暗号化が3DESになってしまうので注意。
  • Windows 7の場合は「ローカルセキュリティポリシー」内から「接続セキュリティ」の設定をしない。これをやると、暗号化の掛からない規則ができてしまう。必ず単独の「セキュリティが強化されたWindowsファイアウォール」を管理者権限で開いて設定する。
  • IPSecの状態は「セキュリティが強化されたWindowsファイアウォール」内の「監視」、「セキュリティアソシエーション」の「メインモード」と「クイックモード」から確認できる。XPの場合は管理コンソール(mmc.exe)から「IPセキュリティモニタ」スナップインを追加する。暗号化が「なし」などになっていないか要確認。
  • 「セキュリティが強化されたWindowsファイアウォール」の「プロパティ」から「IPSecの設定」タブを開き「カスタマイズ」ボタンをクリックして「キー交換(メインモード)」と「データ保護(クイックモード)」をそれぞれ「詳細設定」を選択して「カスタマイズ」すると、既定の「AES-CBC 128」に加えて「AES-CBC 256」を設定できる。iPhoneはこれに対応しているので「追加」しておく。
  • 接続テストなどで頻繁に接続と切断を繰り返すとつながらなくなることがある。設定を変えていないのにつながらなくなった場合は、あわてず騒がず5分ほど待ってからやり直す。
  • 設定が全て正しい(はずな)のにiPhone側で「サーバーが応答しません」となる場合は、事前共有キー(共有シークレット)を短くするか、キーに含まれる記号を減らしてみる。前述の通り「"」はトラブルの元なので絶対に使わない。
  • どうしてもうまくいかない場合は一旦PPTPで接続できるかどうか試してみる。きちんと設定されポートが開いていれば、サーバー側の設定を変更することなく同じユーザー名(アカウント)とパスワードでPPTPでもL2TP/IPSecでも接続できる。PPTPとL2TP/IPSecでは利用するUDPのポートが違うことに注意。
  • 証明書を使う場合(iPhoneでは不可)は、SimpleAuthorityでSelf-signed CA(自己署名認証局)を作る→New User(新しいユーザー)を作る→New Certificate(新しい証明書)を「General Purpose」で作る→生成された*.p12をWindowsの「証明書(ローカルコンピュータ)」内「個人」フォルダにインポート→インポートされた2つの証明書のうち、CAを「信頼されたルート証明機関」に移動→着信接続を作る(作り直す)→再起動する、というような流れになる。「接続セキュリティの規則」でIPSecの設定は不要。下記のサイトも参照。

参考

Windows XP Pro as a L2TP IPSec VPN Server
http://rotwhiler.wordpress.com/2009/04/09/windows-xp-pro-as-a-l2tp-ipsec-vpn-server/
証明書を使う場合の方法が書かれている。Android等に応用可能と思われる。

The default behavior of IPsec NAT traversal (NAT-T) is changed in Windows XP Service Pack 2
http://support.microsoft.com/kb/885407/
How to configure an L2TP/IPsec server behind a NAT-T device in Windows Vista and in Windows Server 2008
http://support.microsoft.com/kb/926179/
マイクロソフトはIPSecを使うサーバーにはパブリックIPアドレス(グローバルIPアドレス)を振ることを推奨している。NAT経由でIPSecを利用するためには、上記のKBに従ってレジストリの設定変更が必要。

|

« ZZTセリカ(1ZZ/2ZZエンジン)で使えそうなサーモスタット | トップページ | Autogauge製ファンコントローラーAGTT-03について »

PC/ネットワーク」カテゴリの記事

コメント

Windows VistaでL2TPサーバを構築しようと参考にさせてもらいましたが、③IPSecの設定の9.プロトコルの指定ができず(ページが出てこない状態)はまっています。
何か心当たりがあれば教えてください。

投稿: | 2013年1月25日 (金) 23時45分

コメントありがとうございます。
Vista環境では一切検証していなかったにもかかわらず、Vistaでも7と同様にできるような紛らわしい記述になっていて申し訳ありません。
GUIからプロトコルを指定することができないのはVistaの仕様で、代わりにnetshコマンドを使う必要があるようです。管理者権限でコマンドプロンプトを起動して、以下のようにしてみてください。

netsh advfirewall consec add rule name="IPSec PSK for L2TP" endpoint1=any endpoint2=any action=requireinrequireout description="L2TP/IPSecサーバー用のIPSec設定" protocol=115 auth1=computerpsk auth1psk=

しかし残念ながら、この設定を行っても自分の手元ではVistaに対してiPhoneからL2TP/IPSec接続するところまで確認できませんでした。メインモードで繋がった後クイックモードに移行しないので、Vistaの場合この記事の手順ではL2TPを受け付けるようにならないようです。何か分かればコメントか記事中に追記します。

投稿: MKT | 2013年1月27日 (日) 02時12分

アドバイスありがとうございました。
まさか仕様とは思いませんでした・・・
http://technet.microsoft.com/ja-jp/library/cc725940(v=ws.10).aspx
にもGUIで設定可能な記述がありますし。

ただ、クライアント・サーバともにNATの裏にいるためKB926179のレジストリ変更はしていますが、エラー809でつながりませんでした。
サーバとは物理的に遠い場所にいるため、ローカルでの接続試験はできておらず原因の切り分けはできていません。
何にせよやはりVistaでは難しいようです。

投稿: | 2013年1月27日 (日) 16時57分

こんにちは。

こちらの記事を参考にWindows7でL2TP/IPSecの設定が行えました。

Windows7で設定できるのはPPTPのみで、IPSecを使用するにはWindows Serverを使わないとできないと思っていたので、目からうろこでした。

私の場合はi-phoneではなくAndroidでしたが、この方法で問題なく接続できています。Android4.0.3はIPSecにバグがあると何かの記事で読んだのですが、意外にもこれといった問題はありませんでした。

着信設定を行うと、時計の横のタスクトレイ中にあるネットワークのアイコンに赤いバツがつくんですね。(着信設定を削除したら消えました)

インターネット自体は行えているので、特に問題ではないのですが、少しだけ気になります(^^;

投稿: ペンギン | 2013年3月 9日 (土) 10時20分

Androidがクライアントでも動作したとの報告、ありがとうございます。

Vistaはこの方法でL2TP/IPSecサーバーにすることはできないようなので、記事を訂正しました。Vistaユーザーの皆様ご迷惑をおかけしました。検証していませんが、XPと同様の方法で暗号化方式が3DESであれば動作するのではないかと思っています。

今更なのですが、この方法はかなりトリッキーですので、同じWindowsマシンをL2TP/IPSecサーバーにするという目的であれば、先日公開されたSoftEther VPN(Packetixのフリー版)を利用するのが真っ当と思われます。そちらであればL2TP/IPSecに限らず様々なVPN接続を収容できます。

投稿: MKT | 2013年4月 5日 (金) 19時37分

古い記事へのコメントで申し訳ありません。
当方、Windows 7 + Softether VPN にてAndroidデバイスとVPNを構築しています。
もちろんWindows機はルータの背後にあり、UDP(500/4500)、ESPをマッピングした状態です。

今回、Softether VPNを使用せず、WindowsのみでVPNを構築できないか調べていて、このブログに辿り着きました。
有用な記事、ありがとうございます。

参考にさせて頂き、幾度か試してみたのですが、なかなかうまく行かないのでアドバイス頂けませんでしょうか。
問題があるのは、「着信接続」の作成時のようです。

>ポイントは、証明書(ローカルコンピューター)スナップインを利用して、「個人」フォルダに何らかの証明書が入った状態で「着信接続」を作成するというトリック。これをやらないとWindowsはL2TPを受け付けない。

上記を参考にしているのですが、見た目は着信接続の作成ができるもののイベントビューアでは警告が発生しており、着信接続が動作しないように見えます。
出力されている警告は下記のようなものです。

http://support.microsoft.com/kb/947026/ja からの引用です
------
Secure Socket トンネリング プロトコル サービスは、SHA256 の証明書のハッシュ値をレジストリから読み取れませんでしたか、データが無効です。有効にするのには、証明書ハッシュことが必要は、SHA256 入力 REG_BINARY と 32 バイトの長さ。SSTP によって他のシステム障害のために、レジストリから値を取得できません。詳細なエラー メッセージを以下に示します。このサーバーで SSTP 接続は認められません。問題を解決して、もう一度やり直してください。
システムは指定されたファイルを見つけることができません。
------

証明書の読み込みに失敗しているようですが、上記の引用ページを読んでもよく解りません。
もし何かご存知でしたらご教示頂けませんでしょうか。
MKTさんの接続可能な環境でも同様の警告が出ていたりしますでしょうか。

投稿: | 2013年7月24日 (水) 13時15分

コメントありがとうございます。
運用中の環境をチェックしてみたところ、過去の試行錯誤していた時期に同様のエラーがイベントログに記録されていましたが、今回手元の検証では再現することができませんでした。そのエラーそのものがL2TP/IPSecのVPNとどういう関係にあるのかも私のレベルではよくわかりません、すみません。
しかしながら、いくつか思い当たる点がありますので、試してみてください。

1. SoftEther VPNがインストールされている場合はそのL2TP/IPSec機能を無効にする
「SoftEther VPN サーバー管理マネージャ」から「IPSec / L2TP 設定」ボタンをクリック、「L2TP サーバー機能を有効にする (L2TP over IPsec)」のチェックを外してください。
SoftEther VPNはL2TP/IPSecを有効にすると、「IKE and AuthIP IPsec Keying Modules」サービスを停止させWindowsのIPSecを無効にしてしまうようです。

2. SoftEther VPNのTCPポート443のリスナーを停止する
「SoftEther VPN サーバー管理マネージャ」の「リスナーの管理」、「リスナーの一覧」から「TCP 443」を選択して「停止」をクリックしてください。
これで「RasSstp」絡みのエラーは止まるのではないかと思います。

問題の切り分けのためには「SoftEther VPN Server」サービスを停止させるか、一旦アンインストールするのも手かと思います。アンインストールしてもSoftEther VPNの設定はそのまま残りますので、再インストールすれば元通りです。

3. 「証明書(ローカルコンピューター)」スナップインで「個人」フォルダにコピーした証明書を削除しない
これについては記事を訂正しました。

上記の3点を押さえた上でもう一度「着信接続」を作成してみてください。
もし既にSoftEther VPNを停止あるいはアンインストールされていた場合は……ごめんなさい。何か他に競合しそうなソフトやサービスが入っていないか、手順を間違えていないか、違う証明書をコピーの際に使ってみるとか、という程度のことしか今のところは言えません。

投稿: MKT | 2013年7月24日 (水) 20時09分

MKTさん、お世話になります。
早々にご回答頂き、ありがとうございました。
ご教示頂きました項目について試してみました。
結果、、、VPNを張ることができました。
原因は何だったかといいますと、Routing and Remote Access サービスが無効でした。お恥ずかしい限りです。。。

SoftEther VPNをアンインストールし、IKE and AuthIP IPsec Keying Modules サービスの確認をしていて気付きました。
Routing and Remote Access サービスもSoftEther VPNによって無効になってたなぁと。
サービスを起動させると、何の苦もなく成功してしまったというオチです。
仰る通り、L2TP/IPSecのVPNとSSTPの警告は関係なかったようです。

なお、RasSstpの警告は未だ発生中です。
443を占有するものなどを完全に除外した状態で、RasSstpの「エラー」は確かに出なくなりましたが、前述した「警告」は消えそうにありません。これについては、関係無いものも含めた全証明書をコピーしてみたり、有効とされる証明書(サーバ認証とクライアント認証を含むもの)をランダムにコピーして着信接続を作成してみたりしましたが、解決できませんでした。
「VeriSign Universal Root Certification Authority」がうまく行かなかった時点であきらめました。
前述のKB947026がヒントになるのだと思いますが、どうやって対応していいのか。。。といったところですし、MKTさんの現在の環境で再現しないということから、当方の環境に何か問題があることは明白だということは判りました。
追々解決できればと考えています。

ともかく、うまく構築できて良かったです。
OSの機能で完結できるものはそれを使おうと思い今回に至っているわけですが、Androidからのファイル閲覧など少し試してみて、SoftEther VPNの仮想HUBやローカルブリッジが恐ろしく使いやすいというか、いろいろサボれるものだと思い知らされました。
逆に、OS単体だと仕掛けの一つ一つがよく判る感じがしますね。
今まで、Androidのみならず幾つかのWindowsクライアントとのRDP/VNCも運用していたのですが、WindowsのVPNを利用したものへすべて移行してみて比較してみたいと思います。
ありがとうございました。

投稿: | 2013年7月27日 (土) 01時19分

古い記事にコメントして申し訳ありません。

この記事のおかげでwin7で無事L2TP接続できたのですが、PCを再起動すると接続できなくなってしまいます。そのような事象はそちらでは発生していませんでしょうか?

「セキュリティが強化されたWindowsファイアウォール」の「接続セキュリティの規則」のところで、追加した規則を一度「無効」→「有効」にすると接続できるようになります。

Nortonのセキュリティソフトが入っているので、それが悪さしている可能性も否定できませんが、そちらのファイアウォールは停止しているつもりです。

Nortonをアンインストールして見る以外に何か考えられる手はありますでしょうか。

投稿: saito | 2015年9月28日 (月) 09時22分

コメントありがとうございます。
自分の環境ではそういった現象が起きたという記憶はないのですが、まずは再起動直後に「IKE and AuthIP IPsec Keying Modules (IKEEXT)」サービスが「自動」で「開始」されているかどうか確認してみてください。
手元で簡単に試してみたところ、IKEEXTを「停止」させた状態でL2TP/IPSecのための規則を無効状態から有効化すると、自動的にIKEEXTが「開始」され、そのスタートアップの種類が「手動」に設定されていた場合は「自動」に切り替わるようです。
つまり、何らかの理由でマシンの起動時に必須サービスであるIKEEXTが自動的に開始されていない(あるいは停止させられている)ために、規則を一旦無効にし再度有効化することでIKEEXTが初めて「開始」される状態にあるのではないか、という推測です。この場合、「何らかの理由」というのが何か、すなわち何が実際に悪さをしているかというのは、イベントログなどを当たってみてください。
また、Nortonシリーズがインストールされたマシンが当方にはありませんのでNortonとの因果関係は検証できませんが、IKEEXTが依存している「Base Filtering Engine (BFE)」サービスに関して、Nortonがインストールされた環境でトラブルの報告があるようです。IKEEXTと合わせてそちらもチェックしてみてください。

投稿: MKT | 2015年9月29日 (火) 00時00分

さっそくの回答ありがとうございました。

教えていただいたIKEEXTの状態を確認してみましたが、再起動後も「開始」となっていました。
また、NortonのBFEに関する不具合が存在するとの情報を教えていただきありがとうございます。
こちらでもちょっとクグッてみましたが、BFEが停止しているという症状のようですが、自分の環境では開始していたので、この問題ではなさそうかなと感じています。

いずれにしても、教えていただいた情報を確認することで、とても良い勉強になりました。ありがとうございます。今後は別のウィルス対策ソフトに切り替えて、再検証してみたいと思っています。


投稿: saito | 2015年9月29日 (火) 06時56分

本記事を参考に、一応は、iPad(iOS 9.0.1)接続せきるようになったのですが、なぜか事前共有キーを、"12345。。。"といった単純なものにしないと接続できません。
数値を一部入れ替えるだけで接続できなくなります。何かわかるでしょうか?
これでは、あまりに単純な共有キーなので、セキュリティ上あまり、PPTPと変わらない気がします。

投稿: | 2015年10月 1日 (木) 11時41分

windows10でも接続することができました。まとめて頂きありがとうございました。

投稿: | 2016年7月 5日 (火) 00時50分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/546374/55508182

この記事へのトラックバック一覧です: クライアント版WindowsをL2TP/IPSecサーバーにしてiPhoneから接続する:

« ZZTセリカ(1ZZ/2ZZエンジン)で使えそうなサーモスタット | トップページ | Autogauge製ファンコントローラーAGTT-03について »