Rasmus Lindroth

En blogg om Linux & teknik

Wireguard mellan servrar

Wireguard är precis som de själva beskriver det - en modern VPN. Det bästa är att det knappt blir någon overhead, så du får ut i princip samma hastighet som du redan har på ditt internet utan att hårdvaran behöver slita.

Jag har precis fått min server, som jag skrev om här, och bland det första jag gjorde var att skapa en VPN-tunnel med hjälp av Wireguard. Tunneln skapades mellan servern jag har här hemma och en av mina VPS:er.

Första steget är att installera Wireguard, jag kör Ubuntu och då får man lägga till ett extra repository

# Lägg till Wireguards repository
sudo add-apt-repository ppa:wireguard/wireguard
# Installera
sudo apt install wireguard

Efter det hoppade jag vidare till Arch Wiki som är en guldgruva med information. Där tittade jag upp vilket kommando som krävs för att generera en privat och publik nyckel som används för att verifiera enheterna i nätverket.

Kör det här för att skapa nycklarna

wg genkey | tee privatekey | wg pubkey > publickey
# Ändra så att bara du kan läsa den privata nyckeln
chmod 600 privatekey

Nu över till det roliga, att skapa en förbindelse mellan servrarna. Jag ville att båda servrarna ska kunna kommunicera med varandra, så då måste båda agera som servrar. Annars är det bara en av enheterna som kan initiera förbindelsen.

På båda servrarna skapade jag följande filer här /etc/wireguard/wg0.conf. Även här kan det vara bra att ändra läs- och skrivbehörigheten så bara du eller användaren root kan läsa filerna. chmod 600 /etc/wireguard/wg0.conf och chown root:root /etc/wireguard/wg0.confför att ändra ägare och grupp. Nu över till innehållet i filerna.

Server A

[Interface]
Address = 10.10.0.2/24
ListenPort = 51820
PrivateKey = privat-nyckel-för-server-A-här

[Peer]
PublicKey = publik-nyckel-för-server-B-här 
AllowedIPs = 10.10.0.1/32
Endpoint = ip-server-B:51820

Server B

[Interface]
Address = 10.10.0.2/24
ListenPort = 51820
PrivateKey = privat-nyckel-för-server-B-här

[Peer]
PublicKey = publik-nyckel-för-server-A-här 
AllowedIPs = 10.10.0.1/32
Endpoint = ip-server-A:51820

Nu ska vi gå igenom vad respektive rad gör för någonting.

Address är IP-adressen som du kommer att tilldelas i nätverket som skapas av Wireguard. Att det sedan följs av /24 beror på att vi skapar ett subnät med IP-adresserna 10.10.0.xxx. Vilket ger oss 254 IP-adresser vi kan använda, vilket mer än väl täcker mina behov.

ListenPort är endast vilken port vi kommer att lyssna på och PrivateKey är innehållet i filen, med samma namn, som vi generarade först av allt.

Varje enhet/server/klient eller vad man vill kalla det som ska ha möjlighet att ansluta till servern behöver ha sin egen [Peer]-sektion i konfigurationsfilen.

PublicKey i konfigurationsfilen för server A är den publika nyckeln för server B, för på det sättet har Wireguard möjligheten att verifiera att anslutningen verkligen kommer från server B.

AllowedIPs är vilken/vilka IP-adresser som klienten tillåts ansluta med. Vi vill ha en bestämd IP, så vi tillåter bara en. Det är därför det står /32 i slutet vilket säger att allt som står innan snedstrecket ska vara identiskt med IP-adressen klienten använder sig av.

Endpoint talar om för Wireguard hur den kan nå den andra servern som det är i det här fallet. Vill server A kontakta server B finns informationen där och vice versa. Jag har en statisk IP både hemma, så det fungerar bra. Har man en dynamisk IP blir det lite krångligare, men det har jag inte behövt bry mig om själv, så är fallet så för dig kan du kika på Arch wiki om det här.

Efter det behöver du öppna upp porten du valde, som i mitt fall är 51820, så att servrarna faktiskt kan nå varandra. Använder du ufw borde det här fungera.

sudo ufw allow 51820/udp
sudo ufw enable

Nu är det nästan helt klart. Det enda som saknas är att starta upp Wireguard och det gör jag med hjälp av systemd, som är det init-system som används av de flesta Linuxdistrubitionerna.

# Startar Wireguard
sudo systemctl start wg-quick@wg0.service

# Gör så att Wireguard körs igång även efter datorn har startat om.
sudo systemctl enable wg-quick@wg0.service

Fördelen med det här är att jag nu kan kommunicera mellan servrarna och öppna portar specifikt för det här subnätet.

Klart!