======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 **n**etwork **p**rocessors (NP) pour accélérer les flux réseaux, et des **c**ontent **p**rocessors (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 : [[informatique:fortinet:fortigate#architecture_interne|Fortigate : architecture interne]]
=====Liens utiles / source=====
* [[http://docs-legacy.fortinet.com/fos50hlp/50/index.html#page/FortiOS%25205.0%2520Help/NP4.077.10.html|Configuration VPN IPsec accélérée : NP4 IPsec VPN offloading configuration example]]
* [[http://kb.fortinet.com/kb/documentLink.do?externalID=FD36203|Ensuring IPSec traffic is offloaded for improved throughput]]
* [[http://help.fortinet.com/fos50hlp/54/Content/FortiOS/fortigate-hardware-acceleration-52/npu-diag-commands.htm|Hardware acceleration get and diagnose commands]]