APU2 AES-NI nutzen / OpenVPN

Started by BeNe, November 05, 2016, 08:12:32 PM

Previous topic - Next topic
Hallo OPNsense Community,

habe mir eine APU2 zugelegt und bin gerade am konfigurieren.
Jetzt ist mir aufgefallen das ich beim anlegen von meinen OpenVPN Verbindungen (Server wie auch Client)
kein "Hardware Crypto" auswählen kann ?! Laut beschreibung hat die APU2 eine AES-NI Unterstützung.
Habe schon von OpenSSL auf LibreSSL gewechselt, hat aber leider nichts gebracht.

In den Einstellungen -> System: Settings: Miscellaneous -> hatte ich zuvor AESNI ausgewählt und neugestartet.

Hat einer einen Tipp oder ebenfalls eine APU2 mit aktivem AES-NI ?
Bei Google habe ich Foreneinträge gefunden - sind aber schon älter wo von bessere Unterstützung in FreeBSD 10.3 gesprochen wird welches ja schon einzug in OPNSense erhalten hat.

Infos zu meinem System:
Versions    OPNsense 16.7.7-amd64
FreeBSD 10.3-RELEASE-p11
LibreSSL 2.4.3

Danke & Grüße,
BeNe

Bei mir am Laptop mit AES-NI sieht es so aus:

$ openvpn --show-engines
OpenSSL Crypto Engines

Dynamic engine loading support [dynamic]


Es könnte also sein, dass es nicht dargestellt wird und stattdessen wird einfach genommen, was da ist.

Hallo BeNe

Frei nach Handbuch:
---
The setting Hardware Crypto is not used for new systems equipped with AESNI, when the aesni module is loaded it will be used automatically.
---
aus: https://docs.opnsense.org/manual/how-tos/sslvpn_s2s.html

Gruss, Stefan

Hallo Stefan,

danke für deine fixe Antwort.
Meine "openvpn --show-engines" sieht gleich aus wie deine -> leer!

Das im Wiki hatte ich schon gelesen. Allerdings bin ich um Welten von dem Ergebniss aus dem PC-Engines Forum weg --> http://www.pcengines.info/forums/?page=post&id=FF05AF29-15FD-4501-AAC9-CD669CBB5077&fid=DF5ACB70-99C4-4C61-AFA6-4C0E0DB05B2A

Daher gehe ich mal von aus dass das AESNI Module nicht (automatisch) geladen wird.
Wie könnte ich das am besten prüfen ?

QuoteMeine "openvpn --show-engines" sieht gleich aus wie deine -> leer!
Das war Fabians Antwort. Aber bei mir sieht es auf der APU2.C4 auch so aus.

QuoteDaher gehe ich mal von aus dass das AESNI Module nicht (automatisch) geladen wird.
Wie könnte ich das am besten prüfen ?
root@OPNsense:~ # kldload aesni
kldload: can't load aesni: module already loaded or in kernel

= das Modul wurde geladen.

Wie wäre es mit einem Vorher-Nachher-Test, also mal mit aktiviertem AES-NI und einmal ohne eine Messung durchführen? Stell doch mal deine Messwerte mit den gewünschten Parametern hier rein, dann können wir vergleichen.

Klar - gerne poste ich die Messwerte.

Habe heute Mittag OPNsense nochmals komplett neu augespielt.
Alle Einstellugen habe ich erstmal auf default belassen und dann den speedtest angestossen.

Jetzt sieht es sehr gut aus  :o

Ohne AES-NI

root@OPNsense:~ # openssl speed aes-128-cbc
Doing aes-128 cbc for 3s on 16 size blocks: 2997223 aes-128 cbc's in 3.09s
Doing aes-128 cbc for 3s on 64 size blocks: 787115 aes-128 cbc's in 3.04s
Doing aes-128 cbc for 3s on 256 size blocks: 199344 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 1024 size blocks: 124572 aes-128 cbc's in 3.02s
Doing aes-128 cbc for 3s on 8192 size blocks: 16009 aes-128 cbc's in 3.02s
OpenSSL 1.0.1s-freebsd  1 Mar 2016
built on: date not available
options:bn(64,64) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: clang
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128 cbc      15540.03k    16575.95k    17010.69k    42300.26k    43376.36k

Mit AES-NI

root@OPNsense:~ # openssl speed -evp aes-128-cbc
Doing aes-128-cbc for 3s on 16 size blocks: 313110 aes-128-cbc's in 0.45s
Doing aes-128-cbc for 3s on 64 size blocks: 300432 aes-128-cbc's in 0.33s
Doing aes-128-cbc for 3s on 256 size blocks: 279337 aes-128-cbc's in 0.33s
Doing aes-128-cbc for 3s on 1024 size blocks: 206289 aes-128-cbc's in 0.21s
Doing aes-128-cbc for 3s on 8192 size blocks: 57919 aes-128-cbc's in 0.10s
OpenSSL 1.0.1s-freebsd  1 Mar 2016
built on: date not available
options:bn(64,64) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: clang
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128-cbc      11056.02k    58598.55k   217936.07k  1001433.77k  4671728.72k


Die Ausgabe der openssl engine zeigt AES bis 256 an  8)

root@OPNsense:~ # openssl engine -t -c
(cryptodev) BSD cryptodev engine
[RSA, DSA, DH, AES-128-CBC, AES-192-CBC, AES-256-CBC]
     [ available ]
(rsax) RSAX engine support
[RSA]
     [ available ]
(dynamic) Dynamic engine loading support
     [ unavailable ]


Hier noch die Werte mit 256:

Ohne AES-NI:
root@OPNsense:~ # openssl speed aes-256-cbc
Doing aes-256 cbc for 3s on 16 size blocks: 2155988 aes-256 cbc's in 3.03s
Doing aes-256 cbc for 3s on 64 size blocks: 568665 aes-256 cbc's in 3.07s
Doing aes-256 cbc for 3s on 256 size blocks: 139940 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 1024 size blocks: 95278 aes-256 cbc's in 3.09s
Doing aes-256 cbc for 3s on 8192 size blocks: 11653 aes-256 cbc's in 3.09s
OpenSSL 1.0.1s-freebsd  1 Mar 2016
built on: date not available
options:bn(64,64) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: clang
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256 cbc      11380.06k    11853.70k    11941.55k    31536.06k    30934.32k


Mit AES-NI:
root@OPNsense:~ # openssl speed -evp aes-256-cbc
Doing aes-256-cbc for 3s on 16 size blocks: 319830 aes-256-cbc's in 0.57s
Doing aes-256-cbc for 3s on 64 size blocks: 308056 aes-256-cbc's in 0.41s
Doing aes-256-cbc for 3s on 256 size blocks: 275877 aes-256-cbc's in 0.37s
Doing aes-256-cbc for 3s on 1024 size blocks: 185783 aes-256-cbc's in 0.13s
Doing aes-256-cbc for 3s on 8192 size blocks: 46493 aes-256-cbc's in 0.04s
OpenSSL 1.0.1s-freebsd  1 Mar 2016
built on: date not available
options:bn(64,64) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: clang
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256-cbc       8972.76k    47615.00k   192339.10k  1432408.79k  9750288.79k


Damit sieht die VPN-Welt doch schon viel besser. Es ist mir allerding immer noch nicht klar
was an meinem Setup vor der neuinstallation so falsch war, dass ich nicht solche hohen Werte erreicht habe.

Was bekommt Ihr für Werte mit und ohne AES-NI hin ?

QuoteDie Ausgabe der openssl engine zeigt AES bis 256 an  8)
Bei mir nicht:
root@OPNsense:~ # openssl engine -t -c
(rsax) RSAX engine support
[RSA]
     [ available ]
(dynamic) Dynamic engine loading support
     [ unavailable ]

Ich vermute du hast unter System: Settings: Miscellaneous "Use /dev/crypto" "Enable old userland device for cryptographic acceleration" angehakt? Wenn ich den zugehörigen Hilfetext und die Ausführungen hier https://forum.opnsense.org/index.php?topic=2379.0 richtig verstehe, ist das unnötig bis kontraproduktiv.

Quoteopenssl speed -evp aes-128-cbc
Kommt nicht gut. Wir sollten -elapsed und /usr/local/bin/openssl verwenden, Begründung siehe im oben verlinkten Thread.

Miss bitte mal mit:
/usr/local/bin/openssl speed -elapsed aes-256-cbc (ohne AES-Beschleunigung)
/usr/local/bin/openssl speed -elapsed -evp aes-256-cbc (mit AES-Beschleunigung)

Ergibt bei mir folgende Werte:
root@OPNsense:~ # /usr/local/bin/openssl speed -elapsed aes-256-cbc
You have chosen to measure elapsed time instead of user CPU time.
Doing aes-256 cbc for 3s on 16 size blocks: 2281277 aes-256 cbc's in 3.16s
Doing aes-256 cbc for 3s on 64 size blocks: 567848 aes-256 cbc's in 3.00s
Doing aes-256 cbc for 3s on 256 size blocks: 144303 aes-256 cbc's in 3.01s
Doing aes-256 cbc for 3s on 1024 size blocks: 93567 aes-256 cbc's in 3.09s
Doing aes-256 cbc for 3s on 8192 size blocks: 11268 aes-256 cbc's in 3.00s
OpenSSL 1.0.2j  26 Sep 2016
built on: reproducible build, date unspecified
options:bn(64,64) md2(int) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -pthread -D_THREAD_SAFE -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -O3 -Wall -O2 -pipe  -fstack-protector -fno-strict-aliasing -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256 cbc      11564.49k    12114.09k    12281.87k    30969.73k    30769.15k


root@OPNsense:~ # /usr/local/bin/openssl speed -elapsed -evp aes-256-cbc
You have chosen to measure elapsed time instead of user CPU time.
Doing aes-256-cbc for 3s on 16 size blocks: 18087660 aes-256-cbc's in 3.01s
Doing aes-256-cbc for 3s on 64 size blocks: 6152322 aes-256-cbc's in 3.01s
Doing aes-256-cbc for 3s on 256 size blocks: 1809435 aes-256-cbc's in 3.01s
Doing aes-256-cbc for 3s on 1024 size blocks: 465577 aes-256-cbc's in 3.00s
Doing aes-256-cbc for 3s on 8192 size blocks: 58767 aes-256-cbc's in 3.01s
OpenSSL 1.0.2j  26 Sep 2016
built on: reproducible build, date unspecified
options:bn(64,64) md2(int) rc4(8x,int) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(idx)
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -pthread -D_THREAD_SAFE -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DL_ENDIAN -O3 -Wall -O2 -pipe  -fstack-protector -fno-strict-aliasing -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-256-cbc      96216.96k   130908.63k   154004.07k   158916.95k   160056.27k

Hallo zusammen,

Das ist immer etwas kniffelig. Ich fasse mal die letzten 2 Jahre zusammen:

Die korrekte Binary ist /usr/local/bin/openssl und muss auch so aufgerufen werden.

AES-NI ist nur im Envelope-Mode (-evp) der OpenSSL Engine verfügbar. LibreSSL hat die auch. Die Befehle sind Assembler-Code, die aesni.ko-unabhänig sind.

/dev/crypto ist nur von OpenSSL unterstützt und hat irgendwann mal folgenden Hilfetext bekommen:

Old hardware accelerators like 'safe', 'hifn' or 'ubsec' may only provide userland acceleration to e.g. OpenVPN by means of the /dev/crypto interface, which can be accessed via the OpenSSL engine framework. Note that LibreSSL does not have support for this device and instead solely relies on embedded acceleration methods e.g. AES-NI. The default is to disable this device as it is likely not needed on modern systems.

OpenVPN sollte automatisch mit AES-NI laufen. aesni.ko wird hier nicht benutzt.


Grüsse
Franco


Hallo Franco

Vielen Dank für die Zusammenfassung.

QuoteOpenVPN sollte automatisch mit AES-NI laufen. aesni.ko wird hier nicht benutzt.
Das Modul beeinträchtigt die Performance von OpenVPN aber auch nicht negativ, oder? Und IPsec profitiert davon?

Ist eigentlich der Hilfetext zu Hardware noch aktuell? Ich finden den verwirrend.
"A cryptographic accelerator module will use hardware support to speed up some cryptographic functions on systems which have the chip. Do not enable this option if you have a Hifn cryptographic acceleration card, as this will take precedence and the Hifn card will not be used. Acceleration should be automatic for IPsec when using a cipher supported by your chip, such as AES-128. OpenVPN should be set for AES-128-CBC and have cryptodev enabled for hardware acceleration.

If you do not have a crypto chip in your system, this option will have no effect. To unload the selected module, set this option to 'none' and then reboot."

Es wäre schön, wenn die konkreten Sachverhalte gebündelt im Wiki stehen würden.

Hi RdO,

Das Modul beeinträchtigt die Performance natürlich nicht. Bei IPsec im Kernel weiß ich leider zu wenig, um eine qualifizierte Aussage zu machen. Jos oder Ad wissen da deutlich mehr, können aber kein fließendes Deutsch. Ich versuche mal eine Antwort einzuholen morgen. :)

Der Hilfetext stimmt historisch gesehen schon, muss aber noch erweitert werden in der Art:

"Nothing needs selected for OpenVPN to utilize AES-NI. The OpenSSL engine has its own code for handling AES-NI that works well without using the BSD Cryptodev Engine."

Mit freundlicher Unterstützung von pfSense:

https://doc.pfsense.org/index.php/Are_cryptographic_accelerators_supported


Grüße
Franco

Hallo Franco

QuoteBei IPsec im Kernel weiß ich leider zu wenig, um eine qualifizierte Aussage zu machen. Jos oder Ad wissen da deutlich mehr, können aber kein fließendes Deutsch. Ich versuche mal eine Antwort einzuholen morgen.
Danke, das wäre cool.
Falls IPsec nicht von aesni.ko profitieren sollte frage ich mich für was man das Modul überhaupt (noch) laden/anbieten soll?

Wie wäre es mit einer Übersichtstabelle im Wiki mit: "Was in welchem Fall geladen/aktiviert werden soll"? Plus vielleicht noch eine Anleitung fürs jeweilige Benchmarking.

Gruss, Stefan

Hallo Stefan,

Jos sagte der geladene aesni.ko hat messbare Performancevorteile für AES-GCM. In FreeBSD 11.0 wird das auch noch gleich doppelt so schnell als aktuell in 10.3.

Eine Matrix für das "Wie mit was" wird immer weniger relevant mit AES-NI in der Hardware. Vielleicht sollten wir überlegen automatisch aesni.ko zu laden, dann entfällt auch die letzte Hürde im Performance Puzzle für einen Großteil?


Grüße
Franco

Hallo Franco

aesni.ko per default zu laden fände ich gut.

LG Oliver

Hi Oliver,

Okay, Ticket ist erstellt. Nur zeitlich kann ich es noch nicht einordnen.

https://github.com/opnsense/core/issues/1259


Grüsse
Franco

Hallo Franco

Vielen Dank für die Abklärung und sorry für die späte Antwort.

QuoteJos sagte der geladene aesni.ko hat messbare Performancevorteile für AES-GCM. In FreeBSD 11.0 wird das auch noch gleich doppelt so schnell als aktuell in 10.3.
Tönt gut!
Wenn ich das richtig verstehe profitiert nicht nur IPsec sondern auch SSH, TLS und dergleichen? Dann fände ich es auch gut aesni.ko per default zu laden. Oder ist das doof für Systeme ohne AES-NI? So von wegen "lade nur was effektiv benötigt wird" wegen weniger Ressourcenverbrauch, Angriffsfläche, Nebenwirkungen usw.
Falls aesni.ko nur für IPSec eine Rolle spielen sollte: Wie wäre es mit: Automatisch laden wenn IPsec aktiviert wird?
Sorry falls das dumme Fragen/Vorschläge sind, aber ich kenne mich damit null aus.
Oh, und vermutlich müsste man noch den Hilfetext entsprechend ergänzen, sonst werden vermutlich Tonnen Anfragen kommen wieso man AES-NI nicht mehr aktivieren kann. :)

Gruss, Stefan