Vytvoření Wireguard VPN

Wireguard je ve své podstatě jednoduchá a bezpečná VPN, která funguje na podobném principu, jako např. SSH. Její nastavení je velmi jednoduché a nejsou potřeba certifikační autority a další složitosi jako např. v případě OpenVPN.

Instalace

V současné době je Wireguard součástí linuxového jádra (konkrétně od verze 5.6 vydané v březnu 2020) a proto jej zpravidla není třeba instalovat, pokud se nejedná o starší distribuci. Pokud by přesto byly problémy s absencí tohoto modulu v jádru, instalace balíčků ‚wireguard‘ či ‚wireguard-dkms‘ (v případě Ubuntu nebo Debianu by problém měla vyřešit). V Arch Linuxu tento krok není potřeba. V každém případě je nutné nainstalovat balík ‚wireguard-tools‘, který obsahuje nástroje usnadňující práci s touto VPN.

Pokud je tento balík nainstalován, lze přejít k dalšímu kroku.

Generování klíčů – server

Wireguard funguje na principu klíčů, které si vygeneruje server i klient. Jedná se o tzv. private key a public key. Kroky odehrávající se na straně serveru jsou v podstatě skoro stejné jako kroky na straně klienta. Začneme vygenerováním na straně serveru.

umask 077
wg genkey | tee server_private_key | wg pubkey > server_public_key

Příkaz umask má v tomto případě za úkol zabezpečit, že nikdo jiný, kromě současného uživatele, nebude mít k vytvořeným souborům obsahující klíče přístup.

Samotný klíč může vypadat například takto:

uAYPjzB4XMtZEkc/WWg/75EIuUqFxP+NLgXWUX6LuGw=

Vytvoření konfiguračního souboru – server

Konfigurační soubory se v případě serveru i klienta (Linux) nacházejí ve složce ‚/etc/wireguard‘. V případě serveru je tedy třeba vytvořit např. soubor

/etc/wireguard/wg0.conf

S následujícím obsahem

[Interface]
Address = 10.100.100.1/24
SaveConfig = false
PrivateKey = 
ListenPort = 51820

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp3s0 -j MASQUERADE

[Peer]
PublicKey = 
AllowedIPs = 10.100.100.2/32

Kvůli automatickému zalamování řádků ve WordPressu může konfigurace působit hodně nepřehledně, proto jsou přidány mezery, aby bylo zřejmé, co se nachází na stejném řádku. Soubor si rozebereme:

  • Address – adresa serveru, je možné nechat v tomto formátu.
  • SaveConfig – pokud se nastaví na ano, přepíše tento soubor konfigurací platnou v době vypínání serveru. Je lepší nechat na ‚false‘, pokud má být tento soubor jasnou definicí toho, jak má WG fungovat.
  • PrivateKey – privátní klíč vygenerovaný v předešlém kroku. Klíč se nesmí nikdy sdílet veřejně nebo poskytovat nedůvěryhodným osobám.
  • ListenPort – port, na kterém WG server poběží. Může být libovolný, 51820 je výchozí.
  • PostUp – kroky, které firewall provede při startu serveru, což v tomto případě znamená, že přidá pravidla potřebná ke správnému fungování.
  • PostDown – kroky, které firewall provede při vypnutí serveru, což v tomto případě znamená, že odebere pravidla potřebná ke správnému fungování.
  • PublicKey (část Peer) – veřejný klíč klienta, který má povolení se připojit k serveru
  • AllowedIPs (část Peer) – IP přiřazená klientovi, který má povolení se připojit k serveru

V PostUp a PostDown si lze všimnout specifického ‚enp3s0‘, což je název ethernetového rozhraní v Linuxu. Rozhraní se může jmenovat jinak a je dobré si název ověřit přes příkaz ‚ip addr‘ a případně přejmenovat v tomto konfiguračním souboru.

Část [Peer] může samozřejmě obsahovat více klientů, v takovém případě může vypadat např. takto:

[Peer]
PublicKey = 
AllowedIPs = 10.100.100.2/32

[Peer]
PublicKey = 
AllowedIPs = 10.100.100.3/32

[Peer]
PublicKey = 
AllowedIPs = 10.100.100.4/32

Samozřejmostí je vyplnění PublicKey daných klientů, IP adresa musí být vždy jiná.

Povolení IP forwarding

Aby vše správně fungovalo, je třeba na serveru povolit IP forwarding. Nastavení se může lišit dle distribuce.

Ubuntu:

  • konfigurační soubor: ‚/etc/sysctl.conf‘
  • parameter: ‚net.ipv4.ip_forward‘ nastavit na 1 a odkomentovat

Arch Linux:

  • vytvořit konfigurační soubor: ‚/etc/sysctl.d/30-ipforward.conf‘
  • vložit následující:
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

Generování klíčů – klient (Linux)

Na klientovi je také možné mít nainstalovaný balík ‚wireguard-tools‘. Následně lze vygenerovat klíče:

wg genkey | tee client_private_key | wg pubkey > client_public_key

Celé je to ale možné provést i na serveru.

Vytvoření konfiguračního souboru – klient

Tady se oblast stává více flexibilní – konfiguraci lze vytvořit na Linuxu, Androidu nebo třeba Windows na úplně stejném principu, ačkoli to na každé platformě vypadá trochu jinak.

V případě Linuxu se stejně jako na serveru vytvoří soubor

/etc/wireguard/wg0.conf

s obsahem:

[Interface]
Address = 10.100.100.3/32
PrivateKey = <private key>

[Peer]
PublicKey = <public key>
AllowedIPs = 0.0.0.0/0
Endpoint = 1.1.1.1:51820

V tomto případě se role otáčí – [Interface] obsahuje adresu a privátní klíč klienta, kde adresa musí existovat i v konfiguračním souboru serveru, párovaná k danému veřejnému klíči.

Část [Peer] je v tomto případě server, tedy PublicKey obsahuje veřejný klíč serveru. AllowedIPs lze ponechat na 0.0.0.0/0 pro povolení veškeré komunikace a Endpoint je IP adresa a port serveru.

Flexibilní je to proto, že tyto informace lze napsat i do Android a Windows aplikací Wireguard, ty sice nemají textové konfigurační soubory, ale nabízejí textová pole, která fungují jako jejich ekvivalent.

Spuštění serveru

Vytvořením konfigurace se server ještě samozřejmě nespustí. Nejprve provedeme sérii akcí, které jsou potřeba jen poprvé na nastavení správných oprávnění.

# chown -v root:root /etc/wireguard/wg0.conf
# chmod -v 600 /etc/wireguard/wg0.conf

A teď již k tomu, jak server zapnout či vypnout. Jednoduše a jednorázově to lze provést takto:

# wg-quick up wg0
# wg-quick down wg0

… kde wg0 je název interface Wireguardu, tedy jednoduše řečeno název konfiguračního souboru bez ‚.conf‘ (wg0.conf -> wg0).

Pokud má server běžet jako služba, probíhá nastavení následovně:

# systemctl enable wg-quick@wg0.service

… kde wg0 je opět, stejně jako v předchozím případě, název WG interface.

Spuštění klienta

V případě Linuxu je to úplně stejné jako v případě serveru. V případě Androidu je aplikace intuitivní a stačí připojení jednoduše aktivovat v aplikaci. Windows klient (který lze mimochodem stáhnout zde) by měl fungovat úplně stejně jako Android aplikace.

Dodatečné informace

Seznam připojených klientů a jejich přenesená data, poslední kontakt, veřejné klíče apod. lze na serveru i linuxovém klientovi zobrazit pomocí

# wg show

Wireguard pak zobrazí takovéto informace:

peer: (veřejný klíč)
  endpoint: <ip adresa>
  allowed ips: 10.100.100.2/32
  latest handshake: 3 seconds ago
  transfer: 208.16 MiB received, 4.92 GiB sent