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.