Menu Close

ADVPN med OSPF

Tidsåtgång: 2 timmar
Svårighetsgrad: Expert

I den här cookbooken kommer jag gå igenom Fortinets referensarkitektur och konfiguration och se om det är like enkelt att utföra som det kan verka när man läser dokumentationen. Dokumentationen finner du här: FortiOS_ADVPN_version_2019-09-16.pdf

ADVPN (Auto Discovery VPN) är en IPsec teknik som gör att spokes (tex bransch offices) kan prata direkt med varandra istället för att skicka trafiken via sin centrala Hub (tex HQ, Datacentret osv.). Detta bildar en s k full-mesh vpn topologi utan att man faktiskt bygger denna topologi manuellt. Ska man bygga detta utan ADVPN så behöver man i varje nod bygga en vpn till varja annan nod. Detta betyder att för en miljö med tre siter så är det tre tunnlar som ska byggas i varje brandvägg vilket gör att det blir sex tunnlar totalt (3 siter x 2 tunnlar = 6 tunnlar). Drar vi upp site antalet till 10 så har vi istället 90 tunnlar som ska konfigureras och underhållas. (10 siter x 9 tunnlar = 90 tunnlar totalt). Det skalar alltså inte speciellt bra och har man en större organisation så skenar det snabbt iväg. Med ADVPN så bygger du en tunnel per site till din Hub och så sköter IPsec tillsammans med ett dynamiskt routingprotokoll resten.

Mer dokumentiation kring Fortinets lösningar hittar du här: Docs

Förberedelse

Likt inför alla labbar utför jag följande steg:

  • Kopiera min standardlabb i Eve till en ny, i detta fall kallar jag den för ADVPN med OSPF
  • Ladda på standardkonfigurationerna ifrån Github så att alla brandväggar får sina unika konfigurationer (bara IP addresser på interfacen skiljer dessa åt i standardkonfigurationerna.)
  • Ta fram referensdokumentation
  • Planera upp IP Planen för att applicera referensarkitekturen på din egen IP Plan. På detta vis får jag en bättre förståelse för vilka IP-addresser som gör vad och varför.

Sedan börjar laborationen. Konfigurationer ifrån alla noder kommer att finnas på Github och utvalda delar av konfigurationen kommer att visas i denna artikel.

IPSec

ADVPN bygger på IPSec och hela syftet med ADVPN är att bygga en s k full-mesh-topologi utan att behöva konfigurera den väldigt omfattande konfigurationen som behövs för att alla noder ska kunna prata med alla. Det är hanterbart i en väldigt liten miljö, men för varje site som adderas så ska alla brandväggar i hela miljön konfigureras om, ifall man inte kör ADVPN då förstås..

Hubben

FGVM-01 kommer att vara vår hubb, huvudkontor, nav eller vad vi nu vill kalla det. Fortinet kallar denna typ av site för Hub och det är därigenom alla förhandlingar för att skapa shortcuts ska gå.

config vpn ipsec phase1-interface
    edit "ADVPN"
        set type dynamic
        set interface "port1"
        set peertype any
        set net-device disable
        set proposal des-md5
        set add-route disable
        set dpd on-idle
        set auto-discovery-sender enable
        set tunnel-search nexthop
        set psksecret fortinet
        set dpd-retryinterval 60
    next
end

config vpn ipsec phase2-interface
    edit "ADVPN"
        set phase1name "ADVPN"
        set proposal null-md5
    next
end

Vi behöver också konfigurera vårt “overlay”, detta gör vi genom att sätta en ip-adress på VPN interfacet som vi precis har skapat.

config system interface
    edit "ADVPN"
        set vdom "root"
        set ip 10.0.0.1 255.255.255.255
        set type tunnel
        set remote-ip 10.0.0.254 255.255.255.0
        set snmp-index 13
        set interface "port1"
    next
end

Notera att ip adresserna för overlay IP’s behöver vara unika.

För att VPN tunneln ska gå upp så behöver vi skapa en policy i vårt regelverk. Samtidigt som vi gör detta kommer vi även att lägga tunnel-interfacet i en zone för att inte knyta policys och annan konfiguration direkt mot interfacet ifall vi i ett senare skede behöver ändra göra justeringar på just detta interfacet. För att även regelverket ska fungera på ett bra sätt så förenklas zone-indelningarna som finns som standard och alla interface klassas nu som INTERNAL. Detta gör att vi bara behöver ha en regel för att kunna gå vidare.

config system zone
delete CLIENTS
delete SERVERS
delete DMZ
end

config firewall policy
delete 1
delete 2
delete 3
end

config system zone
    edit "WAN"
        set interface "port1"
    next
    edit "INTERNAL"
        set interface "ADVPN" "port2" "port3" "port4"
    next
end

config firewall policy
    edit 0
        set name "ADVPN INTERNAL TRAFFIC"
        set uuid ee1f1b2a-8d7e-51ea-69f9-3d839315f684
        set srcintf "INTERNAL"
        set dstintf "INTERNAL"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set logtraffic all
    next
end

Notera att regeln är väldigt slarvig och inte skall användas på det sättet i produktion men för labb med konfiguration så förenklar detta betydligt.

Spokes

Vi fortsätter med att konfigurera spokesen. Ta fram deras Overlay IP och lägg in detta i din IP Plan. I mitt exempel kommer jag att använda mig utav den gamla goda varianten med net-device disable konfigurerat. Det går även att köra med denna enabled men då förändras konfigurationen en aning. Detta finns beskrivet i referensdokumentationen.

#FGVM-02, FGVM-03

config vpn ipsec phase1-interface
    edit "ADVPN"
        set interface "port1"
        set peertype any
        set net-device disable
        set proposal des-md5
        set add-route disable
        set auto-discovery-receiver enable
        set remote-gw 192.168.86.101
        set tunnel-search nexthop
        set psksecret fortinet
    next
end

config vpn ipsec phase2-interface
    edit "ADVPN"
        set phase1name "ADVPN"
        set proposal null-md5
    next
end

#FGVM-02:
config system interface
    edit "ADVPN"
        set vdom "root"
        set ip 10.0.0.2 255.255.255.255
        set type tunnel
        set remote-ip 10.0.0.1 255.255.255.0
        set snmp-index 13
        set interface "port1"
    next
end

FGVM-03:
config system interface
    edit "ADVPN"
        set vdom "root"
        set ip 10.0.0.3 255.255.255.255
        set type tunnel
        set remote-ip 10.0.0.1 255.255.255.0
        set snmp-index 13
        set interface "port1"
    next
end

Vi justerar även zoner och policys i spokesen. För att göra det enkelt för att konsoliderar vi även här. (Kör copy paste på koden från FGVM-01)

config system zone
delete CLIENTS
delete SERVERS
delete DMZ
end

config firewall policy
delete 1
delete 2
delete 3
end

config system zone
    edit "WAN"
        set interface "port1"
    next
    edit "INTERNAL"
        set interface "ADVPN" "port2" "port3" "port4"
    next
end

config firewall policy
    edit 0
        set name "ADVPN INTERNAL TRAFFIC"
        set uuid ee1f1b2a-8d7e-51ea-69f9-3d839315f684
        set srcintf "INTERNAL"
        set dstintf "INTERNAL"
        set srcaddr "all"
        set dstaddr "all"
        set action accept
        set schedule "always"
        set service "ALL"
        set logtraffic all
    next
end

Nu bör alla vpn-kopplingar vara uppe. Låt oss verifiera. Det enklaste sättet att göra detta på är att gå in i GUI’t och titta, har man många VPN tunnlar så blir det snabbt rörigt utan filter i CLI’t. Är tunneln inte upp (måste initieras från spokesen) så är det väldigt enkelt att ta upp dom i GUI’t för att verifiera att allt fungerar.

—– Lägg till info om hur man kollar på ett enkelt sätt i CLI’t—-

OSPF

Börja med att filtrera bort din overlay IP. Detta gör du med en prefix-lista som vi sedan kan använda i vårt routing protokoll. Listan appliceras uppifrån och ner och därmed så börjar vi med att blockera våra overlay IP’s för att sedan tillåta alla andra IP adresser.

config router prefix-list
    edit "ADVPN_OVERLAY_FILTER"
        set comments "Filter overlay IP\'s from LSDB to RIB"
        config rule
            edit 1
                set action deny
                set prefix 10.0.0.0 255.255.255.0
                set ge 32
                set le 32
            next
            edit 2
                set prefix 0.0.0.0 0.0.0.0
                unset ge
                set le 32
            next
        end
    next
end

Skriv om kostnader och vad det gör för att få trafiken att gå via hubben. sidan 61/62

Hubben

Dags att konfigurera OSPF.

config router ospf
    set router-id 10.0.0.1
    set distribute-list-in "ADVPN_OVERLAY_FILTER"
    config area
        edit 0.0.0.0
        next
    end
    config ospf-interface
        edit "ADVPN"
            set interface "ADVPN"
            set cost 1
            set dead-interval 40
            set hello-interval 10
            set mtu-ignore enable
            set network-type point-to-multipoint
        next
    end
    config network
        edit 1
            set prefix 10.0.0.0 255.255.255.0
        next
    end
    config redistribute "connected"
        set status enable
    end  
    config redistribute "static"
    end
    config redistribute "rip"
    end
    config redistribute "bgp"
    end
    config redistribute "isis"
    end
end

Spokes

Konfigurera samma lista som ovan för att filtrera bort overlay IPs från RIB’en. Kör sedan in denna konfiguration för OSPF på spokesen: (Notera att router-id behöver justeras per spoke)

config router ospf
    set router-id 10.0.0.2
    config area
        edit 0.0.0.0
        next
    end
    config ospf-interface
        edit "ADVPN"
            set interface "ADVPN"
            set cost 100
            set dead-interval 40
            set hello-interval 10
            set mtu-ignore enable
            set network-type point-to-multipoint
        next
    end
    config network
        edit 1
            set prefix 10.0.0.0 255.255.255.0
        next
    end
    config redistribute "connected"
        set status enable
    end
    config redistribute "static"
    end
    config redistribute "rip"
    end
    config redistribute "bgp"
    end
    config redistribute "isis"
    end
end

Verifiering

Dags att testa om routingen och shortcutsen fungerar. Börja med att ta upp en lista på FGVM-02 på vilka VPN-tunnlar som är etablerade:

FGVM-02 # get vpn ipsec tunnel summary 
'ADVPN' 192.168.86.101:0  selectors(total,up): 1/1  rx(pkt,err): 31/0  tx(pkt,err): 31/6

Verifiera att routingtabellen är komplett:

FGVM-02 # get router info routing-table all
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
       O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       * - candidate default

Routing table for VRF=0
S*      0.0.0.0/0 [10/0] via 192.168.86.1, port1
C       10.0.0.0/24 is directly connected, ADVPN
O       10.0.0.1/32 [110/100] via 10.0.0.1, ADVPN, 00:17:00
C       10.0.0.2/32 is directly connected, ADVPN
O       10.0.0.3/32 [110/101] via 10.0.0.1, ADVPN, 00:00:14
O E2    10.1.2.0/24 [110/10] via 10.0.0.1, ADVPN, 00:16:59
O E2    10.1.3.0/24 [110/10] via 10.0.0.1, ADVPN, 00:16:59
O E2    10.1.4.0/24 [110/10] via 10.0.0.1, ADVPN, 00:16:59
C       10.2.2.0/24 is directly connected, port2
C       10.2.3.0/24 is directly connected, port3
C       10.2.4.0/24 is directly connected, port4
O E2    10.3.2.0/24 [110/10] via 10.0.0.1, ADVPN, 00:00:13
O E2    10.3.3.0/24 [110/10] via 10.0.0.1, ADVPN, 00:00:13
O E2    10.3.4.0/24 [110/10] via 10.0.0.1, ADVPN, 00:00:13
C       192.168.86.0/24 is directly connected, port1

Endast en tunnel till FGVM-01 är uppe. För att initiera shortcuten och för att även se att det är detta som händer så kör vi följande kommandon i CLI’t:

diag debug console timestamp enable
diag vpn ike log filter clear
diag debug application ike -1
diag debug disable #Skrivs innan så att man enkelt kan trycka "pil upp" för att avsluta
diag debug enable

Öppna sedan en till session till brandväggen och skicka iväg en ping från FGVM-02s nät till FGVM-03s nät

Vi letar efter följande meddelanden i IKE debuggen:

ike 0:ADVPN:0: notify msg received: SHORTCUT-OFFER
ike 0:ADVPN: shortcut-offer 10.2.2.1->10.3.2.1 psk 64 ppk 0 ver 1 mode 0
ike 0 looking up shortcut by addr 10.3.2.1, name ADVPN
ike 0:ADVPN: send shortcut-query 7423739491596010835 6db92facfed09ae6/0000000000000000 192.168.86.102 10.2.2.1->10.3.2.1 psk 64 ttl 32 nat 0 ver 1 mode 0
ike 0:ADVPN: recv shortcut-reply 7423739491596010835 6db92facfed09ae6/dd2416a826f44149 192.168.86.103 to 10.2.2.1 psk 64 ppk 0 ver 1 mode 0 ext-mapping 192.168.86.103:500
ike 0:ADVPN: shortcut-reply received from 192.168.86.103:500, local-nat=no, peer-nat=no
ike 0:ADVPN: created connection: 0xd9bc920 3 192.168.86.102->192.168.86.103:500.
ike 0:ADVPN: adding new dynamic tunnel for 192.168.86.103:500
ike 0:ADVPN_0: added new dynamic tunnel for 192.168.86.103:500

Verifiera att det har byggts en till tunnel:

FGVM-02 # get vpn ipsec tunnel summary 
'ADVPN_0' 192.168.86.103:0  selectors(total,up): 1/1  rx(pkt,err): 12/0  tx(pkt,err): 10/1
'ADVPN' 192.168.86.101:0  selectors(total,up): 1/1  rx(pkt,err): 132/0  tx(pkt,err): 130/6

Reflektioner

Följer man instruktionerna i dokumentet från Fortinet så fungerar detta alldeles utmärkt. Routes distribueras på ett bra sätt mellan noderna och shortcutsen fungerar direkt utan något strul.

Det hade varit väldigt intressant att bygga om lösningen och flytta IPSec ip-adressen till ett Loopback interface, då detta brukar vara fallet i en miljö som redan kör OSPF. Personligen skulle jag dock inte använda samma protokoll för intern routing som för ADVPN utan försöka att hålla isär det då det blir en mycket klarare felsökningsbild. Så har du OSPF i miljön idag så titta istället på BGP implementationen av ADVPN, men sitter du däremot med BGP mot dina internetleverantörer så är det lämpligt att istället gå vidare med OSPF för denna funktionen.