pfSense: AES-NI Hardware Crypto Acceleration in KVM

Achtung! Dieser Artikel ist älter als ein Jahr. Der Inhalt ist möglicherweise nicht mehr aktuell!

Wie schon des öfteren erwähnt nutze ich in meinem Heimnetzwerk eine pfSense Firewall in einer KVM Maschine. Ich möchte mein Netzwerk in Regensburg mit dem bei meinen Großeltern zusammenschalten via einem Site-To-Site OpenVPN Konstrukt. Dazu habe ich mir die PcEngines APU.1D4 gekauft. Ein Test im lokalem Gigabit Netzwerk war aber wenig erfreulich. Die Geschwindigkeit reichte gerade so für einen HD Stream aus.

Ich hatte zuerst die vergleichsweise schwache CPU in der APU.1D4 in Verdacht, der die „moderne“ Crypto zu schaffen machen. Es stellte sich aber schnell heraus, dass diese sich nahezu langweilt und fast keine CPU Zeit verbraucht wird.

Kein durchreichen von Hardwarefeatures

Der Flaschenhals war tatsächlich auf meinem Hostsystem zu finden: Es war die CPU Einstellung des KVM Hypervisors auf meinem Hostsystem.

Damit möglichst wenig Overhead für das Vortäuschen von Hardware verwendet wird nutze ich Standard Komponenten wie die VirtIO Treiber oder die QEMU CPU. Diese unterstützt aber nicht das Durchreichen von Hardwarefeatures wie AES-NI, obwohl der Intel Core i5-4440 meines Hostsystems AES-NI hat.

Als einzige Ausnahme verwende ich als CPU für meine Firewall den Typ „Sandy Bridge“, was letzendlich einen Intel Xeon E3 Prozessor emuliert.

Nach einem Reboot spuckte dmesg folgendes aus:

CPU: Intel Xeon E312xx (Sandy Bridge) (3100.06-MHz K8-class CPU)
 Origin = "GenuineIntel" Id = 0x206a1 Family = 0x6 Model = 0x2a Stepping = 1
 Features=0x78bfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2>
 Features2=0x9fb82203<SSE3,PCLMULQDQ,SSSE3,CX16,SSE4.1,SSE4.2,x2APIC,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,HV>
 AMD Features=0x28100800<SYSCALL,NX,RDTSCP,LM>
 AMD Features2=0x1<LAHF>
 TSC: P-state invariant

Durch den emulierten Xeon Prozessor sind so gut wie alle Hardwarefeatures nun angeblich in dem FreeBSD System verfügbar, darunter auch das gewünschte Feature AES-NI.

Mit Hilfe von OpenSSL kann man prüfen, ob das Feature richtig erkannt und tatsächlich verwendbar:

[2.2.6-RELEASE][admin@firewall.veloc1ty.lan]/root: 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 ]

Das Kernelmodul cryptodev (Ich glaube zumindest, dass es auf FreeBSD ebenfalls ein Kernelmodul ist) kann von OpenSSL verwendet werden. Vor dem Speedtest muss pfSense über die Verfügbarkeit informiert werden.

pfSense Einstellungen

Eventuell pfSense durch die „falsche“ CPU bei der Installation keine Hardwareunterstützung und hat deshalb alle Einstellungen deaktiviert. In der Weboberfläche musste ich deshalb via System -> Advanced -> Miscellaneous in der Kategorie „Cryptographic Hardware Acceleration“ die Option „AES-NI CPU-based Acceleration (aesni)“ auswählen und speichern.

pfSense-aes-ni-hardware-acceleration

Nach dem Reboot sollten nun alle Services mit Crypto vieles direkt in Hardware ausführen/berechnen lassen.

Speedtest

Nach dem Reboot habe ich mit OpenSSL einen Speedtest von AES-128-CBC durchgeführt, da diese beim Site-To-Site VPN zum Einsatz kommen soll. Die Ergebnisse lassen sich sehen:

Ohne EVP API:

[2.2.6-RELEASE][admin@firewall.veloc1ty.lan]/root: openssl speed aes-128-cbc
Doing aes-128 cbc for 3s on 16 size blocks: 24173237 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 64 size blocks: 6624025 aes-128 cbc's in 3.00s
Doing aes-128 cbc for 3s on 256 size blocks: 1691361 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 1024 size blocks: 902516 aes-128 cbc's in 2.99s
Doing aes-128 cbc for 3s on 8192 size blocks: 115047 aes-128 cbc's in 3.01s
OpenSSL 1.0.1l-freebsd 15 Jan 2015
built on: date not available
options:bn(64,64) rc4(16x,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 129260.55k 141312.53k 144706.31k 308863.13k 313339.02k

Mit EVP API:

[2.2.6-RELEASE][admin@firewall.veloc1ty.lan]/root: openssl speed -evp aes-128-cbc
Doing aes-128-cbc for 3s on 16 size blocks: 1850387 aes-128-cbc's in 0.27s
Doing aes-128-cbc for 3s on 64 size blocks: 1769459 aes-128-cbc's in 0.38s
Doing aes-128-cbc for 3s on 256 size blocks: 1523368 aes-128-cbc's in 0.32s
Doing aes-128-cbc for 3s on 1024 size blocks: 975349 aes-128-cbc's in 0.20s
Doing aes-128-cbc for 3s on 8192 size blocks: 225272 aes-128-cbc's in 0.06s
OpenSSL 1.0.1l-freebsd 15 Jan 2015
built on: date not available
options:bn(64,64) rc4(16x,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 111458.61k 295824.66k 1217505.43k 5113637.77k 29526851.58k

Die Ergebnisse sprechen für sich. Die EVP API erkennt die Hardware Unterstützung und nutzt diese wirklich. Filesharing via VPN macht nun auch deutlich mehr Spaß.

Further Reading:

 

Update 09.05.2016

In der Web GUI auf dem Dashboard sieht man nun die verfügbaren Hardware Cryptop Features:

pfSense_used_hardware_crypto_features


Du hast einen Kommentar, einen Wunsch oder eine Verbeserung? Schreib mir doch eine E-Mail! Die Infos dazu stehen hier.

🖇️ = Link zu anderer Webseite
🔐 = Webseite nutzt HTTPS (verschlüsselter Transportweg)
Zurück