Wireguard ist der neue Renner im VPN Umfeld. Aber wie schlägt es sich in Punkto Performance gegen IPSec / IKEv2? Deswegen habe ich einen kleinen Test gemacht. In meinem Testszenario habe ich zwei Server im selben Datacenter per VPN über IPv6 verbunden und gegen IPv6 Endpunkte testen lassen die direkt auf den jeweiligen VPN Knoten liegen. Warum IPv6? Weil es IKEv2 nativ implementiert, und nicht wie bei IPv4 eine rückportierte Entwicklung ist, und es performanter ist (Beispiel: weg-rationalisierte Header) bzw. sein sollte.
Die Tests selber habe ich mit iperf gemacht.
Die Wireguard Entwickler haben ebenfalls einen Benchmark Vergleich veröffentlicht der ein bisschen von meinen Ergebnissen abweicht.
Testaufbau
Der obere Teil des Bildes beschreibt die Endpunkte für die IKEv2 Tests und der untere Teil die für Wireguard. Wobei bei Wireguard der Tunnel über die IPv6 Adressen aufgebaut und innerhalb des Tunnels ein Overlay Netzwerk gebildet wird. Die Wireguard Tests sind jeweils gegen die IP Adressen im Overlay Netzwerk gemacht worden.
Wireguard Konfiguration
Beide Server haben zusätzlich eine IPv4 Adresse konfiguriert weil sich wg-quick sonst beschwert.Warning: AllowedIP has nonzero host part
Server 1
[Interface]
PrivateKey = BlahServer1blahPrivate=
Address = 192.168.3.1/24,fd00:b19:7175:babe::1/64
ListenPort = 51820
[Peer]
Endpoint = [2a03:4000:9:ab::3]:51820
PublicKey = BlahServer2blahPublic=
AllowedIPs = 192.168.3.2/32,fd00:b19:7175:babe::2/128
PersistentKeepalive = 25
Server 2
[Interface]
PrivateKey = BlahServer2blahPrivate=
Address = 192.168.3.2/24,fd00:b19:7175:babe::2/64
ListenPort = 51820
[Peer]
Endpoint = [2a03:4000:15:3a::3]:51820
PublicKey = BlahServer1blahPublic=
AllowedIPs = 192.168.3.0/24,fd00:b19:7175:babe::/64
PersistentKeepalive = 25
IKEv2 Konfiguration
Als IKEv2 Server habe ich Strongswan in Version 5.6.2 installiert. Mindestens Version 5.5 wird benötigt um ein mit Wireguard möglichst ähnliches Szenario aufbauen zu können. Ein echter Vergleich kann ja nur gezogen werden, wenn ich mit Strongswan die selbe Cipher und elliptische Kurve benutze, die auch Wireguard benutzt. Deswegen musste es eine Strongswan Version sein die auf jedenfall Curve25519, ChaCha20 und Poly1305 unterstützt.
In der unten aufgeführten Konfiguration sind die zusätzlich getesteten ike und esp Einstellungen auskommentiert drin. Jegliche Auswertungen beziehen sich hier aber, soweit nicht anders angegeben, auf die aktive Konfiguration. Alle weiteren möglichen IKEv2 Cipher Kombinationen lassen sich im Strongswan Wiki nachschlagen.
Server 1
config setup
conn %default
ikelifetime=1440m
keylife=60m
rekeymargin=3m
keyingtries=1
dpddelay=30
dpdtimeout=120
dpdaction=hold
conn mx.geekbundle.org_ipv6
type=transport
left=2a03:4000:15:3a::2
right=2a03:4000:9:ab::2
authby=secret
keyexchange=ikev2
auto=start
#esp=aes128gcm16!
ike=aes128gcm16-prfsha256-curve25519!
#esp=chacha20poly1305-curve25519,chacha20poly1305-ecp192!
#ike=chacha20poly1305!
esp=chacha20poly1305-curve25519!
conn mx.geekbundle.org_ipv4
type=transport
left=185.170.112.195
right=37.221.196.47
authby=secret
keyexchange=ikev2
auto=start
#esp=aes128gcm16!
ike=aes128gcm16-prfsha256-curve25519!
#esp=chacha20poly1305-curve25519,chacha20poly1305-ecp192!
#ike=chacha20poly1305!
esp=chacha20poly1305-curve25519!
Server 2
config setup
conn %default
ikelifetime=1440m
keylife=60m
rekeymargin=3m
keyingtries=1
dpddelay=30
dpdtimeout=120
dpdaction=hold
conn vps06.geekbundle.org_ipv6
type=transport
left=2a03:4000:9:ab::2
right=2a03:4000:15:3a::2
authby=secret
keyexchange=ikev2
auto=start
#esp=aes128gcm16!
ike=aes128gcm16-prfsha256-curve25519!
#esp=chacha20poly1305-curve25519,chacha20poly1305-ecp192
#ike=chacha20poly1305!
esp=chacha20poly1305-curve25519!
conn vps06.geekbundle.org_ipv4
type=transport
left=37.221.196.47
right=185.170.112.195
authby=secret
keyexchange=ikev2
auto=start
#esp=aes128gcm16!
ike=aes128gcm16-prfsha256-curve25519!
#esp=chacha20poly1305-curve25519,chacha20poly1305-ecp192!
#ike=chacha20poly1305!
esp=chacha20poly1305-curve25519!
iperf Tests
Für die Tests benutze ich bewusst iperf2 und nicht iperf3. iperf3 hat bei IPv6 UDP Verbindungen noch einen Bug der dafür sorgt, dass der Server von der falschen IPv6 Adresse antwortet. Siehe auch Issue 637 im iperf3 Github Projekt. Um einen Durchschnittswert zu ermitteln, wurde jeder Test 10x wiederholt. Aus Neugierde habe ich die Tests ebenfalls mit IPv4 gemacht. Das war aber eher sekundär.
Durchsatz
Server: iperf -V -s -p 6000
Wireguard IPv6: iperf -e -V -c fd00:b19:7175:babe::2 -t 20 -p 6000 -P 1 -B fd00:b19:7175:babe::1
Wireguard IPv4: iperf -e -c 192.168.3.2 -t 20 -p 6000 -P 1 -B 192.168.3.1
IKEv2 IPv6: iperf -e -V -c 2a03:4000:9:ab::2 -t 20 -p 6000 -P 1 -B 2a03:4000:15:3a::2
IKEv2 IPv4: iperf -e -c 37.221.196.47 -t 20 -p 6000 -P 1 -B 185.170.112.195
- -e Erweitertes reporting
- -V Benutze IPv6
- -c Ziel Adresse
- -t Wie lange soll ein Test laufen in Sekunden
- -p Port des iperf Server
- -P Anzahl paralleler Streams
- -B Source Adresse
Fazit
Wireguard ist schneller (Bandwidth und Transfer) und stabiler (Retry Count) als IKEv2 mit vergleichbaren Einstellungen. Allerdings empfinde ich die Unterschiede in der Geschwindigkeit eher vernachlässigbar. Interessanter finde ich hingegen den Retry Count. Wireguard schafft es einen VPN Tunnel deutlich stabiler aufrecht zu erhalten als IKEv2. Ich lehne mich hier aber mal ein bisschen aus dem Fenster und stelle die These auf, dass die Stabilität mehr an der Kombination aus Cipher und elliptischer Kurve liegt. Im Vergleich zur AES Cipher schafft Strongswan mit der Chacha20 Cipher auch eine deutlich stabilere Verbindung. Eventuell muss hier ja nur in der Implementierung nachgebessert werden um genau so stabil zu sein wie Wireguard?
Würde ich mir wünschen. Denn das Ökosystem um IKEv2 ist deutlich ausgebauter als das von Wireguard. Alle möglichen Router und Betriebssysteme unterstützen es schon von Haus aus. Zudem gibt es schon etablierte Tools für z.B. Benutzerauthentifizierung.
Allerdings hat Wireguard den Vorteil, dass es deutlich einfacher zu konfigurieren ist als IKEv2 und auch etwas weniger versierte Techniker einen VPN Tunnel damit aufgebaut bekommen.
Mein "Notizzettel" mit ausführlicheren Ergebnissen ist der Vollständigkeit halber hier auch noch einsehbar: Klickst du hier.
Trotz meiner Präferierung von IKEv2 nutze ich für mein VPN nach Hause Wireguard, wegen der genannten Stabilität und um es mal kennen gelernt zu haben. Ich nutze es vor allem damit mein Smartphone vom zu Hause gehostetem DNS basierten Adblocker Pi-hole profitieren kann. Als Wireguard Client kommt auf meinem Android Smartphone Viscerion VPN zum Einsatz. Es bietet eine Tasker Integration die bei mir dafür sorgt, dass ausserhalb meines Heim-WLAN das VPN automatisch gestartet und beim Verbinden mit dem Heim-WLAN getrennt wird.