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