WireGuard VPN a mindennapokra

Itt a megoldás, ha távolról szeretnénk elérni erőforrásainkat vagy gépeket szeretnénk titkosítva összekötni. – írta: stopperos, 2 éve

WireGuard telepítése

A továbbiakban a WireGuard telepítését veszem végig Ubuntu 22.04-re. Megjegyezném, hogy korábbi verziókon is működik, valamint más operációs rendszereken is nagyjából hasonló lépéseken kell végigmenni. Források: 1, 2

Nyissunk egy terminált. Ha megnézzük a csomagtároló repozitóriumot, akkor az alábbiakat fogjuk találni a wireguard kulcsszóra keresve:
$ apt-cache search wireguard
wireguard-tools - … (userland utilities)
wireguard - … (metapackage)
wireguard-dkms - … (DKMS version)
wireguard-go - … Userspace implementation of Wireguard in Go/M]

Az első a segédprogramokat fogja tartalmazni, a második csak egy összefoglaló csomag, a harmadik olyan kernel verziókra van, ami régebbi mint 5.5 (ezt hiába is telepítjük), az utolsó pedig a userspace verzió a kísérletező kedvűeknek. A telepítési parancs ezek után így néz ki:

$ sudo apt install wireguard wireguard-tools

Szükségünk lesz egy privát és egy publikus kulcs-párra, amit az újonnan települt wg paranccsal fogunk elkészíteni:
$ wg genkey | tee wg.privatekey
wEggJuEZ/qUEN0wS7Zv2OPYSOz1zrXsOC6HyIJkKwk0=
$ cat wg.privatekey | wg pubkey | tee wg.publickey
/Snp1C7WPnTSwjjJk7Zk42AQ+qMRekfoAZBll0rl0jU=

El is készült a privát- és a publikus kulcs a privát alapján. Létrehozásuk során ki is írattam őket a terminálban és egy-egy fájlként el is mentettem azokat. Fontos megjegyezni, hogy ezekért mi felelünk, nekünk kell a privát kulcsunk biztonságát megoldanunk. Feltehetjük a kérdést, hogy elegendő-e a 256-bit méretű kulcs, hiszen ezen a méreten nem tudunk változtatni. OpenVPN-es tapasztalatainkból emlékezhetünk, hogy ott az 1024 és a 2048 bit méretű kulcsok a javasoltak. A gyenge kriptografikus algoritmusoknál nagyobb kulcsmérettel szokás kompenzálni a biztonság állandó értékét. Amíg a WireGuard által használt algoritmusokat nem törik meg, addig a 256 bit elegendő. Az igazán paranoiásaknak van lehetőségük egy PreSharedKey réteg használatára is, de ez csak opcionális és most nem is foglalkozom vele.

Az alábbi kripto algoritmusokat és módszereket használja a WireGuard:
* ChaCha20-Poly1305 a szimmetrikus, hitelesített titkosításhoz (AEAD, RFC7539). Nagy előnye, hogy nem kell hozzá AES-NI processzor támogatás. Tehát gyengébb processzorokon (pl kis ARM eszközök) is gyors.
* Curve25519 a privát és publikus kulcspárok alapján történő közös kulcs megalkotásához (ECDH ECDH(priv_A, pub_B) == ECDH(priv_B, pub_A)
* BLAKE2s hash-eléshez (RFC7693)
* SipHash24 a hash-táblázat kulcsokhoz
* HKDF a kulcs származtatáshoz (https://datatracker.ietf.org/doc/html/RFC5869)

Ezek nem változtatható beállítások. Ha a kliens és a szerver WireGuard protokollon keresztül akar kommunikálni, akkor nem kell kulcsot cserélnie a kapcsolat felépítésekor. Valamint nem kell megegyeznie arról, hogy milyen titkosítási módszereket fognak használni. Így nem lehet elkapni a kapcsolat kezdetén a kézfogást, mert nincs is. Ugyancsak nincs lehetőség downgrade típusú támadásra sem, amikor a megtört kliens vagy szerver egy ismert hibájú kripto algoritmust használva hajlandó csak kommunikálni. Ha bármelyik fentebb felsorolt módszerrel probléma adódna, akkor egy teljesen új WireGuard protokoll verziót kell kiadni.

A következő lépésben a kliens konfigurációs fájlját mutatom meg:
$ sudo cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = wEggJuEZ/qUEN0wS7Zv2OPYSOz1zrXsOC6HyIJkKwk0=
Address = 10.222.0.4/24
# DNS = 10.222.0.1 # <<csak ha szükséges, resolvconf!

[Peer]
PublicKey = Tu+fW9qDq6JRVB9Krllop5fl7aZEAZQhdstYWsRdMwA=
AllowedIps = 10.222.0.0/24 #, 0.0.0.0/0 # <<minden
Endpoint = wg.myserver.hu:4599 # Ip cím is ok
PersistentKeepalive = 30

Az első három sorban a kliens hálózati csatolóját határozom meg azzal a privát kulccsal, amit a korábbi lépés során hoztam létre, valamint a kliensnek adok egy IP címet, amit a WireGuard hálózaton belül fog használni. Ha kellene, akkor van lehetőség saját névfeloldó szerver megadására is, azonban arra figyelni kell, hogy a Linux klienseken szükség van a resolvconf csomagra is ehhez.
A következő öt sorban pedig azt a végpontot adom meg, ahonnan és ahová szeretne forgalmazni a kliens. Először a szerver publikus kulcsát, majd a hálózat felé irányítandó IP címtartományt, utána a szerver címét és a megnyitott port-ot, végül pedig a kapcsolat fenntartásához az elküldendő keepalive csomagok közti időtartamot. Ez utóbbi nem szükséges, csak bizonyos internet-szolgáltatók eszközei hajlamosak eldobni a kiépített kapcsolatokat, ha azokon nincsen forgalom.

Vegyük észre az AllowedIps mögötti /24-es subnet maszkot. Ezt azt is fogja jelenteni, hogy a wireguard hálózatunkba csatlakozó összes kliens tud majd kommunikálni velünk.

Fontos megjegyeznem, hogy a fenti konfigurációs fájl csak a WireGuard hálózaton lévő eszközökkel kicserélendő forgalmat fogja a hálózat felé küldeni. A további IP cím tartományokat az AllowedIps sorban tudjuk felvenni, vagy pedig mindent is arra tudunk küldeni a 0.0.0.0/0 kiegészítéssel.

Ezek után a szerver oldalon is létrehozom a konfigurációs fájlt két kliens becsatlakoztatásához:
$ sudo cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = iByncoUZGxEBRSMkG/hHG+UNYa0E9QSUFKbKUj8Jn0o=
Address = 10.222.0.1
ListenPort = 4599

[Peer]
PublicKey = /Snp1C7WPnTSwjjJk7Zk42AQ+qMRekfoAZBll0rl0jU=
AllowedIPs = 10.222.0.4/32

[Peer]
PublicKey = +lRl85+pYLhZpfZ2t7OC0E4FOJ19e9Z/PWVt89J3IFo=
AllowedIPs = 10.222.0.8/32

Az első négy sor a szerver privát kulcsát, a hálózaton belüli címét és azt a portot tartalmazza, ahová a nyilvános hálózat felől várja majd a csomagokat. (Ezt ne felejtsük el megnyitni és továbbítani az internet szolgáltatónk végpontján, vagy a tűzfalon, amennyiben szükséges). A következő három sorban pedig a klienst definiálom a korábban létrehozott publikus kulccsal és az IP címmel, ahonnan elfogadjuk a forgalmat.
Ha a kliensen a névfeloldást is ide küldtük, akkor annak kezelését nekünk kell megoldani. Ugyancsak nekünk kell megoldani, ha a szerveren a forgalmat szeretnénk továbbítani. Ezzel mi most nem foglalkozunk, viszont rákeresve sok angol nyelvű tutorial található.

Vegyük észre az AllowedIps mögötti /32-es subnet maszkot. Ezt fogja jelenteni, hogy a csak arról az IP címről érkező forgalom fog átjutni az alagúton. Más IP címről vagy IP tartományból érkező forgalom nem fog átmenni, hiába egyezik a kulcs.

Ha Windows-ra szeretnénk telepíteni, akkor itt találjuk a klienset hozzá. Telepítés után a kliens felületén a bal alsó sarokban található gombbal tudunk új alagutat beállítani:

A konfigurációs fájl pedig megegyezik a korábban megadott, linuxos verzióval. Egyedül a kulcsok mások, amelyeket a kliens generált nekünk:

Ha mindennel megvagyunk akkor az Ubuntu kliensen és szerveren is futtassuk le az alábbi parancsokat:
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0

Először engedélyezzük a wg0 konfigurációs fájl néven található wireguard definíciót, majd el is indítjuk azt. A systemd csodái. Majd további két paranccsal ellenőrizzük, hogy felépült-e a hálózat:
$ sudo systemctl status wg-quick@wg0
$ sudo wg show

Végül a kliens wg0 hálózati csatolóját nézzük meg:
$ ip addr show wg0
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc \
noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.222.0.4/24 scope global wg0
valid_lft forever preferred_lft forever

Tippek:

1) egy wg-quick újraindítás, ha a kliensek számát szeretnénk változtatni, az 10-15 másodpercig is eltarthat. Ekkor minden forgalom megáll. Sokkal jobb, ha az új klienst direkt módon a szerver parancssorából adjuk hozzá:
# wg set wg0 peer /Snp1C7WPnTSwjjJk7Zk42AQ+qMRekfoAZBll0rl0jU= allowed-ips 10.222.0.4/32
2) Ha a szerver konfigurációs fájljához hozzáadjuk a SaveConfig = true sort az [Interface] alá, akkor kikapcsoláskor a konfigurációs fájl mindig a legutolsó állapotot fogja tükrözni azokkal a klienseket is tartalmazva, amelyeket parancssorból adtunk hozzá.

A cikk még nem ért véget, kérlek, lapozz!

Előzmények