Site-to-Site IPSec VPN zwischen Microsoft Azure und Fortigate

Im folgenden Beitrag verbinde ich ein On-Premise Subnetz hinter eine Firewall mit einem Cloud Subnetz bei Microsoft Azure.

Azure

Auf Azure Seite benötigt man mehrere Komponenten für ein Site-to-Site VPN. Neben virtuellen Netzwerken, einem Subnetz und einem extra Gateway-Subnetz, wird eine Public IP, eine Public IP Konfiguration und eine Gateway Konfiguration benötigt.

# Variablen
$Subscription         = "<Azure-Subscription-Name>"
$RGName               = "vpn_resource_group"
$Location             = "Europe West"
$VNetName             = "vnet_172.20.0.0_16"
$VNetAddress          = "172.20.0.0/16"
$VNetDnsSrv           = "8.8.8.8"
$SubnetName           = "subnet_172.20.0.0_24"
$SubnetAddress        = "172.20.0.0/24"
$GwSubnetName         = "subnet_172.20.255.0_24"
$GwSubnetAddress      = "172.20.255.0/24"
$GwName               = "gw_azure"
$GwIpName             = "gw_azure_ip"
$GwIpConfName         = "gw_azure_ip_conf"
$GwNameOnPrem         = "gw_onprem"
$GwIpOnPrem           = "<Fortigate-WAN-IP>"
$SubnetAddressOnPrem  = "172.21.0.0/24"
$VpnName              = "vpn_site_onprem"

# PowerShell Module importieren und zur Azure Subscription verbinden
Import-Module AzureRM
Connect-AzureRmAccount
Select-AzureRmSubscription -SubscriptionName $Subscription

# Resource Group anlegen
New-AzureRmResourceGroup -Name $RGName -Location $Location

# Virtuelles Netz und virtuelle Subnetze
$Subnet = NewAzureRmVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $SubnetAddress
$GwSubnet = NewAzureRmVirtualNetworkSubnetConfig -Name $GwSubnetName -AddressPrefix $GwSubnetAddress
New-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $RGName -Location $Location -AddressPrefix $VNetAddress -Subnet $Subnet,$GwSubnet
$VNetDns = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $RGName
$VNetDns.DhcpOptions.DnsServer = $VNetDnsSrv
Set-AzureRmVirtualNetwork -VirtualNetwork $VNetDns

# Azure Gateway Konfiguration
$GwIp = New-AzureRmPublicIpAddress -Name $GwIpName -ResourceGroupName $RGName -Location $Location -AllocationMethod Dynamic
$GwVNet = Get-AzureRmVirtualNetwork -Name $VNetName -ResourceGroupName $RGName
$GwSubnet = Get-AzureRmVirtualNetworkSubnetConfig -Name $GwSubnetName -VirtualNetwork $VNet
$GwIpConf = New-AzureRmVirtualNetworkGatewayIpConfig -Name $GwIpConfName -SubnetId $GwSubnet.Id -PublicIpAddressId $GwIp.Id
New-AzureRmVirtualNetworkGateway -Name $GwName -ResourceGroupName $RGName -Location $Location -IpConfigurations $GwIpConf -GatewayType Vpn -VpnType RouteBased -GatewaySku VpnGw1

# On-Premise Gateway Konfiguration
New-AzureRmLocalNetworkGateway -Name $GwNameOnPrem -ResourceGroupName $RGName -Location $Location -GatewayIpAddress $GwIpOnPrem -AddressPrefix $SubnetAddressOnPrem

# VPN Verbindung
$Gw = Get-AzureRmVirtualNetworkGateway -Name $GwName -ResourceGroupName $RGName
$GwOnPrem = Get-AzureRmLocalNetworkGateway -Name $GwNameOnPrem -ResourceGroupName $RGName
New-AzureRmVirtualNetworkGatewayConnection -Name $VpnName -ResourceGroupName $RGName -Location $Location -VirtualNetworkGateway1 $Gw -LocalNetworkGateway2 $GwOnPrem -ConnectionType IPsec -RoutingWeight 10 -SharedKey'<Preshared-Key>'

Zum Abschluss benötigt man für die Fortigate-seitige Konfiguration noch die Public IP, die oben erzeugt wurde:

Get-AzureRmPublicIpAddress -Name $GwIpName -ResourceGroupName $RGName

Update 02.09.2020: Neue Az PowerShell Module

Mit den neueren Az PowerShell Modulen haben sich auch die Befehle etwas geändert. Davon abgesehen ist die Syntax allerdings fast identisch geblieben. Trotzdem konnte ich noch nicht live verifizieren, ob die folgenden Zeilen passen, da mein VPN ja schon besteht und mit den alten Modulen angelegt wurde. Wer’s ausprobiert, bitte Feedback :-).

# Variablen
$Subscription = "<Azure-Subscription-Name>"
$RGName = "vpn_resource_group"
$Location = "Europe West"
$VNetName = "vnet_172.20.0.0_16"
$VNetAddress = "172.20.0.0/16"
$VNetDnsSrv = "8.8.8.8"
$SubnetName = "subnet_172.20.0.0_24"
$SubnetAddress = "172.20.0.0/24"
$GwSubnetName = "subnet_172.20.255.0_24"
$GwSubnetAddress = "172.20.255.0/24"
$GwName = "gw_azure"
$GwIpName = "gw_azure_ip"
$GwIpConfName = "gw_azure_ip_conf"
$GwNameOnPrem = "gw_onprem"
$GwIpOnPrem = "<Fortigate-WAN-IP>"
$SubnetAddressOnPrem = "172.21.0.0/24"
$VpnName = "vpn_site_onprem"

# PowerShell Module importieren und zur Azure Subscription verbinden
Import-Module Az
Connect-AzAccount
Select-AzContext -SubscriptionName $Subscription

# Resource Group anlegen
New-AzResourceGroup -Name $RGName -Location $Location

# Virtuelles Netz und virtuelle Subnetze
$Subnet = NewAzVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix $SubnetAddress
$GwSubnet = NewAzVirtualNetworkSubnetConfig -Name $GwSubnetName -AddressPrefix $GwSubnetAddress
New-AzVirtualNetwork -Name $VNetName -ResourceGroupName $RGName -Location $Location -AddressPrefix $VNetAddress -Subnet $Subnet,$GwSubnet
$VNetDns = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $RGName
$VNetDns.DhcpOptions.DnsServer = $VNetDnsSrv
Set-AzVirtualNetwork -VirtualNetwork $VNetDns

# Azure Gateway Konfiguration
$GwIp = New-AzPublicIpAddress -Name $GwIpName -ResourceGroupName $RGName -Location $Location -AllocationMethod Dynamic
$GwVNet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $RGName
$GwSubnet = Get-AzVirtualNetworkSubnetConfig -Name $GwSubnetName -VirtualNetwork $VNet
$GwIpConf = New-AzVirtualNetworkGatewayIpConfig -Name $GwIpConfName -SubnetId $GwSubnet.Id -PublicIpAddressId $GwIp.Id
New-AzVirtualNetworkGateway -Name $GwName -ResourceGroupName $RGName -Location $Location -IpConfigurations $GwIpConf -GatewayType Vpn -VpnType RouteBased -GatewaySku VpnGw1

# On-Premise Gateway Konfiguration
New-AzLocalNetworkGateway -Name $GwNameOnPrem -ResourceGroupName $RGName -Location $Location -GatewayIpAddress $GwIpOnPrem -AddressPrefix $SubnetAddressOnPrem

# VPN Verbindung
$Gw = Get-AzVirtualNetworkGateway -Name $GwName -ResourceGroupName $RGName
$GwOnPrem = Get-AzLocalNetworkGateway -Name $GwNameOnPrem -ResourceGroupName $RGName
New-AzVirtualNetworkGatewayConnection -Name $VpnName -ResourceGroupName $RGName -Location $Location -VirtualNetworkGateway1 $Gw -LocalNetworkGateway2 $GwOnPrem -ConnectionType IPsec -RoutingWeight 10 -SharedKey'<Preshared-Key>'

Zum Abschluss muss man auch mit den Az PowerShell Modulen für die Fortigate-seitige Konfiguration noch die Public IP ausgeben, die oben erzeugt wurde:

Get-AzPublicIpAddress -Name $GwIpName -ResourceGroupName $RGName
Fortigate

Auf der Fortigate lege ich Adressobjekte für die zu verbindenden Subnetze an, konfiguriere einen IPSec Tunnel, erlaube/reglementiere per Firewall Policies die Zugriff und richte eine statische Route zum Azure Netzwerk ein.

# Firewall/VPN objects
config firewall address
   edit net_172.21.0.0_24
      set subnet 172.21.0.0 255.255.2555.0
   next
   edit net_172.20.0.0_24
      set subnet 172.20.0.0 255.255.255.0
   next
end
# IPSec VPN Phase 1 / Phase 2
config vpn ipsec phase1-interface
   edit vpn_site_azure
      set type static
      set interface wan1
      set ike-version 2
      set keylife 28800
      set peertype any
      set proposal aes256-sha1 3des-sha1 aes256-sha256
      set dpd on-idle
      set dhgrp 2
      set nattraversal disable
      set remote-gw <Azure-GW-IP>
      set psksecret <Preshared-Key>
   next
end
config vpn ipsec phase2-interface
   edit vpn_site_azure
      set phase1name vpn_site_azure
      set proposal aes256-sha1 3des-sha1 aes256-sha256
      set dhgrp 2
      set keylifeseconds 27000
      set src-addr-type name
      set dst-addr-type name
      set src net_172.21.0.0_24
      set dst net_172.20.0.0_24
      set pfs disable
      set replay disable
   next
end
# Firewall Regeln (Inbound/Outbound)
config firewall policy
   edit <n>
      set srcintf Internal
      set dstintf vpn_site_azure
      set srcaddr net_172.21.0.0_24
      set dstaddr net_172.20.0.0_24
      set action accept
      set schedule always
      set service ALL
      set tcp-mss-sender 1350
      set tcp-mss-receiver 1350
   next
   edit <n>
      set srcintf vpn_site_azure
      set dstintf Internal
      set srcaddr net_172.20.0.0_24
      set dstaddr net_172.21.0.0_24
      set action accept
      set schedule always
      set service ALL
      set tcp-mss-sender 1350
      set tcp-mss-receiver 1350
   next
end
# Statische Route
config router static
   edit <n>
      set dst 172.20.0.0 255.255.255.0
      set device vpn_site_azure    next
end
Status Check

Sind beide Seiten konfiguriert, lässt sich entweder über die FortiGate oder über Azure PowerShell prüfen, ob die Verbingung funktioniert:

Get-AzureRmVirtualNetworkGatewayConnection -Name $VpnName -ResourceGroupName $RGName

Update 02.09.2020

Analog zur Konfiguration hat sich auch die Abfrage für den Status Check geändert:

Get-AzVirtualNetworkGatewayConnection -Name $VpnName -ResourceGroupName $RGName

Quellen:
https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-3rdparty-device-config-overview

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.