Temat: Wydajność serwerów OpenVPN i WireGuard
Wydajność serwerów OpenVPN i WireGuard
Wracam z formułą "projekt na sobotę". W wątku o ZTE MF286D pojawiło się kilka postów dotyczących różnic pomiędzy OpenVPN i WireGuard, padła tam też propozycja zrobienia porównania wydajności obu VPNów na routerze. Ponieważ nie chcę sobie psuć swoich konfiguracji to do swojego centrum technologicznego (czytaj: na biurko) zabrałem Xiaomi AX3600 które gości u mnie już od kilku ładnych dni i służy obecnie do robienia różnych testów. Jest sobota, grzeje niemiłosiernie, więc zmarnujmy ten czas sensownie i sprawdźmy jak się zachowują poszczególne VPNy.
Dla osób które nie są zaznajomione ze wspomnianym sprzętem Xiaomi przedstawiam jego szybką specyfikację sprzętową:
- SoC Qualcomm IPQ8071A, 4 rdzenie taktowane po 1.4GHz. Fajne i szybkie
- 256 MB pamięci flash
- 512 MB pamięci RAM
- radio klasy AX, ale ono zostało wyłączone bo nie jest potrzebne
- cztery porty RJ45 100/1000Mbps, które będą tu miały znaczenie
Jak na laboratorium (biurko) przystało, robimy pewne założenia. Na Xiaomi zainstalowałem swój obraz LuCI OpenWrt 23.05, doinstalowałem pakiety iperf3 oraz openvpn-openssl (wireguard już jest w obrazie). Zrobię konfigurację (jako serwerów) obu VPNów, a następnie podłączę się skonfigurowanym klientem i sprawdzę ile ten potężny router jest w stanie przerzuć ruchu przez łącze vpn w jedną i drugą stronę. Od razu zaznaczam że nie bawię się w jakiś większy tuning - ot, po prostu robię serwer i klienta wg poradników o których wspomnę później, uruchamiam iperfa i sprawdzę co on powie. Testy będą też robione w obrębie sieci LAN żeby wyeliminować skutki słabego czy obciążonego łącza WAN.
Jak klient - mój laptop Lenovo, na którym m.in robię kompilację obrazów OpenWrt. Ma procesor AMD Ryzen 7 4800H oraz kartę sieciową 1Gbps którą z łatwością wysyca, więc on nie będzie stanowił wąskiego gardła. Na laptopie mam linuksa - Ubuntu 23.04.
Konfiguracja
Na AX3600, jak już wspomniałem, zainstalowałem obraz LuCI OpenWrt 23.05, zostawiony domyślnie tak jak jest, wifi wyłączone, doinstalowane wspomniane pakiety. Na lan jest sieć o adresacji 192.168.1.1/24. Do lanu kablem ethernetowym dołączony laptop, adres uzyskał z DHCP. Ot, zwykła domyślna konfiguracja.
Na Xiaomi mam zainstalowane:
- openvpn w wersji 2.5.8-3
- wiregaurd w wersji 1.0.20210914-2
Na laptopie mam zainstalowane:
- openvpn w wersji 2.6.1
- wiregaurd w wersji 1.0.20210914-1ubuntu3
Oba serwery będą na UDP, z inną adresacją i innych portach, zainstalowane, skonfigurowane i uruchomione na tym samym routerze. Testy będę wykonywał naprzemienne, podłączony do jednego serwera vpn, test, odłączony od niego, podłączony do drugiego serwera vpn, test, odłączony.
Testy sieci
Na początek sprawdźmy wydajność samej sieci LAN. Na Xiaomi uruchomiony serwer iperfa:
root@OpenWrt:~# iperf3 -s -D
Na laptopie zaś klient
cezary@lenovo:~$ iperf3 -c 192.168.1.1
Connecting to host 192.168.1.1, port 5201
[ 5] local 192.168.1.229 port 46240 connected to 192.168.1.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 114 MBytes 956 Mbits/sec 0 300 KBytes
[ 5] 1.00-2.00 sec 112 MBytes 937 Mbits/sec 0 300 KBytes
[ 5] 2.00-3.00 sec 112 MBytes 942 Mbits/sec 0 300 KBytes
[ 5] 3.00-4.00 sec 113 MBytes 945 Mbits/sec 0 416 KBytes
[ 5] 4.00-5.00 sec 113 MBytes 946 Mbits/sec 0 416 KBytes
[ 5] 5.00-6.00 sec 113 MBytes 952 Mbits/sec 0 847 KBytes
[ 5] 6.00-7.00 sec 111 MBytes 933 Mbits/sec 0 1.10 MBytes
[ 5] 7.00-8.00 sec 112 MBytes 944 Mbits/sec 0 1.10 MBytes
[ 5] 8.00-9.00 sec 112 MBytes 944 Mbits/sec 0 1.10 MBytes
[ 5] 9.00-10.00 sec 112 MBytes 944 Mbits/sec 0 1.10 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.10 GBytes 944 Mbits/sec 0 sender
[ 5] 0.00-10.01 sec 1.10 GBytes 941 Mbits/sec receiver
iperf Done.
Dostałem 940Mbps, co odpowiada przepustowości kabla gigabitowego. Na wszelki wypadek test odwrotny - na laptopie serwer iperfa, na Xiaomi zaś klient:
root@OpenWrt:~# iperf3 -c 192.168.1.229
Connecting to host 192.168.1.229, port 5201
[ 5] local 192.168.1.1 port 56806 connected to 192.168.1.229 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 114 MBytes 957 Mbits/sec 0 431 KBytes
[ 5] 1.00-2.00 sec 112 MBytes 943 Mbits/sec 0 471 KBytes
[ 5] 2.00-3.00 sec 112 MBytes 944 Mbits/sec 0 471 KBytes
[ 5] 3.00-4.00 sec 112 MBytes 943 Mbits/sec 0 471 KBytes
[ 5] 4.00-5.00 sec 112 MBytes 941 Mbits/sec 0 471 KBytes
[ 5] 5.00-6.00 sec 111 MBytes 936 Mbits/sec 0 471 KBytes
[ 5] 6.00-7.00 sec 112 MBytes 944 Mbits/sec 0 471 KBytes
[ 5] 7.00-8.00 sec 112 MBytes 941 Mbits/sec 0 471 KBytes
[ 5] 8.00-9.00 sec 112 MBytes 944 Mbits/sec 0 471 KBytes
[ 5] 9.00-10.00 sec 112 MBytes 944 Mbits/sec 0 471 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.10 GBytes 943 Mbits/sec 0 sender
[ 5] 0.00-10.00 sec 1.10 GBytes 941 Mbits/sec receiver
iperf Done.
Czyli praktycznie wysyca się gigabit w obie strony. Test był prosty, miał za zadnie wprowadzenie punktu odniesienia jakim jest czysta sieć LAN.
OpenVPN
Serwer został skonfigurowany na podstawie poradnika OpenWrt - konfiguracja serwera OpenVPN w trybie TUN, w podstawowej jego wersji - konfiguracja obejmowała tylko zestawienie łącza pomiędzy urządzeniami. Wynikowa konfiguracja wyglądała tak:
config openvpn 'home'
option enabled '1'
option dev 'tun0'
option port '1194'
option proto 'udp'
option log '/tmp/openvpn.log'
option verb '3'
option ca '/etc/openvpn/ca.crt'
option cert '/etc/openvpn/serwer.crt'
option key '/etc/openvpn/serwer.key'
option server '10.8.0.0 255.255.255.0'
option topology 'subnet'
option dh '/etc/openvpn/dh.pem'
Nic nadzwyczajnego, zwykły serwer. Po skonfigurowaniu i uruchomieniu klienta zweryfikowałem czy jest połączenie (ping przechodził do 10.8.0.1), upewniłem się że jest trasa do serwera:
cezary@lenovo:~$ ip r | grep tun0
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
Sprawdzamy więc tunel. Tak samo jak poprzednio - na Xiaomi uruchomiony serwer iperf3, na laptopie klient:
cezary@lenovo:~$ iperf3 -c 10.8.0.1
Connecting to host 10.8.0.1, port 5201
[ 5] local 10.8.0.2 port 42356 connected to 10.8.0.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 17.0 MBytes 142 Mbits/sec 9 120 KBytes
[ 5] 1.00-2.00 sec 20.9 MBytes 175 Mbits/sec 0 211 KBytes
[ 5] 2.00-3.00 sec 20.6 MBytes 173 Mbits/sec 0 273 KBytes
[ 5] 3.00-4.00 sec 20.5 MBytes 172 Mbits/sec 0 321 KBytes
[ 5] 4.00-5.00 sec 20.8 MBytes 175 Mbits/sec 0 364 KBytes
[ 5] 5.00-6.00 sec 20.2 MBytes 169 Mbits/sec 0 403 KBytes
[ 5] 6.00-7.00 sec 20.7 MBytes 174 Mbits/sec 0 437 KBytes
[ 5] 7.00-8.00 sec 19.6 MBytes 165 Mbits/sec 78 356 KBytes
[ 5] 8.00-9.00 sec 19.0 MBytes 159 Mbits/sec 0 397 KBytes
[ 5] 9.00-10.00 sec 19.2 MBytes 161 Mbits/sec 0 422 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 198 MBytes 166 Mbits/sec 87 sender
[ 5] 0.00-10.00 sec 197 MBytes 166 Mbits/sec receiver
iperf Done.
Wyszło 166Mbps, czyli tylko 17.5% możliwości łącza. Sprawdzam jeszcze ruch w drugą stronę:
root@OpenWrt:~# iperf3 -c 10.8.0.2
Connecting to host 10.8.0.2, port 5201
[ 5] local 10.8.0.1 port 33418 connected to 10.8.0.2 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 19.3 MBytes 162 Mbits/sec 27 489 KBytes
[ 5] 1.00-2.00 sec 18.5 MBytes 155 Mbits/sec 0 559 KBytes
[ 5] 2.00-3.00 sec 18.3 MBytes 154 Mbits/sec 0 609 KBytes
[ 5] 3.00-4.00 sec 18.3 MBytes 153 Mbits/sec 0 643 KBytes
[ 5] 4.00-5.00 sec 17.8 MBytes 149 Mbits/sec 1 490 KBytes
[ 5] 5.00-6.00 sec 18.3 MBytes 153 Mbits/sec 0 519 KBytes
[ 5] 6.00-7.00 sec 18.3 MBytes 153 Mbits/sec 0 536 KBytes
[ 5] 7.00-8.00 sec 18.4 MBytes 154 Mbits/sec 0 549 KBytes
[ 5] 8.00-9.00 sec 18.3 MBytes 153 Mbits/sec 0 574 KBytes
[ 5] 9.00-10.00 sec 18.4 MBytes 154 Mbits/sec 0 595 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 184 MBytes 154 Mbits/sec 28 sender
[ 5] 0.00-10.03 sec 183 MBytes 153 Mbits/sec receiver
iperf Done.
I też nie jest za bogato - tylko 154Mbps.
WireGuard
Serwer został skonfigurowany na podstawie poradnika OpenWrt - WireGuard, w takich samych założeniach jak powyżej - w podstawowej jego wersji pozwalającej na wykonanie połączenia pomiędzy urządzeniami:
config interface 'wg0'
option proto 'wireguard'
option private_key 'QIOo7tw1xpG6YcXxDM1XtHiIn1XXXXXXXX'
option listen_port '55055'
list addresses '10.9.0.1/24'
config wireguard_wg0
option route_allowed_ips '1'
list allowed_ips '10.9.0.2/32'
option persistent_keepalive '25'
option public_key '5ysmFgWREAb2Ff3zz25uNu4vX5mhXXXXXXXX'
Weryfikuje istnienie połączenia i trasy:
cezary@lenovo:~$ ip r | grep wg0
10.9.0.1 dev wg0 scope link
Procedura ta sama - na Xiaomi uruchomiony serwer iperf3, na laptopie klient:
cezary@lenovo:~$ iperf3 -c 10.9.0.1
Connecting to host 10.9.0.1, port 5201
[ 5] local 10.9.0.2 port 38042 connected to 10.9.0.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 89.4 MBytes 750 Mbits/sec 0 446 KBytes
[ 5] 1.00-2.00 sec 89.8 MBytes 753 Mbits/sec 0 446 KBytes
[ 5] 2.00-3.00 sec 90.1 MBytes 756 Mbits/sec 0 446 KBytes
[ 5] 3.00-4.00 sec 89.9 MBytes 754 Mbits/sec 0 446 KBytes
[ 5] 4.00-5.00 sec 90.3 MBytes 757 Mbits/sec 0 446 KBytes
[ 5] 5.00-6.00 sec 89.5 MBytes 751 Mbits/sec 0 468 KBytes
[ 5] 6.00-7.00 sec 90.2 MBytes 757 Mbits/sec 0 468 KBytes
[ 5] 7.00-8.00 sec 90.1 MBytes 756 Mbits/sec 0 468 KBytes
[ 5] 8.00-9.00 sec 87.6 MBytes 735 Mbits/sec 0 497 KBytes
[ 5] 9.00-10.00 sec 76.6 MBytes 642 Mbits/sec 0 520 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 884 MBytes 741 Mbits/sec 0 sender
[ 5] 0.00-10.01 sec 882 MBytes 739 Mbits/sec receiver
iperf Done.
I mamy 740Mbps. Został ostatni test w drugą stronę:
root@OpenWrt:~# iperf3 -c 10.9.0.2
Connecting to host 10.9.0.2, port 5201
[ 5] local 10.9.0.1 port 47172 connected to 10.9.0.2 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 88.0 MBytes 738 Mbits/sec 0 456 KBytes
[ 5] 1.00-2.00 sec 89.5 MBytes 750 Mbits/sec 0 456 KBytes
[ 5] 2.00-3.00 sec 89.4 MBytes 750 Mbits/sec 0 456 KBytes
[ 5] 3.00-4.00 sec 90.0 MBytes 755 Mbits/sec 0 456 KBytes
[ 5] 4.00-5.00 sec 89.5 MBytes 751 Mbits/sec 0 456 KBytes
[ 5] 5.00-6.00 sec 89.5 MBytes 750 Mbits/sec 0 456 KBytes
[ 5] 6.00-7.00 sec 89.4 MBytes 750 Mbits/sec 0 456 KBytes
[ 5] 7.00-8.00 sec 89.4 MBytes 750 Mbits/sec 0 456 KBytes
[ 5] 8.00-9.00 sec 88.8 MBytes 745 Mbits/sec 0 456 KBytes
[ 5] 9.00-10.00 sec 90.0 MBytes 755 Mbits/sec 0 456 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 893 MBytes 749 Mbits/sec 0 sender
[ 5] 0.00-10.00 sec 892 MBytes 749 Mbits/sec receiver
iperf Done.
Podsumowując:
- zwykłe łącze: 944Mbps / 943Mbps
- OpenVpn: 166Mbps / 154Mbps
- WireGaurd 741Mbps / 749Mbps
Wireaguard jest szybszy, choć oczywiście należy pamiętać że na ogólną wydajność serwera VPN może może wpływać wydajność i obciążenie samego routera oraz szybkość łącza na którym stoi serwer. No i należy pamiętać że jeżeli ktoś ma łącze niesymetryczne, np. 500/50 to wąskim gardłem będzie to 50Mbps uploadu, którego nie przeskoczymy.
Od kliku wydań kernela linuksowego dostępny jest moduł kernelowy dla OpenVPN - DCO (OpenVPN Data Channel Offload aka OVPN-DCO), o którym można poczytać tutaj. Jak nazwa wskazuje moduł ma za zadanie odciążyć OpenVPN i realizować niektóre rzeczy na poziomie kernela, co ma skutkować sporym przyśpieszeniem działania OpenVPN. Ale... DCO współpracuje z OpenVPN od wersji 2.6 a w OpenWrt mamy wersję 2.5.8 (nawet w wersji rozwojowej), więc na wykorzystanie DCO przyjdzie nam chwilę poczekać.