VPN IPSec do Fortigate

W wersji 7.x fortigate z części urządzeń („z dolnej półki”) usunął możliwość konfigurai połączenia VPN w oparciu o SSL.
Połączenie VPN bazujące na logowaniu kontem użytkownika wraz z hasłem oraz dodatkowo z certyfikatem można zrealizować w oparciu o IPSec.
W pierwszej kolejności należy wygenerować certyfikaty. Fortigate nie oferuje natywnego wsparcia generowania certyfikatów więc musimy wykorzystać np. oprogramowanie openssl do wygenerowania kompletu certyfikatów. Potrzebne będą trzy certyfikaty:
– certyfikat CA
– certyfikat serwera (dla Fortigate)
– certyfikat użytkownika (klienta VPN).

W przypadku systemu Windows możemy pobrać pakiet FireDaemon OpenSSL

Po instalacji generujemy poszczególne certyfikaty. Poniżej jest skrypt powershell, który wygeneruje odpowiednie certyfikaty

# =====================================================================
# SKRYPT GENERUJĄCY CERTYFIKATY VPN (FortiGate IKEv2) 
# =====================================================================
$ErrorActionPreference = "Stop"

# --- 1. PARAMETRY KONFIGURACYJNE (Dostosuj do swojego środowiska) ---
$OrgName    = "NazwaFirmy"
$Country    = "PL"
$State      = "Podkarpackie"
$City       = "Rzeszow"

$VpnFqdn    = "fg.naszadomena.pl"                # Nazwa domenowa bramy VPN (FortiGate)
$VpnIp      = "x.x.x.x"                          # Publiczny adres IP bramy VPN (FortiGate)
$ClientName = "uzytkownikvpn"                    # Nazwa pierwszego certyfikatu klienta
$Password   = "NaszeHasloDoKluczaPrywatnego"     # Hasło do klucza CA oraz paczek .p12

# --- 2. UTWORZENIE LOKALNEGO PLIKU OPENSSL.CNF (Obejście błędu Apache24) ---
$OpensslConfPath = "$PWD\openssl.cnf"
@"
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
x509_extensions    = v3_ca
prompt             = no

[ req_distinguished_name ]
C  = $Country
ST = $State
L  = $City
O  = $OrgName
CN = $OrgName-Root-CA

[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints       = critical, CA:true
keyUsage               = critical, digitalSignature, cRLSign, keyCertSign
"@ | Set-Content -Path $OpensslConfPath -Encoding Ascii

# Ustawienie zmiennej środowiskowej dla bieżącej sesji PowerShell
$env:OPENSSL_CONF = $OpensslConfPath

Write-Host "`n[1/4] Generowanie Urzedu Certyfikacji (Root CA)..." -ForegroundColor Cyan
openssl genrsa -aes256 -passout "pass:$Password" -out ca.key 4096

#generowanie certyfikatu CA ważnego 10 lat. 
#W przypadku gdy chcemy inny okres ważności zmieniamy liczbę dni po parametrze "-days"
openssl req -config $OpensslConfPath -x509 -new -key ca.key -passin "pass:$Password" -sha256 -days 3650 -out ca.crt -subj "/C=$Country/ST=$State/L=$City/O=$OrgName/CN=$OrgName-Root-CA"

Write-Host "`n[2/4] Generowanie certyfikatu serwera dla FortiGate ($VpnFqdn / $VpnIp)..." -ForegroundColor Cyan
openssl genrsa -out server.key 2048
openssl req -config $OpensslConfPath -new -key server.key -out server.csr -subj "/C=$Country/ST=$State/L=$City/O=$OrgName/CN=$VpnFqdn"

@"
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, 1.3.6.1.5.5.8.2.2
subjectAltName = DNS:$VpnFqdn, IP:$VpnIp
"@ | Set-Content -Path "$PWD\server_ext.cnf" -Encoding Ascii

#generowanie certyfikatu serwera ważnego 825 dni. 
#W przypadku gdy chcemy inny okres ważności zmieniamy liczbę dni po parametrze "-days"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -passin "pass:$Password" -CAcreateserial -out server.crt -days 825 -sha256 -extfile "$PWD\server_ext.cnf"

Write-Host "`n[3/4] Generowanie certyfikatu klienta ($ClientName)..." -ForegroundColor Cyan
openssl genrsa -out "$ClientName.key" 2048
openssl req -config $OpensslConfPath -new -key "$ClientName.key" -out "$ClientName.csr" -subj "/C=$Country/ST=$State/L=$City/O=$OrgName/CN=$ClientName"

@"
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
"@ | Set-Content -Path "$PWD\client_ext.cnf" -Encoding Ascii

#generowanie certyfikatu klienta ważnego 2 lata. 
#W przypadku gdy chcemy inny okres ważności zmieniamy liczbę dni po parametrze "-days"
openssl x509 -req -in "$ClientName.csr" -CA ca.crt -CAkey ca.key -passin "pass:$Password" -CAcreateserial -out "$ClientName.crt" -days 730 -sha256 -extfile "$PWD\client_ext.cnf"

Write-Host "`n[4/4] Eksportowanie gotowych paczek PKCS#12 (.p12)..." -ForegroundColor Cyan
openssl pkcs12 -export -out "fortigate_server.p12" -inkey server.key -in server.crt -certfile ca.crt -passout "pass:$Password"
openssl pkcs12 -export -out "$ClientName.p12" -inkey "$ClientName.key" -in "$ClientName.crt" -certfile ca.crt -passout "pass:$Password"

# Czyszczenie tymczasowych plików CSR i CNF
Remove-Item "server.csr", "$ClientName.csr", "server_ext.cnf", "client_ext.cnf" -ErrorAction SilentlyContinue

Write-Host "`n=====================================================================" -ForegroundColor Green
Write-Host " GOTOWE! Wygenerowano komplet certyfikatow w katalogu: $PWD" -ForegroundColor Green
Write-Host " -> ca.crt               (Zaimportuj na FortiGate jako CA oraz w Windows klienta)"
Write-Host " -> fortigate_server.p12 (Zaimportuj na FortiGate jako Local PKCS#12 Certificate)"
Write-Host " -> $ClientName.p12     (Zainstaluj u uzytkownika dla FortiClient)"
Write-Host "=====================================================================" -ForegroundColor Green

Po wykonaniu powyższego skryptu otrzymamy 3 certyfikaty wraz z odpowiednimi kluczami prywatnymi. Wszystkie certyfikaty odpowiednio zabezpieczamy.
Wygenerowany plik i przeznaczenie
ca.crt – certyfikat Twojego Root CA. Wgraj go na FortiGate (System > Certificates > Import > CA Certificate) oraz zainstaluj na komputerach użytkowników w magazynie Zaufane główne urzędy certyfikacji.
fortigate_server.p12 – certyfikat serwera VPN wraz z kluczem prywatnym. Wgraj go na FortiGate (System > Certificates > Import > Local Certificate > PKCS #12), podając hasło zdefiniowane w zmiennej $Password.
uzytkownikvpn.p12 – gotowa certyfikat wraz kluczem prywatnym do instalacji na urządzeniu klienckim. Po dwukrotnym kliknięciu w Windows i wpisaniu hasła $Password, certyfikat pojawi się na liście wyboru w FortiClient.
ca.key – najważniejszy klucz prywatny Twojego CA. Zachowaj go wraz z plikiem ca.crt, aby w przyszłości móc wystawiać certyfikaty dla kolejnych użytkowników bez konieczności rekonfiguracji FortiGate!

W kolejnym kroku logujemy się do Fortigate i przechodzimy do menu System > Certificates > Import > CA Certificate

i importujemy nasz certyfikat CA

Po imporcie należy zwrócić uwagę pod jaką nazwą zapisał się nasz certyfikat CA. Będzie on dostępny w sekcji „Remote CA Certificate”. W poniższym przykładzie ma on nazwę CA_Cert_1. Nazwa będzie potrzebna w dalszej części konfiguracji Fortigate

W kolejnym kroku importujemy certyfikat serwera

Podajemy plik certyfikatu serwera w formacie p12 i wprowadzamy hasło

Po imporcie certyfikat będzie dostępny w sekcji „Local Certificate”. Nazwę należy zapamiętać gdyż będzie potrzebna w kolejnych etapach konfiguracji.

Uruchamiamy konsolę i wydajemy kolejno polecenia:

Konfiguracja klienta – PKI peer
CA – nazwa certyfikatu CA zaimportowanego do FG
po CN podajemy nazwę jaką umieśliliśmy w skrypcie ps w zmiennej $ClientName

config user peer
    edit "VPN-CLIENT-PEER"
        set ca "CA_Cert_1"
        set subject "CN=uzytkownikvpn"
    next
end

Powyższy obiekt ma ograniczyć akceptację certyfikatów do wskazanej tożsamości.

Utworzenie użytkownika VPN

config user local
    edit "nazwa_uzytkownika_vpn"
        set type password
        set passwd "SilneHasloUzytkownika456!"
    next
end

w polecenie „set passwd” wprowadzamy hasło dla naszego użytkownika VPN

Utworzenie grupy użytkowników którzy mogą zestawiać połączenie VPN


config user group
    edit "VPN-USERS"
        set member "nazwa_uzytkownika_vpn"
    next
end

W linii „set member” podajemy nazwę wcześniej utworzonego użytkownika

Konfiguracje IPSec Phase 1
To jest najważniejsza część. Zwróć uwagę na kolejność: najpierw set peertype peer, następnie set peer.

config vpn ipsec phase1-interface
edit "VPN-IKEv2"
	set type dynamic
        set interface "vlan300"
        set ike-version 2
        set authmethod signature
	set peertype peer
        set peer "VPN-CLIENT-PEER"
	set cert-peer-username-validation none
        set certificate "nazwa_certyfikat_serwera_fg"
        set proposal aes256-sha256
        set dhgrp 14
        set net-device disable
        set mode-cfg enable
        set eap enable
        set eap-identity send-request
        set eap-cert-auth enable
        set authusrgrp "VPN-USERS"
	set assign-ip enable
	set assign-ip-from range
        set ipv4-start-ip 10.10.10.100
        set ipv4-end-ip 10.10.10.150
        set ipv4-netmask 255.255.255.0
	set dns-mode manual
        set ipv4-split-include "Lan5"
        set dpd on-idle
        set dpd-retryinterval 60
	set nattraversal enable
        set transport auto
    next
end

Parametry do ewentualnej modyfikacji pod swoje FG:
set interface „wan” – podajemy nazwę interfejsu publicznego WAN
set peer „VPN-CLIENT-PEER” – nazwa utworzonej wcześniej PKI peer
set certificate „nazwa_certyfikat_serwera_fg” – podajemy nazwę naszego certyfikatu serwera FG
set proposal aes256-sha256 – ustawienie szyfrowania w zależności od potrzeb
set dhgrp 20 – ustawienie grupy DH
set authusrgrp „VPN-USERS” – nazwa grupy użytkowników VPN
set ipv4-start-ip 10.10.10.100 – zakres początkowy adresów IP dla klientów VPN
set ipv4-end-ip 10.10.10.150 – zakres końcowy dresów IP dla klientów VPN
set ipv4-netmask 255.255.255.0 – maska podsieci dla klientów
set ipv4-split-include „Lan5” – podajemy podsieć która będzie przepuszczana przez VPN (podsieć docelowa), pozostały ruch od klienta będzie wychodził jego domyślną bramą

Konfiguracja Phase 2

#Konfiguracja Phase 2
config vpn ipsec phase2-interface
    edit "VPN-IKEv2-P2"
        set phase1name "VPN-IKEv2"
        set proposal aes256-sha256
        set pfs enable
        set dhgrp 20
        set src-addr-type subnet
        set src-subnet 0.0.0.0/0
        set dst-addr-type subnet
        set dst-subnet 0.0.0.0/0
    next
end

Definiujemy obiekt puli adresów IP dla VPN (zgodnie z podanym zakresem w Phase 1)

config firewall address
    edit "VPN-CLIENTS"
        set type iprange
        set start-ip 10.10.10.100
        set end-ip 10.10.10.150
    next
end

Definicja reguły firewall

#firewall
config firewall policy
    edit 10
        set name "VPN-to-LAN"
        set srcintf "VPN-IKEv2"
        set dstintf "lan"
        set srcaddr "VPN-CLIENTS"
        set dstaddr "Lan5"
        set action accept
        set schedule "always"
        set service "ALL"
        set nat disable
    next
end

Po wykonani powyższych czynności przechodzimy do konfiguracji klienta.

Na komputerze klienta importujemy certyfikat CA do sekcji „Zaufane główne urzędy certyfikacji”

Certyfikat klienta importujemy do magazynu użytkownika

Uruchamiamy klienta VPN Fortigate i konfigurujemy nowe połączenie
typ VPN – IPSec VPN
Connection Name – nazwa naszego połączenia
Remote Gateway – IP publiczne lub nazwa domenowa naszego FG
Authentication Method – zmieniamy na X.509 Certificate i poniżesz wybieramy z magazynu nasz certyfikat klienta
Authentication (EAP) – „prompt for login” lub „Save login” aby podać nazwę użytkownika i hasło
W sekcji advanced Setting
IKE – version 2
Phase 1, encryption oraz DH group – zgodnie z ustawieniem w konfiguracji FG
Phase 2, encryption oraz DH group – zgodnie z ustawieniem w konfiguracji FG

Zapisujemy zmiany i próbujemy zestawić połączenie.

W przypadku braku zestawienia połączenia możemy po stronie FG włączyć debugowanie połączenia VPN

diagnose vpn ike log filter clear
diagnose vpn ike log filter rem-addr4 x.x.x.x
diagnose debug console timestamp enable
diagnose debug application ike -1
diagnose debug enable

Zamiast x.x.x.x wstawiamy IP publiczne naszego klienta

Zatrzymanie debugowania

diagnose debug disable
diagnose debug reset

W przypadku gdy po zestawieniu połączenia nie działa Internet i nie ma połączenia do sieci lokalne (poprzez VPN)- „route print -4” pokazuje inne trasy niż skonfigurowane należy sprawdzić czy na kliencie nie ma podwójnych kart sieciowych z fortinet np. z poprzedniej wersji. W przypadku gdy są podwójne pozostawić tylko nowe karty a stare usunąć.

➤