3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(WindowsServer2008)会社と自宅間で L2TP/IPSec VPNを構築してみた

MCP70-642の勉強中で出てきたリモートアクセス用のVPNを会社~自宅間でテスト構築してみることにしました。

VPNサーバは Windows Server 2008 で、NAPTによりインターネットにアクセス可能です。

ネットワーク図は下記のような感じです。

VPNサーバ側の設定

まずは Windows Server 2008 で役割の追加で「ネットワークポリシーとアクセスサービス」から「リモートアクセスサービス」をインストールします。

管理ツール「ルーティングとリモートアクセス」から、サーバを右クリックし「ルーティングとリモートアクセスの構成と有効化」を押下します。

これで「ルーティングとリモートアクセスサーバーのセットアップウィザード」が開始します。

●ネットワークカード(NIC)が2枚以上ある場合

構成 は「リモートアクセス(ダイヤルアップまたはVPN)」にします。

「リモートアクセス」では「VPN」にチェック。

VPN接続 で、ネット側のNICを選択します。その際、「静的パケットフィルタをセットアップしてセキュリティを有効にする」のチェックは外します。

(このチェックがついていると、VPN以外のパケットは通さなくなるため、LAN内からサーバへの通常アクセスもできなくなります。VPNサーバをルータ替わりで使うときに使うオプションだと思われます。このチェックはNICのプロパティの「入力フィルタ」、「出力フィルタ」に反映されます。)

IPアドレスの割り当て で「自動」にしとくとDHCPを使ってアドレスを割り当てることができ、「指定したアドレス範囲」にしとくと次の画面で払いだすIPを設定することができるようです。

NICが1枚しかない場合

構成 は「カスタム構成」→「VPNアクセス」にします。(「リモートアクセス」にしてもNICが1枚しかないとダメだと怒られます)

今回はNAT内部にリモートアクセスサーバを置いているので、特別なフィルタリングはしません。

なので、NICのプロパティで全ての通信を許可するようになっていることを確認します。(最初は「静的パケットフィルタをセットアップしてセキュリティを有効にする」のチェックを入れてせってしたため、フィルタが生成され通常通信できずにかなりハマりました。)

ルーティングとリモートアクセスサーバーの役割インストール後、「リモートアクセスのログとポリシー」を右クリックし「NPSの起動」を押下します。

すると「ネットワークポリシーサーバー」が起動するので、ここでリモートアクセスを許可するポリシーを作成していきます。

「ネットワーク接続の方法」には「リモートアクセスサーバー」を指定。

条件の選択で指定したWindowsグループのアカウントに許可を与えます。

続けて認証の方式(今回は MS-CHAPv2 のみ許可)や制約(セッション時間や時刻など)、暗号化のポリシーを決めていきます。

今回は L2TP/IPSec を用いるので、それ以外のVPNプロトコルは無効しておきます。

管理ツール「ルーティングとリモートアクセス」の「ポート」のプロパティから各VPNの構成でセッション数や有効無効が設定できます。

本来 IPSec では証明書を使ったコンピュータ認証をするのがセキュリティ的に望ましいのですが、今回はテスト接続ということで、キー文字列による暗号化をするように設定します。

L2TP/IPSecでは L2TPIPSecカプセル化しているため、IPSecで使うポートを開放する必要があります。

開放する必要があるのは

 UDP 500 (IKE:鍵交換で必要)

 IPプロトコル番号 50 (ESPプロトコル)

です。

しかし、IPSecには NAT や NAPT を介するとその際のプロトコルやポート変換を、IPSecが改ざんとみなすため、正常に通信ができません。

これを回避するための方法が NAT-T (NATトラバーサル)というもので、IPSec のパケットをさらにUDPのパケットでカプセル化するというものです。

使う UDP は 4500 ポートです。

Windows Server 2008ではもともとNAT-Tにも対応済みなので、サーバ側OSの設定で特にすることはありません。

ということで、ルータ側でポートフォワーディングするのは下記のような設定になります。

 UDP 500 → 192.168.1.10へ

 UDP 4500 → 192.168.1.10へ

(ルータでファイアウォールの設定してる場合は、UDP 500,4500 の外向き通信も許可しないといけません。またサーバのファイアウォールでも上記ポートを開放しておきます。)

VPNプロトコルで必要なポートはTechNet:VPN およびファイアウォールで参照できます。

NAT-Tの概要はIPsec - NAT Traversalでわかりやすく解説されています。

ここからはクライアントの設定です。

Vistaの場合

コンパネの「ネットワークと共有センター」のタスクから「接続またはネットワークのセットアップ」を押下します。

「職場に接続します」を選択します。

「インターネット接続(VPN)を使用ます」を選択します。

ここで、接続するルータのダイナミックDNS名を入れます。(固定IP持ってるならそっちのほうがいい)

そして、「今は接続しない」にチェックを入れます。

VPNサーバ上でVPN接続が許可されているグループに所属するユーザアカウントを入力します。

接続の使用準備ができました 画面では、「閉じる」を押下します。

後は、暗号化や認証等の細かい設定が必要なので、コンパネの「ネットワーク接続」より、先ほど作成した接続のプロパティを表示します。

「ネットワーク」タブで、VPNの種類を「L2TP IPsec VPN」にします。

そして、「IPsec 設定」ボタンを押下し、「認証に事前共有キー」を使うをチェックし、サーバ側と同じキーを入力します。

これで、設定を保存し、ダイアログを閉じます。

●XP の場合(SP2以上必須)

コンパネの「ネットワーク接続」からネットワークタスクの「新しい接続を作成する」を押下します。

「職場のネットワークへ接続する」を選択します。

「仮想プライベートネットワークに接続」を選択します。

「接続名」は適当で、「ホスト名またIPアドレス」に接続するルータのダイナミックDNS名を入れます。(固定IP持ってるならそっちのほうがいい)

ウィザードが完了するとすぐに接続用ダイアログボックスが開くみたいなので、「プロパティ」を押下します。

このプロパティで IPSec の事前共有キーの設定をするんですが、Vistaと押下するボタンが違うので注意が必要です。

「セキュリティ」タブの「IPSec 設定」を押下します。

そしたら、事前共有キー入れるダイアログボックスが開くのキーを入力します。

「ネットワーク」タブで、VPNの種類を「L2TP IPsec VPN」にします。

これで、設定を保存し、ダイアログを閉じます。

これで済めば楽なんですが、例の NAPT 絡みでこれだけではつながりません。

クライアント側で NAT-T を使えるように設定してやらないといけません。初期設定では NAT-T つかない設定らしいのです。

これがどうやらレジストリ使うしか方法がなさそうなのです。。(しかもXPとVistaじゃ場所違うし、XPはどうやらSP2以上が必要)

追加するレジストリのキーと値は下記の通りです。

・キー

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPSec (XPの場合)

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent(Windows Vistaの場合)

・値の名前

 AssumeUDPEncapsulationContextOnSendRule

・値の種類

 REG_DWORD

・値

 0 (NAT-T無効。デフォルト)

 1 (片一方がNATの背後)

 2 (サーバ、クライアント共にNATの背後)

このクライアントのNAT-T対応は、MS:ネットワーク アドレス変換 (NAT) の使用に関する問題や、第2回 VPNを使って安全・簡単なリモート接続 その2で詳しく解説されてます。

レジストリ設定後、クライアントPCを再起動します。

これでネットワーク接続で、作成したVPNを接続すればつながります。

自宅も会社も同じフレッツIPv6網なので、試しにその網を使ってIPv6通信してみました。

クライアント側は接続先をVPNサーバが持っている IPv6 アドレス(NTTから払いだされる 2001:xxx に変更するだけでOKです。

サーバ側も特に何もしなくてもOKでした。(ルータやFWでIPv6UDPを許可する必要はありますが。。)

ルーティングとリモートアクセスのサーバのプロパティで「IPv6リモートアクセスサーバー」や「IPv6転送を有効にする」にチェックを入れないといけないのかと思ってましたが、なくても行けます。(チェック入れるとクライアントの PPP のアダプタに IPv6 アドレスが振られるようです。ただ、今回はVPNのトンネルさえIPv6でつなげれば、中はIPv4でもかまわないのでチェックなしにしてます)

ちなみに、TinyVPNとL2TP/IPsecとで会社~自宅間のVPNのベンチ結果です。

TinyVPN 1.3MB/s

L2TP/IPSec 2.4MB/s

追記:

VPNサーバとDNSサーバ同じ場合、問題が生じるようです。

詳しくは(WindowsServer2008)会社と自宅間で L2TP/IPSec VPNを構築してみた (その2)を参照。