こんにちは。技術部の髙岡です。
先日、オンプレのサーバとAzure上のサーバ間の通信をIPSecで暗号化することが必要となりました。
その際には、オンプレミス側は商用のVPNルータを導入してAzure側はVPN Gatewayを使ったのですが、後で思ったのが、
「商用のVPNルータを買わなくてもLinuxのIPSec実装の「libreswan」でいいじゃん」
ということです。
そこで、「libreswan」を使ったIPSec VPNとAzure VPN Gatewayの接続を検証をしてみた結果を紹介したいと思います。
「libreswan」を使えば、オンプレとクラウドのハイブリッド構成を、低コストで構築することができますので、オススメです。
構成図
実現したい構成です。
オンプレサーバとAzureサーバの間の通信は、L3レベルで暗号化してローカルIP同士で通信できるようにします。

クラウド側の作業
Azure VPN Gatewayの構築
PowerShellコマンドを使うと、結構簡単に構築できます。
チュートリアル:PowerShell を使用した VPN ゲートウェイの作成と管理が参考になります。
コマンドに渡すパラメータの説明
#$RG1 = The name of the resource group #$VNet1 = The name of the virtual network #$Location1 = The location region #$FESubnet1 = The name of the first subnet #$BESubnet1 = The name of the second subnet #$VNet1Prefix = The address range for the virtual network #$FEPrefix1 = Addresses for the first subnet #$BEPrefix1 = Addresses for the second subnet #$GwPrefix1 = Addresses for the GatewaySubnet #$DNS1 = The IP address of the DNS server you want to use for name resolution #$Gw1 = The name of the virtual network gateway #$GwIP1 = The public IP address for the virtual network gateway #$GwIPConf1 = The name of the IP configuration
コマンドに渡すパラメータの設定
$ pwsh PowerShell 6.2.3 Copyright (c) Microsoft Corporation. All rights reserved. https://aka.ms/pscore6-docs Type 'help' to get help. # Azureテナントに接続する。Macの場合の例です。 > Connect-AzAccount WARNING: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code xxxxxxxxx to authenticate. Account SubscriptionName TenantId ------- ---------------- -------- xxxx@xxx.com xxxxxxxxxxxxxxxx xxxxxxxx-xxxx-xxxx-xxxx-xxxx… PS > PS >$RG1 = "RG_takaoka" PS >$VNet1 = "VNet-takaoka" PS >$Location1 = "Japan East" PS >$Subnet1 = "FrontEnd" PS >$VNet1Prefix = "192.168.250.0/24" # Azure側のネットワーク体系は予め決めておく必要があります。 PS >$Prefix1 = "192.168.250.0/26" PS >$GwPrefix1 = "192.168.250.64/28" PS >$DNS1 = "8.8.8.8" PS >$Gw1 = "VNet1GW-takaoka" PS >$GwIP1 = "VNet1GWIP-takaoka" PS >$GwIPConf1 = "gwipconf1-takaoka"
リソースグループの作成
PS >New-AzResourceGroup -ResourceGroupName $RG1 -Location $Location1 PS >Set-Item Env:\SuppressAzurePowerShellBreakingChangeWarnings "true"
仮想ネットワークの作成
「FrontEnd」という名前のサブネットと、Azure VPN Gatewayが使用する「GatewaySubnet」というサブネットを作成します。「GatewaySubnet」というサブネット名は固定であることに注意してください。
PS >$sub1 = New-AzVirtualNetworkSubnetConfig -Name $Subnet1 -AddressPrefix $Prefix1
PS >$gwsub1 = New-AzVirtualNetworkSubnetConfig -Name GatewaySubnet -AddressPrefix $GwPrefix1
PS >$vnet1 = New-AzVirtualNetwork `
-Name $VNet1 `
-ResourceGroupName $RG1 `
-Location $Location1 `
-AddressPrefix $VNet1Prefix `
-Subnet $sub1,$gwsub1
VPN Gatewayに割り当てるパブリック IPアドレスの作成
「-AllocationMethod Dynamic」と書いてあるので、VPN Gatewayに割り当てるパブリック IPが動的であることに不安を覚えますが、VPN Gatewayに割り当てたパブリックIPは変更されないそうです。
PS >$gwpip = New-AzPublicIpAddress -Name $GwIP1 -ResourceGroupName $RG1 `
-Location $Location1 -AllocationMethod Dynamic
PS >$subnet = Get-AzVirtualNetworkSubnetConfig -Name 'GatewaySubnet' `
-VirtualNetwork $vnet1
PS >$gwipconf = New-AzVirtualNetworkGatewayIpConfig -Name $GwIPConf1 `
-Subnet $subnet -PublicIpAddress $gwpip
VPN ゲートウェイの作成
New-AzVirtualNetworkGatewayを実行してから終わるまで、結構時間がかかります。
45分くらいです。珈琲でも飲んで待ってましょう。
PS >New-AzVirtualNetworkGateway -Name $Gw1 -ResourceGroupName $RG1 ` -Location $Location1 -IpConfigurations $gwipconf -GatewayType Vpn ` -VpnType RouteBased -GatewaySku VpnGw1
コマンドが終わると、以下のような結果が出力されます。
Name : VNet1GW-takaoka
ResourceGroupName : RG_takaoka
Location : japaneast
Id : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG_takaoka/providers/Microsoft.Network/virtualNetworkGateways/VNet1GW-takaoka
Etag : W/"f7c7842a-f456-4482-aa1c-03e1fb7037f2"
ResourceGuid : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ProvisioningState : Succeeded
Tags :
IpConfigurations : [
{
"PrivateIpAllocationMethod": "Dynamic",
"Subnet": {
"Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG_takaoka/providers/Microsoft.Network/virtualNetworks/V
Net-takaoka/subnets/GatewaySubnet"
},
"PublicIpAddress": {
"Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG_takaoka/providers/Microsoft.Network/publicIPAddresses
/VNet1GWIP-takaoka"
},
"Name": "gwipconf1-takaoka",
"Etag": "W/\"f7c7842a-f456-4482-aa1c-03e1fb7037f2\"",
"Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG_takaoka/providers/Microsoft.Network/virtualNetworkGatew
ays/VNet1GW-takaoka/ipConfigurations/gwipconf1-takaoka"
}
]
GatewayType : Vpn
VpnType : RouteBased
EnableBgp : False
ActiveActive : False
GatewayDefaultSite : null
Sku : {
"Capacity": 2,
"Name": "VpnGw1",
"Tier": "VpnGw1"
}
VpnClientConfiguration : null
BgpSettings : {
"Asn": 65515,
"BgpPeeringAddress": "192.168.250.78",
"PeerWeight": 0
}
コマンドに渡すパラメータの設定
# Virtual network # On-premises network - LNGIP1 is the VPN device public IP address $LNG1 = "On-premise-takaoka" #任意の名前 $LNGprefix1 = "192.168.56.0/24" #オンプレ側の内部ネットワークセグメントを指定する $LNGIP1 = "122.219.179.43" #オンプレ側の公開ネットワークのIPを指定する $Location1 = "Japan East" # Connection $Connection1 = "VNet1-TO-On-premise"
ローカル ネットワーク ゲートウェイの作成
コマンドはすぐに終わります。
PS > New-AzLocalNetworkGateway -Name $LNG1 -ResourceGroupName $RG1 `
-Location $Location1 -GatewayIpAddress $LNGIP1 -AddressPrefix $LNGprefix1
実行結果です。
Name : On-premise-takaoka
ResourceGroupName : RG_takaoka
Location : japaneast
Id : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/RG_takaoka/providers/Microsoft.Network/localNetworkGateways/On-premise-takaoka
Etag : W/"d8bf1724-7c04-4ea2-8121-3e8e68e41a5a"
ResourceGuid : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ProvisioningState : Succeeded
Tags :
GatewayIpAddress : 122.219.179.43
LocalNetworkAddressSpace : {
"AddressPrefixes": [
"192.168.56.0/24"
]
}
BgpSettings : null
サイト間接続の設定
Azure VPN Gatewayとオンプレ側のVPNルータのlibreswanとの間のVPN接続を作成します。
$vng1 = Get-AzVirtualNetworkGateway -Name $GW1 -ResourceGroupName $RG1 $lng1 = Get-AzLocalNetworkGateway -Name $LNG1 -ResourceGroupName $RG1 # -SharedKey は共有キーとなる任意の文字列を指定します。オンプレ側のlibreswanでの設定と合わせます。 PS > New-AzVirtualNetworkGatewayConnection -Name $Connection1 -ResourceGroupName $RG1 ` -Location $Location1 -VirtualNetworkGateway1 $vng1 -LocalNetworkGateway2 $lng1 ` -ConnectionType IPsec -SharedKey "xxxxxxxx" -ConnectionProtocol IKEv2
実行結果です。
Name : VNet1-TO-On-premise
ResourceGroupName : RG_takaoka
Location : japaneast
Id : /subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/
RG_takaoka/providers/Microsoft.Network/connections/VNet1-TO-On-prem
ise
Etag : W/"9d662784-eb49-4afe-bd9d-3b6fe278c2e8"
ResourceGuid : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ProvisioningState : Succeeded
Tags :
AuthorizationKey :
VirtualNetworkGateway1 : "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups
/RG_takaoka/providers/Microsoft.Network/virtualNetworkGateways/VNet
1GW-takaoka"
VirtualNetworkGateway2 :
LocalNetworkGateway2 : "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups
/RG_takaoka/providers/Microsoft.Network/localNetworkGateways/On-pre
mise-takaoka"
Peer :
RoutingWeight : 0
SharedKey : xxxxxxxx
ConnectionStatus : Unknown
EgressBytesTransferred : 0
IngressBytesTransferred : 0
TunnelConnectionStatus : []
Azure VPN Gatewayで決まったネットワークに属するようAzure側サーバを構築
先に、$VNet1Prefix = “192.168.250.0/24”と指定して、Azure側の仮想ネットワーク「VNet-takaoka」を作成済みですので、Azure側サーバを作る時のネットワークとして「VNet-takaoka」を指定します。
ここまでの構築結果
ここまでの作業で、構築できた部分です。

オンプレ側の作業
次回は、オンプレ側のlibreswanの構築〜Azure側のサーバとの間での疎通確認を紹介いたします。

