ranet3: High performance policy routed IPsec mesh SD-WAN

Technische Specificaties

  • Transport: Userspace ESP (RFC 4303) in tunnelmodus over UDP (RFC 3948)
  • Handshake: IKEv2 (RFC 7296) met hybride ML-KEM (FIPS 203) sleuteluitwisseling (RFC 9370)
  • Routing: Embedded Babel speaker (RFC 8966) met RTT-metrieken (RFC 9616) en bron-specifieke routes (RFC 9079)
  • Steering: SRv6 (RFC 8986) op basis van bron/bestemmingsprefix
  • Broncode: github:ranet3/ranet3
  • Licentie: FSL-1.1-ALv2 / Apache-2.0
  • Contact: mesh@ranet3.com
  • Netwerken: Powering AS10779 / AS18932

Waarom ranet3?

Protocollen en routing

Standaard protocollen

  • strongSwan: IKEv2 en ESP-sessies met Ed25519-sleutels.
  • BIRD: Babel-routes met RTT-metrieken en overeenkomstige routes voor route-verificatie.
  • Linux Kernel: seg6local werkt op de SRv6-headers die ranet3 schrijft.

Elke andere router of switch die IKEv2 met Ed25519-sleutels, Babel en SRv6 ondersteunt, zou even tevoren interoperabel moeten zijn. In tegenstelling tot veel gangbare mesh VPN- en SD-WAN-tools (zoals Tailscale, NetBird, ZeroTier, Nebula, etc.), die alleen nodes accepteren die hun eigen agent draaien, kan ranet3 naast deze tools op dezelfde host draaien.

Routing op basis van latentie

Babel meet de round trip time (RTT) van elke verbinding en routeert via een relay zodra de directe verbinding trager is.

Voorbeeld:

  • Pad A → B: 40 ms
  • Pad B → C: 40 ms
  • Direct Pad A → C: 265 ms
  • Gekozen pad: Via B (totaal 80 ms) in plaats van de directe link (265 ms).

De RTT wordt continu gemeten; pakketverlies en uitval tellen mee in de weging van een verbinding. Verkeer kiest altijd het snelste pad en keert terug naar de directe verbinding zodra deze weer sneller is.

Segment routing

Een policy op basis van bron- en bestemmingsprefix stuurt verkeer via gekozen waypoints naar een gekozen exit. Segment routing is geïmplementeerd in userspace en werkt daarom zelfs op macOS, waarvan de XNU-kernel geen ondersteuning heeft voor deze functionaliteit.

Voorbeeld van route: Waypoint (DT46) → Laptop → Internet (Default route) → Exit

Waypoints kunnen in elke door de gebruiker opgegeven volgorde worden geplaatst en mogen herhaald worden (bijv. A → B → C → B → D, met D als exit).

Benchmarks

Gemeten op: 15 oktober 2026

Dataplane vergelijking

DataplaneProtocol en cipherPerformance (10 GbE payload limit, 1 stream één richting)Doorvoer t.o.v. anderenLatentie (RTT p99 onder verzadiging)
ranet3 (Userspace)ESP in UDP, AES-256-GCM8.39 van 8.84 Gbit/s1.2-1.5x vs wireguard-go1.91-4.96 ms
wireguard-go (Userspace)WireGuard, ChaCha20-Poly1305---
WireGuard (Kernel)WireGuard, ChaCha20-Poly1305-1.6-2.1x sneller dan ranet30.85-2.51 ms
IPsec (Kernel xfrm)ESP in UDP, AES-256-GCM-1.8-3.9x sneller dan ranet30.85-2.51 ms

Head-to-head analyse

De onderstaande tabel toont de resultaten van ranet3 gedeeld door de resultaten van de andere dataplane (waarbij een hogere waarde voor doorvoer beter is en een lagere waarde voor CPU/latentie).

DataplaneDoorvoer (hoger is beter)CPU per Gbit/s (lager is beter)Latentie p99 (lager is beter)
wireguard-go (user)1.2-1.5x beter0.8-0.9x beter0.2-1.0x gemengd
WireGuard (kernel)1.6-2.1x beter0.6x beter1.9-2.4x slechter
IPsec (kernel)1.8-3.9x beter1.1-1.7x slechter1.6-2.0x slechter

Kernel versus Userspace

Userspace dataplanes kopiëren elk pakket naar hun eigen proces en worden daarom doorgaans als trager beschouwd dan kernel-implementaties.

Doorvoer (1 stream, Gbit/s):

ImplementatieEén richtingBeide richtingenAandeel van de lijn (één richting)
Lijnlimiet (10 GbE, plain TCP)8.8418.76100%
Kernel (beste van 2)5.357.4661%
Userspace (wireguard-go)6.7710.7877%
Userspace (ranet3)8.3914.8795%
  • Kernel WireGuard blijft steken op 5.1 tot 5.4 Gbit/s (één richting).
  • Kernel IPsec blijft steken op 4.0 tot 4.7 Gbit/s omdat een enkele flow op één NIC-ontvangstwachtrij (receive queue) landt.

Volledige resultaten

Doorvoer (Verzadigd, Gbit/s ontvangen)

Hoger is beter

Testscenarioranet3 (user)wireguard-go (user)WireGuard (kernel)IPsec (kernel)
1 stream, uit8.396.775.354.67
1 stream, in8.376.955.104.44
1 stream, beide14.8710.787.464.67
8 streams, uit8.526.065.143.97
8 streams, in8.486.725.124.06
8 streams, beide15.7910.337.414.10

CPU-kosten bij 3 Gbit/s aanbod

Bezetting cores per Gbit/s, beide hosts. Lager is beter

Testscenarioranet3 (user)wireguard-go (user)WireGuard (kernel)IPsec (kernel)
1 stream, uit0.9091.0791.510.672
1 stream, in0.9251.0921.5250.664
1 stream, beide0.8980.9961.5040.525
8 streams, uit0.9961.2131.7400.845
8 streams, in0.9901.1821.7480.866
8 streams, beide0.9481.0871.5000.620

Opmerking: In de "beide" rijen transporteerde kernel IPsec slechts 4.67 en 4.14 van de aangeboden 6 Gbit/s.

Latentie onder verzadiging

RTT p99, ms. Lager is beter

Testscenarioranet3 (user)wireguard-go (user)WireGuard (kernel)IPsec (kernel)
1 stream, uit2.012.101.071.04
1 stream, in1.912.180.851.23
1 stream, beide3.173.151.651.76
8 streams, uit2.7716.401.261.53
8 streams, in2.865.091.171.50
8 streams, beide4.967.692.482.51

Setup

Hardware

  • Hosts: 2 x Dell PowerEdge C6420
  • Processor: Intel Xeon Gold 6130 (16 cores, 32 threads)
  • Geheugen: 192 GiB
  • NIC: Intel X710
  • Connector: SFP+
  • Bandbreedte: 10 Gbit/s per richting
  • Switch: Beide hosts op dezelfde Dell S5296F-ON

Software

  • OS: Debian 13
  • Kernel: Linux 6.12.111
  • wireguard-go: 0.0.20250522
  • wireguard-tools: 1.0.20260223
  • iproute2: 7.1.0
  • iperf3: 3.21

Methode

  • Verkeer: TCP met cubic bij inner MTU 1400
  • Streams: 1 en 8
  • Belasting: Verzadigd voor doorvoer en latentie; 3 Gbit/s per richting voor CPU-kosten
  • Richting: Eén richting (per kant) en beide richtingen gelijktijdig
  • Runs: Mediaan van 3 runs van 10 seconden, met de dataplanes afgewisseld
  • CPU-kosten: Bezetting cores vanuit /proc/stat, opgeteld over beide hosts, met elke dataplane ongepinned
  • Lijnlimiet: 8.84 Gbit/s TCP payload één richting (na ESP in UDP framing) en 18.76 Gbit/s beide richtingen zonder tunnel.