User Tools

Site Tools


informatique:fortinet:offloading

Accélération hardware sur un Fortigate

L'offloading (ou accélération hardware) est le fait de déléguer certains calculs pour décharger le CPU du Fortigate. Cela peut être le cas pour le chiffrement des tunnels IPSec ou SSL par exemple.

Chez Fortinet il y a 2 types d'ASICs : des network processors (NP) pour accélérer les flux réseaux, et des content processors (CP) pour la partie sécurité (antivirus, IPS, etc) ; leur suffixe indique leur génération (NP4, NP6, CP8…) et donc leur performance.

Cas général

2 commandes pour afficher différents informations relatives à la prise en charge sur des NPx :

config global
get hardware npu np6 {options}
# commande plus verbeuse :
diagnose npu np6 {plus d'options}

Port binding

Pour afficher l'attribution des NP par port physique (ici on est sur un 3000D = 2 NP6) :

diagnose npu np6 port-list 
Chip   XAUI Ports            Max   Cross-chip 
                             Speed offloading 
------ ---- -------          ----- ---------- 
np6_0  0    port1            10G   Yes        
       0    port6            10G   Yes        
       1    port2            10G   Yes        
       1    port5            10G   Yes        
       2    port3            10G   Yes        
       2    port8            10G   Yes        
       3    port4            10G   Yes        
       3    port7            10G   Yes        
------ ---- -------          ----- ---------- 
np6_1  0    port10           10G   Yes        
       0    port13           10G   Yes        
       1    port9            10G   Yes        
       1    port14           10G   Yes        
       2    port12           10G   Yes        
       2    port15           10G   Yes        
       3    port11           10G   Yes        
       3    port16           10G   Yes        
------ ---- -------          ----- ----------

Fonctionnalités activées

Pour afficher les fonctionnalités activées pour chaque NP (toujours sur notre 3000D)

diagnose npu np6 npu-feature
                    np_0      np_1      
------------------- --------- --------- 
Fastpath            Enabled   Enabled   
Low-latency-mode    Disabled  Disabled  
Low-latency-cap     No        No        
IPv4 firewall       Yes       Yes       
IPv6 firewall       Yes       Yes       
IPv4 IPSec          Yes       Yes       
IPv6 IPSec          Yes       Yes       
IPv4 tunnel         Yes       Yes       
IPv6 tunnel         Yes       Yes       
GRE tunnel          No        No        
GRE passthrough     Yes       Yes       
IPv4 Multicast      Yes       Yes       
IPv6 Multicast      Yes       Yes       
CAPWAP              Yes       Yes
 
# Pour modifier ces fonctionnalités :
config system np6
   show full-configuration

Compteurs

Pour afficher l'état des NP6 : notamment le nombre de sessions :

  • actives
  • offloadées (insert-success)
  • dropped (insert-total - insert-success)
config global
   diagnose npu np6 sse-stats 0
Counters        SSE0            SSE1            Total           
--------------- --------------- --------------- --------------- 
active          3455            3521            6976            
insert-total    457586249       456796466       914382715       
insert-success  457586249       456796466       914382715       
delete-total    457582794       456792945       914375739       
delete-success  457582794       456792945       914375739       
purge-total     0               0               0               
purge-success   0               0               0               
search-total    1429081013      634733460       2063814473      
search-hit      3594216301      2717149912      2016398917      
mcast-tx        0               0               0               
--------------- --------------- --------------- --------------- 
pht-size        8421376         8421376         
oft-size        8355840         8355840         
oftfree         8355837         8355839         
PBA             3001

Afficher l'état d'un flux

Les informations de de l'offloading d'une session sont affichées par la commande diagnose sys session list (qu'il faut filtrer au préalable) ; par exemple pour une session vers l'IP 10.0.0.1 :

diagnose sys session filter dst 10.0.0.1
diagnose sys session list
 
session info: proto=6 proto_state=05 duration=64 expire=62 timeout=300 flags=00000000 sockflag=00000000 sockport=0 av_idx=0 use=3
origin-shaper=
reply-shaper=
per_ip_shaper=
ha_id=0 policy_dir=0 tunnel=/ vlan_cos=0/255
state=may_dirty npu 
statistic(bytes/packets/allow_err): org=132/3/1 reply=92/2/1 tuples=2
tx speed(Bps/kbps): 2/0 rx speed(Bps/kbps): 1/0
orgin->sink: org pre->post, reply pre->post dev=23->21/21->23 gwy=10.1.1.78/10.40.3.171
hook=pre dir=org act=noop 10.40.3.171:50412->10.1.1.78:80(0.0.0.0:0)
hook=post dir=reply act=noop 10.1.1.78:80->10.40.3.171:50412(0.0.0.0:0)
pos/(before,after) 0/(0,0), 0/(0,0)
misc=0 policy_id=294 auth_info=0 chk_client_info=0 vd=0
serial=d3e5760d tos=ff/ff app_list=0 app=0 url_cat=0
dd_type=0 dd_mode=0
npu_state=0x000c00
npu info: flag=0x81/0x81, offload=8/8, ips_offload=0/0, epid=144/146, ipid=146/144, vlan=0x0000/0x0000
vlifid=146/144, vtag_in=0x0000/0x0000 in_npu=2/2, out_npu=2/2, fwd_en=0/0, qid=10/10

Si npu_state n'est pas égal à 0, le flux est offloadé. Le détail est de la ligne npu_info suivante :

offload=1/1 for NP1(FA1) sessions.
offload=2/2 for NP1(FA2) sessions.
offload=3/3 for NP2 sessions.
offload=4/4 for NP4 sessions.
offload=5/5 for XLR sessions.
offload=6/6 for Nplite/NP4lite sessions.
offload=7/7 for XLP sessions.
offload=8/8 for NP6 sessions.
 
flag 0x81 means regular traffic.
flag 0x82 means IPsec traffic.

Certaines sessions ne sont pas accélérées, la raison est indiquée par le champs no_ofld_reason. Par exemple les flux locaux (depuis ou vers le firewall lui-même) apparaissent ainsi :

npu_state=00000000
no_ofld_reason:  local

Cas de l'IPSec

Normalement l'accélération hardware est activée par défaut mais on peut l'activer (ou la désactiver) pour les tunnels IPSec :

# Pour les tunnels routés cela se configure dans la phase1-interface :
config vpn ipsec phase1-interface
   edit VPN_CC
      set npu-offload enable / disable
      end
 
# pour les tunnel "policés" cela se configure dans la règle de sécurité (policy rule) :
config firewall policy
   edit 666
      set auto-asic-offload enable / disable
      end

On peut vérifier si un tunnel déjà en fonctionnement est offloader avec la commande :

diagnose vpn tunnel list
------------------------------------------------------
name=VPN_CC ver=2 serial=6 10.1.0.2:0->10.1.0.1:0 lgwy=static tun=intf mode=auto bound_if=63
proxyid_num=1 child_num=0 refcnt=14 ilast=0 olast=0
stat: rxp=6368841 txp=6731147 rxb=4398430118 txb=3970892477
dpd: mode=active on=1 idle=5000ms retry=3 count=0 seqno=782898
natt: mode=none draft=0 interval=0 remote_port=0
proxyid=VPN_CC proto=0 sa=1 ref=2 serial=8 auto-negotiate
  src: 0:0.0.0.0/0.0.0.0:0
  dst: 0:0.0.0.0/0.0.0.0:0
  SA: ref=13 options=0000002d type=00 soft=0 mtu=8942 expire=16144/0B replaywin=0 seqno=15da81
  life: type=01 bytes=0/0 timeout=28776/28800
  dec: spi=3b375eb8 esp=aes key=32 3f886d511bbd876b51e773d81f224b1996795f3cab45bf1a8cbe75db8bd5c5c7
       ah=sha1 key=20 3c759708cf49b7b8e5e2cba53bbfed4a5a227db0
  enc: spi=2504abb2 esp=aes key=32 ee4bf12fd1bc4890a33ab3b2b01c3c38cac9e577a1e1f5fd05aba91fed63be07
       ah=sha1 key=20 ff7b549870d3178a36e058701c6c47af0850155d
  dec:pkts/bytes=1264385/998573510, enc:pkts/bytes=1435424/911313083
  npu_flag=03 npu_rgwy=10.1.0.1 npu_lgwy=10.1.0.2 npu_selid=11

En fonction du retour de npu_flag :

  • npu_flag=00 = le trafic de ce tunnel n'est pas offloadé, il est traité par le kernel / le CPU
  • npu_flag=01 = seul le trafic ESP egress (chiffrement du trafic sortant) est offloadé
  • npu_flag=02 = seul le trafic ESP ingress (déchiffrement du trafic entrant) est offloadé
  • npu_flag=03 = le trafic est complètement offloadé (chiffrement/déchiffrement)

On peut consulter les statistiques globales des paquets offloadés par type de chiffrement/hachage :

diagnose vpn ipsec status
All ipsec crypto devices in use:
NP4_0
	null:	0	0
	des:	1705631651	1192070656
	3des:	0	0
	aes:	5878223616	5638495744
	aria:	0	0
	seed:	0	0
	null:	1350134	1330944
	md5:	7153174737	6497740928
	sha1:	429330396	331494528
	sha256:	0	0
	sha384:	0	0
	sha512:	0	0
NPU HARDWARE
	null:	0	0
	des:	1705737077	0
	3des:	0	0
	aes:	5865489387	0
	aria:	0	0
	seed:	0	0
	null:	940	0
	md5:	7151362270	0
	sha1:	419358130	0
	sha256:	0	0
	sha384:	0	0
	sha512:	0	0
CP8:
	null:	0	0
	des:	3518	19562
	3des:	0	0
	aes:	89251217	134711660
	aria:	0	0
	seed:	0	0
	null:	11	8
	md5:	1916481	36449376
	sha1:	101	12495755
	sha256:	1770094	1397917
	sha384:	0	0
	sha512:	85568242	84395409
SOFTWARE:
	null:	0	0
	des:	0	0
	3des:	0	0
	aes:	0	0
	aria:	0	0
	seed:	0	0
	null:	0	0
	md5:	0	0
	sha1:	0	0
	sha256:	0	0
	sha384:	0	0
	sha512:	0	0

Ici, un 800c (doté d'un NP4 et un CP8) offloade tous ses flux. S'il ne le faisait pas on aurait les compteurs SOFTWARE: qui s'incrémenteraient.

La prise en charge de chaque type de chiffrement/hachage est fonction de la version des ASICs (NPU et CP) présents sur le Fortigate ; un peu plus de détails ici : Fortigate : architecture interne

Liens utiles / source

informatique/fortinet/offloading.txt · Last modified: 2018/06/19 09:09 by pteu