Voraussetzungen und Ziel

Ziel dieses Setups ist es, einen Cisco Router als Spoke per VPN an eine Fortigate (Hub) anzuschalten. Dies soll unabhängig vom Internetzugang des Spokes möglichst immer funktionieren, d.h. auch wenn dieser eine dynamische IPv4 WAN-Adresse hat und auch, wenn der Router hinter einem Internetzugang mit CGNAT hängt. Letzteres ist beispielsweise bei Mobilfunkzugängen die Regel. Da reines GRE nicht CGNAT-fähig ist, wird der Tunnel mit IPSEC geschützt, sodass die Tunnelverbindung über in UDP enkapsuliert wird. Das funktioniert dann auch mit CGNAT.

Der Hub verfügt über eine feste, öffentliche IPv4-Adresse.

Netzwerkdiagramm Netzwerkdiagramm

Fortigate

Es empfiehlt sich, auf der Fortigate asymmetrisches Routing einzuschalten.

Normalerweise könnte man meinen, dass man für die Ziele hinter dem Spoke mit statischen Routen arbeiten könnte. Das funktioniert aber seit FortiOS 7.0 aufgrund einer Designänderung nicht mehr. Für weitere Infos vgl. diesen Communitybeitrag.

VPN Tunnel

Fortigate VPN Setup Fortigate VPN Setup Über die Peer ID werden die Spokes unterschieden.

Fortigate VPN Setup Fortigate VPN Setup Fortigate VPN Setup

Routing

vgl. Link oben: Es dürfen keine statischen Routen auf das Tunnelinterface gesetzt werden. Die Routen werden durch die Einstellung im VPN (“Add route”) beim Tunnelaufbau automatisch eingetragen.

Passende Firewallpolicies müssen existieren, sonst kommt der Tunnel nicht hoch.

CLI Konfig

config vpn ipsec phase1-interface
    edit "CoA-Test-001"
        set type dynamic
        set interface "wan1"
        set ike-version 2
        set peertype one
        set net-device enable
        set proposal aes256-sha256
        set dpd on-idle
        set dhgrp 21
        set peerid "CoA-Test-1"
        set psksecret ENC
k6Y3/thrKc365rzcqfY+ECBJhWYCTByzosaElslr/EGvV6LmVSI9QrNUkFX0rXOfcVnELoJka+vUnvPx2
ZQSHF3ZWJR9fiBwG5jKeodKqvN7bA7WmWvBfiX4ZYjf2onm1ObrzsZF9byjHHw4xChJ/sRfbwHDQJaDcx
4Eei/LKkHep0Hbgd/eAC76lbKZk3c/tDDtp1lmMjY3dkVA
        set dpd-retryinterval 10
    next
end

config vpn ipsec phase2-interface
    edit "CoA-Test-001"
        set phase1name "CoA-Test-001"
        set proposal aes256-sha256
        set dhgrp 21
        set keylifeseconds 3600
        set dst-subnet 10.200.10.0 255.255.255.0
    next
        edit "CoA-Test-001_1"
        set phase1name "CoA-Test-001"
        set proposal aes256-sha256
        set dhgrp 21
        set keylifeseconds 3600
        set dst-subnet 172.17.32.1 255.255.255.255
    next
end


config router static
    edit 2
        set dst 10.200.10.0 255.255.255.0
        set distance 200
        set blackhole enable
        set vrf 0
    next
    edit 3
        set dst 172.17.32.1 255.255.255.255
        set distance 200
        set blackhole enable
        set vrf 0
    next
end


config system zone
    edit "CoA-Standorte"
        set interface "CoA-Test-002" "CoA-Test-001"
    next
end

Cisco

Das Definieren des interessanten Traffics über eine ACL ist nicht unbedingt notwendig. Es sorgt aber dafür, dass SAs aufgebaut werden, auch wenn kein Traffic von intern generiert wurde. Das kann insofern kritisch sein, dass das Netz sonst nicht erreicht werden kann, wenn der initiale Traffic von der Fortigate-Seite ausgeht.

IKEv2 Konfig (Phase 1)

crypto ikev2 proposal IKEV2_PROPOSAL
encryption aes-cbc-256
integrity sha256
group 21
!
crypto ikev2 policy IKEV2_POLICY
 proposal IKEV2_PROPOSAL
!
crypto ikev2 keyring IKEV2_KEYRING
peer SST-GATEWAY
 address <Fortigate-WAN-IP>
 pre-shared-key test1234
!
!
!
crypto ikev2 profile IKEV2_PROFILE
  match identity remote address <Fortigate-WAN-IP> 255.255.255.255
  identity local key-id CoA-Test-1
  authentication remote pre-share
  authentication local pre-share
  keyring local IKEV2_KEYRING
  dpd 10 3 periodic
  no config-exchange request

Im IKEV2_PROFILE wird die Peer ID wieder aufgegriffen, die auch in der Fortigate oben gesetzt wurde. Über diese wird der Spoke identifiziert. Für weitere Spokes müssen weitere Tunnel mit anderen Peer IDs auf der Fortigate eingerichtet werden.

IPSEC Konfig (Phase 2)

crypto ipsec transform-set IPSEC_TS esp-aes 256 esp-sha256-hmac
  mode tunnel
!
crypto ipsec profile IPSEC_PROFILE
  set security-association lifetime seconds 3600
  set security-association lifetime kilobytes disable
  set transform-set IPSEC_TS
  set pfs group21
  set ikev2-profile IKEV2_PROFILE

Tunnelinterface

interface Tunnel1
  ip unnumbered Vlan1
  tunnel source GigabitEthernet0/0/0
  tunnel mode ipsec ipv4
  tunnel destination <Fortigate-WAN-IP>
  tunnel protection ipsec policy ipv4 ACL-VPN
  tunnel protection ipsec profile IPSEC_PROFILE ikev2-profile IKEV2_PROFILE

ACL mit interessantem Traffic

ip access-list extended ACL-VPN
  10 permit ip 10.200.10.0 0.0.0.255 any
  20 permit ip host 172.17.32.1 any

Routing

Für den Tunnelendpunkt muss das Routing übers Internet sichergestellt sein (im Beispiel die dritte Route über DHCP), da die Default-Route in den Tunnel zeigen soll. Wenn der Tunnel nicht steht, zeigt die Default-Route ins Nirwana (Null0).

ip route 0.0.0.0 0.0.0.0 Tunnel1
ip route 0.0.0.0 0.0.0.0 Null0 200
ip route <Fortigate-WAN-IP> 255.255.255.255 dhcp