可用性の高いオンプレミス VPN ゲートウェイの構築
このポストは、7 月 9 日に投稿した Building a highly available on-premises VPN gateway の翻訳です。
概要
ハイブリッド ネットワーキングを利用すると、オンプレミスのネットワークを Azure などのクラウド サービス プロバイダーに接続することができます。多くの企業がワークロードをクラウドに移行するにつれて、クラウドへの接続に高い可用性が求められているようになってきました。この記事では、Windows Server テクノロジを利用してオンプレミスのサイト間 VPN ゲートウェイを 2 つのノードから構成されるフェールオーバー クラスターで構築し、Azure に接続する方法について説明します。フェールオーバー クラスタリング機能を使用すると、ソフトウェアのバグやハードウェアの問題によってクラスター ノードで障害が発生した場合に、ノードで実行中のサービス、すなわちサイト間 VPN が即座に別のノードに移され、サービスのダウンタイムを最小限に抑えることができます。
トポロジのセットアップ
以下は、これからセットアップする 2 つのノードから構成されるクラスターの論理トポロジを図で表したものです。
この 2 つのノードは 3 つのネットワークに接続しています。外部ネットワークはパブリック インターネットに接続し、内部ネットワークは社内のオンプレミス ネットワークに接続しています。管理サービスとクラスター サービスは第 3 のネットワークで実行します。
前提条件
サイト間 VPN ゲートウェイは、Hyper-V サーバーにホストされている 2 つの Virtual Machines で実行するよう構成します。Virtual Machines と Hyper-V サーバーの両方で Windows Server 2012 R2 を実行します。
Hyper-V サーバーは 3 つのネットワークすべてに接続します。Hyper-V スイッチはあらかじめ構成されています。Virtual Machines の VHD はすぐに使用できる状態です。
フェールオーバー クラスタリングでは、すべてのクラスター ノード (ここでは 2 つの Virtual Machines) をドメイン参加させる必要があります。このため、Active Directory サーバーを管理/クラスター ネットワークで実行するようにあらかじめ構成しておく必要があります。
2 つのノードから構成されるクラスターは、第 3 の「監視機能」を使用するのが好ましいです。そうすることで、2 つのノードが互いに通信できなくなった場合に、この監視機能がアクティブなノードを指定することができます。ここでは、監視機能としてファイル共有を使用します。ファイル共有は管理/クラスター ネットワークで実行されているあらかじめ構成されたファイル サーバー上にあります。
DHCP はこれら 3 つのネットワークのどれにも使用しません。 2 つの Virtual Machines の管理 IP は管理ネットワーク インターフェイスで静的に構成されます。内部/外部ネットワーク インターフェイスは最初に APIPA を取得します。「真の」内部 IP アドレスと外部 IP アドレスは、下に説明するように、クラスター リソースとして割り当てられます。
構成
構成手順を次の 2 つのセクションに分けて説明します。
- Hyper-V ホストの構成
- Virtual Machines の構成
Hyper-V ホストの構成
次の PowerShell 構成を、1 つ目の Virtual Machines をホストする最初の Hyper-V ホストに適用します。名前を除いて、2 つ目の Virtual Machines の同じ構成を 2 つ目の Hyper-V ホストに適用します。
#外部スイッチおよび内部スイッチをあらかじめ構成します。 $externalSwitch = “Internet” $internalSwitch = “OnPrem”
#2 つ目の Virtual Machines の名前を変更するのを忘れないようにしてください。 $vm = “VPN_GW_1″
#VHD パスを入力します。 new-vm $vm -SwitchName $externalSwitch -VHDPath <VHD Path> -MemoryStartupBytes 2GB -Generation 2
#この VM NIC は外部スイッチに接続され、パブリック インターネットにつながります。 Rename-VMNetworkAdapter -VMName $vm -NewName InternetNIC
#内部ネットワークに接続する VM NIC を追加します。 Add-VMNetworkAdapter -VMName $vm -VMNetworkAdapterName InternalNIC -SwitchName $internalSwitch
#管理/クラスター ネットワークに接続する VM NIC を追加します。 Add-VMNetworkAdapter -VMName $vm -VMNetworkAdapterName ManagementNIC -SwitchName $internalSwitch
#ここでは、管理/クラスター ネットワークを VLAN 2 に作成します。 $managementVLAN = 2 Set-VMNetworkAdapterVlan -VMName $vm -VMNetworkAdapterName ManagementNIC -Access -VlanId $managementVLAN
#ここでは、内部ネットワークを VLAN 11 に作成します。 $internalVLAN = 11
#内部 NIC でのマルチテナントを有効にします。このブログ内の説明を参考にしてください。 Set-VmNetworkAdapterIsolation -VMName $vm -VMNetworkAdapterName InternalNIC -MultiTenantStack On -IsolationMode Vlan -AllowUntaggedTraffic $true Add-VmNetworkAdapterRoutingDomainMapping -VMName $vm -VMNetworkAdapterName InternalNIC -RoutingDomainID “{10000000-1000-1000-1000-000000000001}” -RoutingDomainName “Onprem” -IsolationID $internalVLAN -IsolationName “OnPremVLAN”
Start-vm$vm |
VLAN は外部 NIC (“InternetNIC”) 用には構成されていません。外部 NIC と、Hyper-V ホストが接続している物理ネットワークとの間のトラフィックはタグ付けされていません。
Set-VmNetworkAdapterIsolation (英語) および Add-VmNetworkAdapterRoutingDomainMapping (英語) が主な構成情報です。ゲートウェイがマルチテナント モードの場合に限り、サイト間 VPN 向けのフェールオーバー クラスタリングがサポートされています。 これらの 2 つのコマンドレットで Virtual Machines をマルチテナントにセットアップします。具体的には、内部ネットワーク用に別途ルーティング ドメイン「Onprem」を追加します。VLAN 11 はこのルーティング ドメインのトラフィックの識別子です。ルーティング ドメイン ID と名前をメモしてください。使用方法は後ほど説明します。
これで、ホストの構成は完了です。2 つの Hyper-V ホスト用にフェールオーバー クラスターを作成する必要はありません。
Virtual Machines の構成
この時点で、どちらの Virtual Machines も実行されています。先に進む前に、これらの Virtual Machines で次の構成を行います。
- Active Directory にホストされているドメインに参加します。
- ドメイン ユーザーを管理者として追加します。
- 外部ネットワークに接続しているネットワーク アダプターの名前を「Internet」に変更します (任意で、内部ネットワーク アダプターの名前と管理ネットワーク アダプターの名前を変更します)。
- フェールオーバー クラスタリングをインストールする。次の 2 つの PowerShell コマンドレットを実行するのが簡単です。
Get-WindowsFeature *cluster* | Install-WindowsFeature Get-WindowsFeature *file* | Install-WindowsFeature |
フェールオーバー クラスタリングをインストールしたら、次の構成を 2 つの Virtual Machines のいずれか 1 つで実行します。
#2 つの Virtual Machines はそれぞれ、「VPN_GW_1」と「VPN_GW_2」に名前が変更されています。 $clustername = “OnPremGW” $clusternodes = @(“VPN_GW_1″,“VPN_GW_2″) new-cluster -Name $clustername -Node $clusternodes -NoStorage
#「Cluster」はあらかじめ構成されたファイル サーバー上のファイル フォルダーです。 Set-ClusterQuorum –FileShareWitness “\\FS\Cluster”
# 内部ネットワーク用の内部 IP アドレスを 1 つ追加します。 $res = Add-ClusterResource -ResourceType “Disjoint IPv4 Address” -Name “InternalAddress” -Group “Cluster Group” $res | Set-ClusterParameter -Multiple @{“PrefixLength”=“24″;“Address”=“192.168.200.1″;“VSID”=“11″;“RDID”=“{10000000-1000-1000-1000-000000000001}”} Start-ClusterResource$res
# インターネットに接続する外部 IP を追加します。 $res = Add-ClusterResource -ResourceType “Disjoint IPv4 Address” -Name “ExternalAddress” -Group “Cluster Group” $res | Set-ClusterParameter -Multiple @{“PrefixLength”=“24″;“Address”=“131.xx.xx.xx“;“AdapterName”=“Internet”} Start-ClusterResource$res |
前述のとおり、このクラスター用にファイル共有監視機能 (英語) を構成しています。\\FS\Cluster は、ファイル サーバー上の単なるファイル フォルダーです。両方の Virtual Machines がこのファイル フォルダーに読み取り/書き込みアクセスできることを確認してください。
「Disjoint IPv4 Address」は Windows Server 2012 R2 で追加された新しいクラスター リソースです。 これは、Windows Server の GUI ツールであるフェールオーバー クラスター マネージャーではなく、PowerShell でのみ構成できます。このリソースの 2 つの IP アドレスを内部ネットワークと外部ネットワークに 1 つずつ追加しました。
- 内部アドレスは、ルーティング ドメイン ID および VLAN 番号によって識別されるクラスター ネットワークに割り当てられます。このアドレスは先ほど、Hyper-V ホストの内部ネットワーク アダプターにマッピングしたもので、Azure への接続が必要な内部ネットワーク上のすべての Virtual Machines の既定のゲートウェイ アドレスとなります。
- 外部アドレスは、ネットワーク アダプター名によって識別されるクラスター ネットワークに割り当てられます。先ほど両方の Virtual Machines で外部ネットワーク アダプターの名前を「Internet」に変更しました。
他のクラスター リソースと同様、これらのアドレスはいずれもクラスターのアクティブなノードが所有します。アクティブなノードで障害が発生した場合は、両方のアドレスが新しいアクティブなノードに割り当てられます。
次に、既定のルートを両方の Virtual Machines にインストールします。
New-NetRoute -InterfaceAlias Internet -DestinationPrefix 0.0.0.0/0 -NextHop 131.xx.xx.xx |
既定のルートは Virtual Machines ごとに 1 つとします。DHCP がネットワーク上で実行されていると、既定のルートは DHCP サーバーを指すようインストールされるので、そのルートは必ず削除します。
次に、サイト間 VPN 機能を両方の Virtual Machines にインストールします。
Add-WindowsFeature -Name RemoteAccess -IncludeAllSubFeature -IncludeManagementTools Install-RemoteAccess-Multitenancy Enable-RemoteAccessRoutingDomain -Name Onprem -Type VpnS2S |
「Onprem」は、先ほど Hyper-V ホストを構成した際に追加したルーティング ドメインの名前です。Hyper-V ホストは構成情報を Virtual Machines にフィードします。これで Virtual Machines により各ルーティング ドメインの「コンパートメント」が作成されます。Get-NetCompartment (英語) を両方の Virtual Machines で実行すると、次の出力が表示されます。
ルーティング ドメインの ID がコンパートメントの GUID (CompartmentId)、名前が説明 (CompartmentDescription) に対応します。
最後に、次の PowerShell コマンドレットをクラスターのアクティブなノードである Virtual Machines 上で実行します。
#Azure に接続するインターフェイスを追加します。共有キー (shared key) を入力します。 Add-VpnS2SInterface -Protocol IKEv2 -AuthenticationMethod PSKOnly -NumberOfTries 3 -ResponderAuthenticationMethod PSKOnly -Name 168.xx.xx.xx -Destination 168.xx.xx.xx -IPv4Subnet @(“10.0.0.0/8:100″) -SharedSecret <shared key> -RoutingDomain Onprem
#VPN 構成を同期するためのクラスター リソースを追加します。 Add-ClusterResourceType -Name “RAS Cluster Resource” -Dll RasClusterRes.dll $res = Add-ClusterResource -ResourceType “RAS Cluster Resource” -Name “S2SVPN” -Group “Cluster Group” $res | Set-ClusterParameter -Name “ConfigExportPath” -Value “\\FS\Cluster” Start-ClusterResource$res |
サイト間 VPN ゲートウェイはマルチテナントであるため、VPN 接続が終了するルーティング ドメインを指定する必要があります。ここでは「Onprem」を指定します。
「RAS Cluster Resource」もまた、Windows Server 2012 R2 で新たに追加された新しいクラスター リソースです。このリソース オブジェクトはサイト間 VPN 構成の保存場所を指定します。ファイル共有は、2 つの Virtual Machines が読み取り/書き込みアクセスできる場所であればどこにあっても構いません。ここではわかりやすくするために、クラスター用のファイル共有監視機能として先ほど構成したファイル フォルダーを選択します。アクティブなノードで障害が発生すると、スタンバイ ノードがこのフォルダーから構成を読み込み、Azure に再接続します。
検証
ここでは、Azure の Virtual Network ゲートウェイが既に構成されていると想定します。また、サイト間 VPN 接続が稼動しています。Get-VpnS2SInterface (英語) を実行すると次の出力が表示されます。
アクティブなクラスター ノードで障害が発生した後にオンプレミス ネットワークと Azure 間の接続が再開することを検証するために (サイト間 VPN は常にアクティブなノードで実行されます)、Windows Server の GUI ツールである Hyper-V Manager で Virtual Machines をオフにします。内部アドレス 192.168.200.1 と Azure のVM 10.0.20.4 の両方に、内部ネットワークのローカル マシンから継続的に ping します。すると下のとおり、4 つの ping パケットを喪失した後、新しいアクティブなノードへの接続が再開します。その後すぐに、さらに 1 つのパケットを失いますが、Azure への接続も再開します。
ローカル マシンからオンプレミスのサイト間 VPN ゲートウェイに ping:
ローカル マシンからサイト間 VPN 接続で Azure VM に ping: