U ovom seminaru proučava se Wireguard protokol. Uspoređuje ga se s IPSec-om i OpenVPN-om te se navode prednosti i nedostaci u odnosu na ta dva popularna VPN protokola.
Analiziraju se performanse i sigurnost kao i način na koji radi Wireguard protokol.
Kao praktični dio, radi se uspostava Wireguard VPN mreže između udaljenog poslužitelja (VPS) i klijenta (osobno računalo) te se opisuju svi potrebni koraci za ostvarenje takve mreže.
Keywords: VPN; Wireguard
VPN (engl. Virtual private network) proširuje privatnu mrežu preko javne mreže i omogućuje korisnicima slanje ili primanje podataka preko dijeljene ili javne mreže kao da su spojeni direktno na privatnu mrežu. VPN tehnologija je razvijena kako bi se udaljenim radnicima ili uredima omogućio pristup poslovnim aplikacijama i resursima. Kako bi se osigurala sigurnost privatna mreža uspostavljena je koristeći enkriptirani mrežni tunel i VPN korisnici koriste metode autentifikacije kao što su lozinke ili certifikati kako bi dobili pristup virtualnoj privatnoj mreži. U nekim drugim okolnostima obični korisnici interneta mogu koristiti VPN kako pristupili sadržaju koji je ograničen na neku geografsku lokaciju ili koji je cenzuriran u njihovoj državi ili da se spoje na proxy poslužitelj radi zaštite osobnog identiteta i lokacije te da ostanu anonimni na internetu. Način na koji VPN funkcionira grafički je prikazan na slici ispod.
Trenutno postoji nekoliko različitih mrežnih protokola koji se koriste za ostvarivanje VPN-a. Najrašireniji su OpenVPN i IPSec.
OpenVPN je najpopularniji VPN protokol danas. Zbog velikog broja korisnika i otvorenosti koda, a i zbog toga jer je prošao razne nezavisne sigurnosne provjere mnogi ga smatraju i najsigurnijim VPN protokolom.
Ovaj protokol nema nativnu podršku od operacijskih sustava pa je potrebno koristiti posebne aplikacije (OpenVPN klijente) za spajanje na mrežu. Davatelji VPN usluga većinom imaju svoje aplikacije koje se jednostavno instaliraju i koriste na svim popularnim operacijskim sustavima.
Sigurnost i performanse:
IPSec je sigurni mrežni protokol koji autentificira i enkriptira pakete poslane preko mreže. IPSec radi u potpunosti na mrežnom sloju za razliku od OpenVPN-a koji za enkripciju koristi TLS koji radi na sloju iznad transportnog. Osim toga, IPSec je podržan nativno na većini operacijskih sustava i može se koristiti bez dodatnih VPN klijent aplikacija što je još jedna prednost u odnosu na OpenVPN.
IPSec enkriptira cijeli IP paket koristeći:
Kada se koristi za ostvarivanje VPN-a IPSec se uparuje s protokolima za tuneliranje (IKEv2 i L2TP). Važno je napomenuti da je IPSec protokol navodno kompromitiran od stane NSA (engl. National Security Agency) što dovodi u pitanje njegovu sigurnost. Više o tome se može pročitati na poveznici: https://en.wikipedia.org/wiki/IPsec#Alleged_NSA_interference
IKEv2 (engl. Internet Key Exchange) su razvili Cisco i Microsoft i zatvorenog je koda (iako postoje neke verzije otvorenog koda). Nativno ga podržavaju Windows, MacOS i iOS. Najpopularniji je na mobilnim uređajima jer je nativno podržan na iOS-u i efikasniji je od OpenVPN-a po pitanju iskorištavanja CPU-a što dovodi do duljeg trajanja baterije, a ima i mogućnost ponovnog uspostavljanja konekcije.
Sigurnost i performanse:
L2TP (engl. Layer 2 Tunneling Protocol) su također razvili Cisco i Microsoft i nativno je podržan na Windows-u i MacOS-u.
Sigurnost i performanse:
Wireguard je sigurni mrežni tunel koji radi na mrežnom sloju. Implementiran je kao virtualno mrežno sučelje u Linux-u.Trenutno je u fazi razvoja, ali već se može koristiti, a plan je da bude prihvaćen u mainline Linux početkom 2020. godine. Wireguard koristi UDP protokol i može koristiti bilo koji port, a razmjena ključeva najsličnija je razmjeni ključeva koju koristi SSH (ovo je detaljno opisano kasnije). Wireguard koristi Curve25519 za razmjenu ključeva, ChaCha20 za enkripciju podataka i Poly1305 za autentifikaciju podataka, SipHash za ključeve u hash tablici i BLAKE2s za hashiranje.
Neki od ciljeva ovog protokola su:
Wireguard radi tako da se doda kao mrežno sučelje (isto kao i mrežno sučelje za LAN (eth0) ili WLAN (wlan0)) naziva wg* pri čemu * označava broj. Nakon toga mrežno sučelje se može konfigurirati standardnim alatima kao što su ifconfig
ili ip-address
, a rute se mijenjaju koristeći route
ili ip-route alate
. Oni dijelovi sučelja koji su specifični za Wireguard se konfiguriraju koristeći wg
alat.
Wireguard povezuje IP adrese tunela s javnim ključevima i udaljenim krajnjim točkama. Kada sučelje šalje paket svom peer-u događa se sljedeće:
ABCDEFGH
(ako peer nije konfiguriran onda se paket odbacuje)ABCDEFGH
ABCDEFGH
? To je UDP port 53133 na poslužitelju 216.58.211.110Kada sučelje primi paket onda se radi sljedeće:
LMNOPQRS
, zapamti da je njegova posljednja krajnja točka: 98.139.183.24:7361 i koristi UDP.LMNOPQRS
slati podatke prema nama kao 192.168.43.89?U WIreguard-u se koristi koncept naziva Cryptokey Routing koji radi na način da povezuje javne ključeve s listom IP adresa koje su dozvoljene unutar tunela. Svako mrežno sučelje ima privatni ključ i listu peer-ova. Svaki peer ima javni ključ. Javni ključevi su kratki i jednostavni i njih koriste peer-ovi kako bi se međusobno autentificirali. Mogu se prenositi preko konfiguracijskih datoteka bilo kojom metodom slično kako se prenose i SSH javni ključevi.
Primjerice, poslužitelj može imati ovakvu konfiguraciju:
[Interface] PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk= ListenPort = 51820 [Peer] PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg= AllowedIPs = 10.192.122.3/32, 10.192.124.1/24 [Peer] PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0= AllowedIPs = 10.192.122.4/32, 192.168.0.0/16 [Peer] PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA= AllowedIPs = 10.10.10.230/32
Klijent može imati ovakvu konfiguraciju:
[Interface] PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE= ListenPort = 21841 [Peer] PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw= Endpoint = 192.95.5.69:51820 AllowedIPs = 0.0.0.0/0
U konfiguraciji poslužitelja svaki peer (klijent) će moći slati pakete onom mrežnom sučelju čija se izvorišna IP adresa nalazi u listi dozvoljenih IP adresa. Na primjer, kada poslužitelj dobije paket od peer-a gN65BkIK…
, nakon dekripcije i autentifikacije, ako je izvorišna IP adresa paketa 10.10.10.230 on se prihvaća, a inače se odbacuje.
Nadalje, u konfiguraciji poslužitelja, ako mrežno sučelje želi poslati paket peer-u (klijentu) ono gleda odredišnu IP adresu i uspoređuje ju s listom dozvoljenih IP adresa svakog peer-a da vidi kojem peer-u ga treba poslati. Primjerice, ako mrežno sučelje želi poslati paket s odredišnom IP adresom 10.10.10.230, ono taj paket enkriptira koristeći javni ključ od peer-a gN65BkIK…
te ga šalje prema zadnjoj korištenoj krajnjoj točki tog peer-a.
U klijentskoj konfiguraciji njegov jedini peer (poslužitelj) može slati pakete mrežnom sučelju s bilo koje izvorišne IP adrese jer se sve prihvaćaju (u pravilima stoji 0.0.0.0/0 što znači da se prihvaćaju sve IP adrese). Primjerice, kada se primi paket od peer-a HIgo9xNz…
, ako se točno dekriptira i autentificira s bilo koje izvorišne IP adrese, onda se prihvaća, a inače se odbacuje.
Ako mrežno sučelje klijenta želi poslati paket svom jedinom peer-u (poslužitelju), ono će enkriptirati pakete za svog jedinog peer-a s bilo kojom odredišnom IP adresom (0.0.0.0/0). Na primjer, ako mrežno sučelje treba poslati paket s bilo kojom odredišnom IP adresom, ono će ga enkriptirati koristeći javni ključ od svog peer-a HIgo9xNz…
i zatim ga poslati prema zadnjoj korištenoj krajnjoj točki tog peer-a.
Drugim riječima, kada se paketi šalju lista dozvoljenih IP adresa služi kao routing tablica, a kada se paketi primaju lista dozvoljenih IP adresa se koristi za kontrolu pristupa.
Može se koristiti bilo koja kombinacija IPv4 i IPv6 adresa za bilo koje od polja u konfiguraciji. Wireguard može i enkapsulirati jednu adresu unutar druge ako je to potrebno.
Budući da su svi paketi poslani kroz Wireguard mrežno sučelje enkriptirani i autentificirani te zbog bliske povezanosti između identiteta peer-a i dozvoljenih IP adresa peer-a, administratori ne moraju pisati komplicirane konfiguracije firewall-a, kao što je recimo slučaj kod IPSec-a. Jednostavno se može napraviti provjera s koje je IP adrese paket došao i s kojeg mrežnog sučelja jer Wireguard garantira da je paket siguran i autentificiran.
Kada govorimo o performansama Wireguard-a najzanimljivija nam je usporedba s popularnijim VPN protokolima (IPSec-om i OpenVPN-om). U Wireguard-ovoj bijeloj knjizi (engl. white paper) navedena ja takva usporedba performansi.
Podaci su dobiveni korištenjem programa iperf3 između računala s procesorom Intel Core i7-3820QM i mrežnom karticom Intel 82579LM te računala s procesorom i7-5200U i mrežnom karticom Intel I218LM. Izračunat je prosjek u periodu od 30 minuta, a rezultati su prikazani na slici ispod:
Još je važno napomenuti da je CPU bio na 100% iskorištenja tijekom throughput testova OpenVPN-a i IPSec-a, a nije bio na 100% iskorištenja tijekom testa Wireguard-a što upućuje na to da je Wireguard uspio u potpunosti zasititi gigabitnu Ethernet vezu.
S obzirom da se Wireguard protokol još uvijek naglo razvija i ima mali broj korisnika nije prošao niti približan broj revizija i sigurnosnih provjera kao primjerice OpenVPN koji je dokazano siguran protokol. Na Wireguard-ovoj web stranici stoji upozorenje svim korisnicima da je ovaj projekt još uvijek u razvoju i da nema stabilnu verziju (https://www.wireguard.com/#work-in-progress).
Osim što je protokol trenutno “nedovršen” nema nekih većih zabrinutosti oko sigurnosti, ali način na koji Wireguard funkcionira nije pogodan za zaštitu privatnosti.
Kao što je prethodno napisano, jedan od glavnih ciljeva Wireguard protokola je da bude jednostavan za korištenje, a to se može najbolje vidjeti u ovom poglavlju gdje je opisano stvaranje stvaranje vlastitog VPN-a korištenjem Wireguard-a.
Arhitektura sustava opisana je sljedećom slikom:
Što je potrebno?
Najprije je potrebno instalirati Wireguard s obzirom da još uvijek ne dolazi s kernel-om. U ovom slučaju korišten je Ubuntu 18.04 i proces instalacije je sljedeći:
# add-apt-repository ppa:wireguard/wireguard # apt-get update # apt-get install wireguard-dkms wireguard-tools linux-headers-$(uname -r)
# wg genkey | tee privatekey | wg pubkey> publickey
Potrebno je stvoriti datoteku /etc/wireguard/wg0.conf
na poslužitelju sa sljedećim sadržajem:
[Interface] Address = 10.200.200.1/24 SaveConfig = true PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -o %i -j ACCEPT PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -o %i -j ACCEPT ListenPort = 51820 PrivateKey = <server private key> [Peer] PublicKey = <client public key> AllowedIPs = 10.200.200.2/24 Endpoint = <client_public_ip>:<port>
Objašnjenje konfiguracije:
Address = 10.200.200.1/24: IP adresa i adresni prostor Wireguard-a u VPN-u.
SaveConfig = true: spremi konfiguraciju da ostane trajna i nakon prekida veze.
ListenPort = 51820: UDP port na kojem VPN čeka nadolazeći promet, može biti i neki drugi broj.
PrivateKey = <server private key>: ovo je sadržaj prethodno stvorene datoteke na poslužitelju privatekey
PublicKey = <client public key>: ovo je sadržaj datoteke publickey datoteke na klijentu
AllowedIPs = 10.200.200.2/24: IP adrese kojima je dozvoljeno slanje i primanje prometa kroz VPN
Endpoint = <client_public_ip>:<port>: ova postavka je ažurirana svaki put kad se peer spoji na poslužitelj s druge ip adrese i opcionalna je, ali meni spajanje nije radilo ako sam izostavio tu liniju.
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -o %i -j ACCEPT PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -o %i -j ACCEPT
PostUp opisuje koja se pravila izvode kada se VPN veza uspostavlja: Prvo i treće pravilo omogućuju dolazni odnosno odlazni promet na Wireguard sučelju (%i
). Drugo pravilo omogućuje da VPN promet prođe kroz nat na mrežnom sučelju eth0
što je sučelje preko kojeg je poslužitelj spojen na internet.
PostDown opisuje koja se pravila izvode kada se VPN veza prekida. Pravila su jednaka kao i u PostUp samo što se ovdje brišu (zastavica -D) umjesto da se dodaju (zastavica -A).
Najprije se postave ispravne dozvole na konfiguracijskim datotekama.
# chown -v root:root /etc/wireguard/wg0.conf # chmod -v 600 /etc/wireguard/wg0.conf
Nakon toga se podigne Wireguard sučelje:
# systemctl enable wg-quick@wg0.service
Zatim je potrebno postaviti IP forwarding na poslužitelju kako bi promet mogao prolaziti kroz tunel.
# sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
Kako se ne bi moralo ponovno pokrenuti poslužitelja mogu se izvršiti ove dvije naredbe.
# sysctl -p # echo 1> /proc/sys/net/ipv4/ip_forward
Praćenje VPN konekcije:
# iptables -A INPUT -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT # iptables -A FORWARD -m conntrack –ctstate RELATED,ESTABLISHED -j ACCEPT
Prihvati promet na UDP port-u kojeg koristi Wireguard:
# iptables -A INPUT -p udp -m udp –dport 51820 -m conntrack –ctstate NEW -j ACCEPT
Dozvoli rekurzivni TCP i UDP DNS promet:
# iptables -A INPUT -s 10.200.200.0/24 -p tcp -m tcp –dport 53 -m conntrack –ctstate NEW -j ACCEPT # iptables -A INPUT -s 10.200.200.0/24 -p udp -m udp –dport 53 -m conntrack –ctstate NEW -j ACCEPT
Dopusti prijenos podataka koji su u VPN tunelu (možda nije potrebno jer već postoji u Wireguard konfiguraciji, ali meni nije radilo bez ovoga):
# iptables -A FORWARD -i wg0 -o wg0 -m conntrack –ctstate NEW -j ACCEPT
Postavi nat (možda nije potrebno jer već postoji u Wireguard konfiguraciji, ali meni nije radilo bez ovoga):
# iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o eth0 -j MASQUERADE
Spremi pravila da ostanu i nakon ponovnog pokretanja računala:
# apt-get install iptables-persistent # systemctl enable netfilter-persistent # netfilter-persistent save
Dobra je praksa osigurati da DNS promet bude siguran. Korištenjem ove konfiguracije štitimo naš poslužitelj od curenja DNS podataka, lažnih proxy konfiguracija i raznik Man-In-The-Middle napada.
Najprije moramo instalirati unbound:
# apt-get install unbound unbound-host
Zatim preuzmemo listu korijenskih DNS poslužitelja:
# curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
Nakon toga moramo napisati konfiguraciju /etc/unbound/unbound.conf
sa sljedećim sadržajem (konfiguracija je komentirana pa nije potrebno dodatno pojašnjenje pojedinih pravila):
server: num-threads: 4 # Enable logs verbosity: 1 # list of Root DNS Server root-hints: "/var/lib/unbound/root.hints" # Use the root servers key for DNSSEC auto-trust-anchor-file: "/var/lib/unbound/root.key" # Respond to DNS requests on all interfaces interface: 0.0.0.0 max-udp-size: 3072 # Authorized IPs to access the DNS Server access-control: 0.0.0.0/0 refuse access-control: 127.0.0.1 allow access-control: 10.200.200.0/24 allow # not allowed to be returned for public internet names private-address: 10.200.200.0/24 # Hide DNS Server info hide-identity: yes hide-version: yes # Limit DNS Fraud and use DNSSEC harden-glue: yes harden-dnssec-stripped: yes harden-referral-path: yes # Add an unwanted reply threshold to clean the cache and avoid when possible a DNS Poisoning unwanted-reply-threshold: 10000000 # Have the validator print validation failures to the log. val-log-level: 1 # Minimum lifetime of cache entries in seconds cache-min-ttl: 1800 # Maximum lifetime of cached entries cache-max-ttl: 14400 prefetch: yes prefetch-key: yes
Na kraju je samo još potrebno postaviti dozvole i pokrenuti unbound:
# chown -R unbound:unbound /var/lib/unbound # systemctl enable unbound
Način na koji se Wireguard instalira ovisi o distribuciji GNU/Linux-a koju koristite.
# wg genkey | tee privatekey | wg pubkey> publickey
Potrebno je stvoriti datoteku /etc/wireguard/wg0.conf
sa sljedećim sadržajem:
[Interface] Address = 10.200.200.2/24 PrivateKey = <client private key> DNS = 10.200.200.1 [Peer] PublicKey = <server public key> Endpoint = <server_public_ip>:51820 AllowedIPs = 0.0.0.0/0 PersistentKeepalive = 21
Objašnjenje konfiguracije:
Address = 10.200.200.2/24: IP adresa i adresni prostor Wireguard klijenta u VPN-u.
PrivateKey = <client private key>: sadržaj prethodno stvorene datoteke privatekey na klijentu.
DNS = 10.200.200.1: adresa DNS poslužitelja.
PublicKey = <server public key>: sadržaj datoteke publickey na poslužitelju.
Endpoint = <server_public_ip>:51820: javna ip adresa servera i port na kojem sluša VPN promet.
AllowedIPs = 0.0.0.0/0: ovo je wildcard kojim se dozvoljava da se na poslužitelj spoji s bilo koje IP adrese.
PersistentKeepalive = 21: pošalji autentificirani prazni paket peer-u svakih 21 sekundu da se spriječe potencijalni problemi s firewall-om ili NAT-om.
Kako bi se spojili na VPN potrebno je aktivirati mrežno sučelje wg0
. To se može učiniti sljedećom naredbom:
$ sudo wg-quick up wg0
Nakon izvođenja ove naredbe trebali bi biti spojeni na VPN. Status možete provjeriti ovako:
$ sudo wg Dobije se ispis: interface: wg0 public key: <public client key> private key: (hidden) listening port: 32801 fwmark: 0xca6c peer: <public server key> endpoint: <public_server_ip>:51820 allowed ips: 0.0.0.0/0 latest handshake: 2 seconds ago transfer: 2.04 MiB received, 4.51 MiB sent persistent keepalive: every 21 seconds
VPN se može ugasiti naredbom:
$ sudo wg-quick down wg0
Za provjeru je li VPN upaljen može se koristiti alate traceroute koji ispisuje put kojim zahtjev putuje koji mora biti drugačiji s VPN-om i bez njega.
VPN isključen:
$ traceroute google.com
traceroute to google.com (216.58.207.174), 30 hops max, 60 byte packets 1 _gateway (192.168.0.1) 4.062 ms 6.276 ms 6.132 ms 2 10.208.56.1 (10.208.56.1) 19.334 ms 31.814 ms 35.844 ms 3 * * * 4 100.64.0.74 (100.64.0.74) 35.689 ms 35.651 ms 35.581 ms 5 * * * 6 dh120-53.xnet.hr (83.139.120.53) 35.417 ms 31.647 ms 63.185 ms 7 212.162.29.117 (212.162.29.117) 74.309 ms * * 8 ae-2-3101.bar1.Budapest1.Level3.net (4.69.201.150) 64.354 ms 73.763 ms 73.798 ms 9 ae-2-3101.bar1.Budapest1.Level3.net (4.69.201.150) 86.898 ms 91.141 ms 91.179 ms 10 72.14.243.192 (72.14.243.192) 68.187 ms 68.053 ms 50.025 ms 11 74.125.242.227 (74.125.242.227) 76.204 ms * 74.125.242.226 (74.125.242.226) 49.574 ms 12 216.239.48.144 (216.239.48.144) 74.725 ms 216.239.48.120 (216.239.48.120) 70.866 ms 216.239.48.144 (216.239.48.144) 63.884 ms 13 172.253.70.102 (172.253.70.102) 66.526 ms 64.828 ms 172.253.72.248 (172.253.72.248) 61.331 ms 14 108.170.247.97 (108.170.247.97) 75.478 ms 108.170.247.113 (108.170.247.113) 74.012 ms 108.170.247.97 (108.170.247.97) 86.185 ms 15 * 209.85.252.235 (209.85.252.235) 83.468 ms 209.85.252.233 (209.85.252.233) 87.459 ms 16 muc11s04-in-f14.1e100.net (216.58.207.174) 82.050 ms 66.597 ms *
VPN uključen:
$ traceroute google.com
traceroute to google.com (172.217.22.46), 30 hops max, 60 byte packets 1 10.200.200.1 (10.200.200.1) 29.185 ms 33.921 ms 33.878 ms 2 139.162.128.2 (139.162.128.2) 33.872 ms 33.821 ms 33.837 ms 3 139.162.129.10 (139.162.129.10) 38.861 ms 38.811 ms 38.739 ms 4 de-cix.fra.google.com (80.81.192.108) 33.286 ms 139.162.129.9 (139.162.129.9) 33.459 ms 33.394 ms 5 de-cix.fra.google.com (80.81.192.108) 33.054 ms 108.170.251.129 (108.170.251.129) 33.025 ms de-cix.fra.google.com (80.81.192.108) 32.899 ms 6 108.170.251.129 (108.170.251.129) 32.933 ms 66.249.95.29 (66.249.95.29) 31.776 ms 66.249.95.31 (66.249.95.31) 35.813 ms 7 fra15s16-in-f14.1e100.net (172.217.22.46) 35.739 ms 35.733 ms 66.249.95.31 (66.249.95.31) 35.890 ms
Vidimo da je s uključenim VPN-om prvi skok na adresu 10.200.200.1 što je adresa našeg poslužitelja u VPN-u.
[1] https://www.wireguard.com/papers/wireguard.pdf
[2] https://www.wireguard.com/
[3] https://en.wikipedia.org/wiki/Virtual_private_network
[4] https://en.wikipedia.org/wiki/IPsec
[5] https://restoreprivacy.com/wireguard/
[6] https://www.ivpn.net/knowledgebase/254/Using-WireGuard-for-Privacy-Protection.html
[7] https://restoreprivacy.com/openvpn-ipsec-wireguard-l2tp-ikev2-protocols/
[8] https://en.wikipedia.org/wiki/WireGuard