Windows Native VPN (IKEv2) mit FortiGate und lokalen Nutzern

Möchte man mit einem Windows Endgerät ein Client-VPN zu einer FortiGate als VPN-Gateway aufbauen, so gibt es abseits des Fortinet FortiClients verschiedene Varianten.
In diesem Beitrag stelle ich die Konfiguration eines Client-VPN mit IKEv2 zwischen einer FortiGate mit Nutzern in der lokalen Datenbank und der Windows integrierten IKEv2 Implementierung vor.

Folgende Komponenten und Versionen wurden in diesem Aufbau verwendet:
FortiGate: 60F
FortiOS: 7.2.0
Windows 10: 21H1 (Build 19043.1682)
Windows 11:

Der Einfachheit halber verwende ich in diesem Beitrag eine lokale Benutzerdatenbank der FortiGate Firewall und die Authentifizierung wird mittels Benutzernamen und Kennwörtern durchgeführt. Eine Authentifizierung mittels Client-Zertifikaten und die Anbindung externer Benutzerdatenbanken bspw. per RADIUS ist mit einer erweiterten Konfiguration möglich.

Konfiguration der Fortigate Firewall:
Die Konfiguration starten wir in der IPsec Konfiguration der FortiGate Firewall im Menüpunkt VPN –> IPSec Tunnels –> Create New –> IPsec Tunnel.
Wir befinden uns jetzt im IPsec Wizard und stellen dort den „Template type“ auf Custom:

In dem sich nun öffnenden Formular müssen nun einige Anpassungen durchgeführt werden.
Als erstes wird der Typ des Remote Gateway auf Dialup User umgestellt und die WAN-Schnittstelle der FortiGate Firewall unter Interface ausgewählt.
Damit die VPN Clients mit einer IP-Konfiguration versorgt werden, ist es notwendig die Funktion „Mode Config“ zu aktiveren und einen IP-Adressbereich, sowie den zu nutzenden DNS-Server festzulegen:

In dem folgenden Abschnitt wird die IKE Version auf 2 umgestellt und die Peer-IDs werden an dieser Stelle nicht weiter eingeschränkt. Die Windows IKEv2 Implementierung erfordert ein valides Zertifikat um den Key Exchange mit der FortiGate Firewall zu validieren.
An dieser Stelle können auch Zertifikate von LetsEncrypt verwendet werden, wie dies funktioniert erkläre ich hier.

Die Verschlüsselungsparameter in Phase 1 wird auf AES256GCM mit PRFSHA384 und der Diffie-Hellmann Group 20 (ECP384) eingerichtet:

Auch in den Verschlüsselungsparameter der Phase 2 wird wieder auf AES256GCM und der Diffie-Hellmann Group 20 (ECP384) gesetzt:

Für den Login müssen jetzt die lokalen Benutzer unter „User & Authentication –> User Definition“ erstellt werden:

Die erstellten Benutzer werden dann einer Benutzergruppe zugeordnet:

Auf der CLI müssen nun noch Anpassungen in der Phase1 Konfiguration durchgeführt werden, diese sind aktuell nicht in der GUI möglich.
Als erstes wird die vorhin erstellte Benutzergruppe hinzugefügt und zusätzlich wird das „client-auto-negotiate“ und „client-keep-alive“ aktiviert, um Probleme mit untätigen Clients zu verhindern :

config vpn ipsec phase1-interface
    edit "Client-VPN"
        set eap enable
        set eap-identity send-request
        set authusrgrp "VPN-User"
        set client-auto-negotiate enable
        set client-keep-alive enable
    next
end

Abschließend muss auf der FortiGate Firewall noch das jeweilige Firewall-Regelwerk eingerichtet werden, damit die Endgeräte auch die notwendigen Ressourcen erreichen können.

FortiGate CLI Konfiguration:
Auf der CLI der FortiGate lässt sich die gesamte Konfiguration mit folgenden Befehlen einrichten:

config user local
    edit "<Benutzername>"
        set type password
        set passwd <VPN-Kennwort>
    next
end
config user group
    edit "VPN-User"
        set member "<Benutzername>"
    next
end
config vpn ipsec phase1-interface
    edit "Client-VPN"
        set type dynamic
        set interface "wan1"
        set ike-version 2
        set authmethod signature
        set peertype any
        set net-device disable
        set mode-cfg enable
        set proposal aes256gcm-prfsha384
        set dpd on-idle
        set dhgrp 20
        set eap enable
        set eap-identity send-request
        set authusrgrp "VPN-User"
        set certificate "vpn-home.kupschke.net"
        set ipv4-start-ip 192.168.244.1
        set ipv4-end-ip 192.168.244.100
        set dns-mode auto
        set client-auto-negotiate enable
        set client-keep-alive enable
        set dpd-retryinterval 60
    next
end

config vpn ipsec phase2-interface
    edit "Client-VPN"
        set phase1name "Client-VPN"
        set proposal aes256gcm
        set dhgrp 20
        set keepalive enable
        set keylifeseconds 3600
    next
end

Windows 10 / 11 Client Konfiguration:

Die Konfiguration des Windows 10 / 11 Clients werde ich in der Powershell durchführen, da die vorgegebenen Verschlüsselungsparameter bei der Nutzung der GUI nicht mehr zeitgemäß sind (SHA1 und DH Group 2…).
Mit folgenden Befehlen wird der VPN Tunnel erstellt:

C:\>Add-VpnConnection -Name "FortiGate" -ServerAddress vpn-home.kupschke.net -TunnelType "Ikev2"

C:\> Set-VpnConnectionIPsecConfiguration -ConnectionName "FortiGate" -AuthenticationTransformConstants GCMAES256 -CipherTransformConstants GCMAES256 -EncryptionMethod GCMAES256 -IntegrityCheckMethod SHA384 -PfsGroup ECP384 -DHGroup ECP384 -PassThru -Force

Aus der Windows Taskleiste heraus lässt sich nun das VPN starten:

Details der VPN-Verbindung auf der CLI anzeigen:
Die IKE SA bzw. Phase 1 Details der aktiven VPN Sessions lassen sich mit folgendem Befehl anzeigen:

# get vpn ike gateway
vd: root/0
name: Client-VPN_0
version: 2
interface: wan1 5
addr: 192.168.178.25:4500 -> 193.43.221.2:5256
created: 287s ago
user: dominik
2FA: no
assigned IP address: 192.168.244.1/0.0.0.0
IKE SA  created: 1/1  established: 1/1  time: 350/350/350 ms
IPsec SA  created: 1/1  established: 1/1  time: 0/0/0 ms

  id/spi: 1245 e51773f89138060c/4bace78fb5849b40
  direction: responder
  status: established 287-287s ago = 350ms
  proposal: aes256gcm
  SK_ei: ece8a1cec6528430-597bf160b6cfdad7-948a3df294119744-977911b27d99d74a-9bbe91de
  SK_er: 95bbad416645f3da-810997340e747c5c-4fe3170a7b09435b-d297a135fda77558-9c9f0c65
  SK_ai: 
  SK_ar: 
  lifetime/rekey: 3600/3042
  DPD sent/recv: 00000000/00000000

Die Phase 2 Details lassen sich dann mit folgendem Befehl ausgeben:

# get vpn ipsec tunnel details 

gateway
  name: 'Client-VPN_0'
  local-gateway: 192.168.178.25:4500 (static)
  remote-gateway: 193.43.221.2:5256 (dynamic)
  dpd-link: on
  mode: ike-v2
  interface: 'wan1' (5)
  rx  packets: 908  bytes: 187954  errors: 0
  tx  packets: 966  bytes: 341922  errors: 0
  dpd: on-idle/negotiated  idle: 60000ms  retry: 3  count: 0
  nat traversal mode: keep-alive      interval: 10
  selectors
    name: 'Client-VPN'
    auto-negotiate: disable
    mode: tunnel
    src: 0:0.0.0.0-255.255.255.255:0
    dst: 0:192.168.244.1-192.168.244.1:0
    SA
      lifetime/rekey: 3600/3252   
      mtu: 1438
      tx-esp-seq: 3c5
      replay: enabled
      qat: 0
      inbound
        spi: cf6c19d0
        enc:  aes-gc  b6d5f8c0fec41da5dfb5671f0d2ab902450db100b644f0539667633c2a27062df4be877c
        auth:   null  
      outbound
        spi: b8d9710a
        enc:  aes-gc  02293b60f95580b85b60fdbf9a0fb3e565d99e400ab6315707a317f2fe2e6a177ff5ff7d
        auth:   null  
      NPU acceleration: encryption(outbound) decryption(inbound)

14 comments

Schreibe einen Kommentar zu Dominik Kupschke Antworten abbrechen

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