OpenVPN(-NL) Performance Jan Just Keijser 9 November 2017 1
Wie ben ik? Werkzaam in de ICT sinds 1995 Werk bij Nikhef als Grid System Engineer sinds 2005 In 2004 OpenVPN “ontdekt” Sinds die tijd gebruiker en supporter van OpenVPN Auteur van “OpenVPN 2 Cookbook” (2011), “Mastering OpenVPN” (2015, met Eric Crist) en “OpenVPN Cookbook - 2nd Edition” (2017) ICT interesses: open source, netwerken, VPNs, performance, security, openssl, socat 2
Wat heb ik met performance? Experimenten produceren steeds meer data: 20 PB/jr Voor verwerking hebben we 100,000 cores online 100 Gbps netwerken Terabit link tussen Nikhef en Amsterdam Beveiliging is zeer belangrijk: 100k cores zijn erg aantrekkelijk voor hackers Gevaren: DDoS, spam, mining, etc 3
Wat heb ik met performance? 4
Ingrediënten voor een snel VPN Hardware Netwerk Software OS Crypto libraries OpenVPN 2.4+ Configuratie en instellingen Meetmethode 5
Hardware Architectuur: Skylake+ of Ryzen+ Kloksnelheid AES support in CPU, of crypto accelerator Test: openssl speed -evp aes-256-gcm Met AES-NI: 1583037.32k Zonder: 92490.41k (gebruik “OPENSSL_ia32cap=0 openssl ...”) 6
Netwerk OpenVPN kan makkelijk 100+ Mbps aan Met allerlaatste CPUs haalt OpenVPN ~ 1 Gbps Als je niet vastzit aan MTU=1500 dan haalt OpenVPN 2+ Gbps (record: 2.85 Gbps @ MTU=9000) Test altijd eerst de “raw” netwerk snelheid: “raw” iperf: 940 Mbps OpenVPN iperf: 900 Mbps @ MTU=1500 (gebruik “iperf -c … -l 64M -n 2G”) 7
Software: OS Server OS: Linux (of *BSD) Betere “tun” driver Betere netwerk stack Client OS: Linux, Windows, Android (geen idee van MacOS/iOS performance) Embedded devices: Check de kloksnelheid Bedenk dat voor iedere 1 Mbps throughput circa 3 MHz CPU power nodig is Met een 250 MHz MIPS CPU krijg je geen 100+ Mbps VPN 8
Software: crypto libraries OpenSSL versus mbedTLS OpenSSL heeft betere hand-gecodeerde assembly routines voor AES en SHA V1.0.1 speed aes-256-gcm: 1583037.32k V1.1.0 speed aes-256-gcm: 2864162.70k OpenVPN op Gigabit Ethernet: V2.4.4 AES-256-GCM (mbedTLS eist hoofdletters!) OpenSSL iperf : 905 +/- 10 Mbps) MbedTLS iperf : 480 +/- 10 Mbps) 9
Software: OpenVPN V2.4+: Negotiate Cipher Protocol GCM cipher suites → encrypt+hash in 1 stap → snelheid! Met en zonder GCM V2.4.4 “--ncp-disable” (aes-256-cbc) : 650 Mbps Met NCP (aes-256-gcm) : 900 Mbps Vooral belangrijk voor de server Bij meerdere clients wordt de throughput verdeeld 10
Configuratie (1) Proto udp vs tcp Soms is “proto tcp” echt sneller! Dev tun vs tap Bridging = no-no voor performance IPv4 vs IPv6 IPv6 is ca 10% langzamer. (verwacht: max 2%) Tls-auth/tls-crypt: Zou niks uit moeten maken In sommige gevallen zie ik 5% perf drop 11
Configuratie (2) Het illustere kwartet link-mtu tun-mtu fragment mssfix Eigenlijk is alleen “fragment” noodzakelijk Een hogere tun-mtu waarde werkt alleen bij point-to- point links Voor Ethernet netwerken nauwelijks de moeite waard; voor ADSL/kabel en 4G/LTE wel van toepassing 12
Configuratie (3) Dubbele server setup loont 1 server voor LAN clients met standaard instellingen 1 server voor mobiele clients Aparte crypto instellingen --cipher, --auth Aparte MTU instellingen --fragment, --mssfix, --tun-mtu Ook vanuit beveiligingsoogpunt een goed idee (vergelijk met BYOD) 13
Scripts & plugins Server-side script BLOKKEERT alle clients zolang het loopt Gebruik plugins waar mogelijk: die draaien in een aparte thread Two Factor Authentication: rekeying is vaak heel langzaam Ook bij rekeying blokkeert de server Niet echt geschikt voor de server zelf Speel met --reneg-sec en --reneg-bytes 14
Meetmethode “iperf”, “iperf3” & “ping” are your friends “iperf” : throughput “ping” : latency Throughput wordt beter van hogere MTU/fragment waarde Latency wordt beter van lagere MTU waarde Gebruik iperf -c …. -l 4M -n 2G -fk voor consistentere resultaten 15
Test configuratie proto udp port 1194 dev tun server 10.200.0.0 255.255.255.0 ca ca.crt cert server.crt key server.key dh dh1024.pem tls-auth ta.key 0 user nobody group nobody cipher aes-256-cbc auth sha256 16
Windows vs Linux clients Server: Skylake Xeon Gold 5115 @ 3.2 GHz Client: Haswell i7-4810 @ 3.8 GHz Linux client: OpenVPN 2.3: 600 Mbps OpenVPN 2.4: 840 Mbps Windows 7 client, OpenVPN 2.4: Naar client: ~400 Mbps UDP: naar server: 50 Mbps TCP: naar server: 120 Mbps 17
De “tun”/TAP-WIN adapter UDP/TCP encrypted traffic 1 Ethernet OpenVPN 3 2 tun/tap device 18
Het probleem @ Gigahertz+ 19
Toekomst Minder monolithisch ontwerp Betere schaalbaarheid Meer stroomlijnen voor performance En uiteraard: nog snellere CPUs :) 20