Nastavení StrongSwan VPN serveru na Ubuntu 20.04

By | 02/03/2021

Last Updated on 24/01/2023 by administrator

Nastavení StrongSwan VPN serveru na Ubuntu 20.04

Motivace:

Článek popisuje instalaci a konfiguraci VPN IKEv2 pomocí StrongSwan na Ubuntu 20.04 LTS. StrongSwan je open-source aplikace založená na IPsec. VPN server tak bude připojovat vzdálené klienty přes šifrované připojení. Po konfiguraci bude vyzkoušen test připojení na VPN server přes OS Windows, Linux a Android.

OS:

Implementace byla prakticky vyzkoušena na Ubuntu 20.04 LTS.

Implementace [1]:

1. Instalace StrongSwan:

Aktualizace seznamu balíčků z repozitářů:

sudo apt-get update

První balíček strongswan zahrnuje StrongSwan VPN IPsec daemon, strongswan-pki nainstaluje komponentu PKI (Public Key Infrastructure) aby mohla být vytvořená certifikační autorita (CA). Balíček libcharon-extauth-plugins se používá, aby se klienti mohli ověřit na našem serveru pomocí sdíleného uživatelského jména a hesla. Balíček libstrongswan-extra-plugins obsahuje šifrovací sady eliptických křivek používající kryptografickou sadu Curve25519 a balíček libcharon-extra-plugins pro instalaci potřebného EAP pluginu:

sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins

Výstup příkazu ipsec version:

Linux strongSwan U5.8.2/K5.4.0-62-generic

2. Vytvoření Certifikační Autority (CA):

Příkaz vytvoří ve složce root, složku pki s podsložkama cacerts, certs a private, bez parametru -p (–parents) by se podsložky nevytvořily:

mkdir -p ~/pki/{cacerts,certs,private}

Omezit přístup do složky pki jen pro aktuálního uživatele:

chmod 700 ~/pki

Díky balíčku strongswan-pki, lze pomocí příkazu pki generovat certifikáty pro certifikační autoritu a samotný VPN server. Parametr –gen vytvoří privátní klíč, –type určí typ klíče a –size určí velikost klíče v bitech. Celý tento příkaz níže vygeneruje 4096-bitový privátní RSA klíč kořenové certifikační autority do souboru ca-key.pem.

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem

Příkaz níže vytvoří soubor ca-cert.pem, který se podepíše (parametr –self) již vytvořeným privátním RSA klíčem kořenové certifikační autority ca-key.pem. Parametr —lifetime označuje dobu platnosti ca-cert.pem certifikátu (zde na 10 let), parametr –dn (Distinguished Name) lze libovolně pojmenovat:

pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem --type rsa --dn "CN=VPN root CA" --outform pem > ~/pki/cacerts/ca-cert.pem

Nyní jsou vytvořeny dva soubory:

  • ca-key.pem –  je privátní RSA klíč kořenové certifikační autority
  • ca-cert.pem – je podepsaný certifikát kořenové certifikační autority obsahující veřejný klíč

Nyní je zprovozněná certifikační autorita, a tak je možné vytvořit certifikát pro VPN server.

3. Generování certifikátu pro VPN server:

Podobně jako výše, bude vygenerován 4096bitový privátní RSA klíč pro VPN server do souboru server-key.pem:

pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem

Příkaz níže vytvoří soubor server-cert.pem, který se podepíše privátním RSA klíčem kořenové certifikační autority ca-cert.pem. V příkazu je potřeba změnit parametr –dn a –san podle toto, jestli se budou připojovat klienti k tomuto VPN serveru pomocí doménového jména, nebo IP adresy. Proto jsou přiloženy dvě varianty příkazů:

Varianta 1 – na VPN server se budou VPN klienti připojovat pomocí doménového jména:

  • Předpokládám, že se klienti budou připojovat na VPN server z internetu. Pokud tomu tak je tak, VPN server bude či je namapován pod nějakou veřejnou IP adresou. Tato veřejná IP adresa bude mít své doménové jméno na veřejných DNS serverech. A tak zvolit právě toto doménové jméno.
    • Příklad: server běží na reálné IP adrese 192.168.0.7, která je namapována na veřejnou IP adresu 1.2.3.4. K této veřejné IP adrese existuje doménové jméno vpnserver.cz. Čili do parametru –dn a –san vkládám vpnserver.cz
pki --pub --in ~/pki/private/server-key.pem --type rsa | pki --issue --lifetime 1825 --cacert ~/pki/cacerts/ca-cert.pem --cakey ~/pki/private/ca-key.pem --dn "CN=zadat_domenove_jmeno"  --san zadat_domenove_jmeno --flag serverAuth --flag ikeIntermediate --outform pem > ~/pki/certs/server-cert.pem

Varianta 2 – na VPN server se budou VPN klienti připojovat pomocí IP adresy:

  • V příkazu se navíc použije parametr –san a důvodem je, že někteří klienti při ověřování své identity kontrolují, zda certifikát TLS obsahuje záznam DNS i záznam IP adresy pro server. V tomto parametru –san je potřeba použít zavináč.
  • Předpokládám, že se klienti budou připojovat na VPN server z internetu, který bude namapován pod veřejnou IP adresou, proto zvolit právě tuto veřejnou IP adresu.
    • Příklad – server běží na reálné IP adrese 192.168.0.7, která je namapována na veřejnou IP adresu 1.2.3.4. Čili do parametru –dn a –san vkládám 1.2.3.4.
    • Pokud tomu tak není, zvolit reálnou IP adresu VPN serveru.
pki --pub --in ~/pki/private/server-key.pem --type rsa | pki --issue --lifetime 1825 --cacert ~/pki/cacerts/ca-cert.pem --cakey ~/pki/private/ca-key.pem --dn "CN=zadat_IP_adresu" --san @zadat_IP_adresu --san zadat_IP_adresu --flag serverAuth --flag ikeIntermediate --outform pem > ~/pki/certs/server-cert.pem

Pozn. Další parametry jako je –flag serverAuth definuje, že certifikát bude použit explicitně pro ověřování serveru před vytvořením šifrovaného tunelu a parametr –flag ikeIntermediate se používá k podpoře starších klientů macOS

Nyní jsou vytvořeny dva soubory:

  • server-key.pem –  je privátní RSA klíč VPN serveru
  • server-cert.pem – je podepsaný certifikát VPN serveru obsahující veřejný klíč

Příkazem níže budou přesunuty všechny podsložky cacerts, certs a private včetně .pem souborů do složky ipsec.d:

sudo cp -r ~/pki/* /etc/ipsec.d/

4. Konfigurace StrongSwan:

StrongSwan má výchozí konfigurační soubor ipsec.conf s několika příklady, nicméně ten nebude použitý, a proto bude vytvořený úplně nový. Příkaz níže přejmenuje soubor ipsec.conf na ipsec.conf.original:

sudo mv /etc/ipsec.conf{,.original}

Vytvořit soubor ipsec.conf:

sudo vim /etc/ipsec.conf

Nyní se budou připisovat do souboru ipsec.conf konfigurační parametry. Parametr charondebug bude logovat status VPN daemonu a uniqueids=no povoluje duplicitní připojení:

config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

Nyní bude vytvořená konfigurační sekce VPN conn ikev2-vpn. Parametr auto=add načte připojení bez spouštění, type=tunnel určuje typ IPsec připojení, keyexchange=ikev2 metoda výměny klíčů bude probíhat přes IKEv2 protokol, fragmentation=yes zapína fragmentaci IKE paketů (díky parametru „yes“ ji může či nemusí VPN klient podporovat), forceencaps=yes vynutí zapouzdření UDP pro ESP pakety [2]:

. . .
conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes

Parametr dpdaction=clear aktivuje “Dead Peer Detection” v případě že se VPN klient nečekaně odpojí, a jaksi stále zůstane na VPN viset, dpddelay=300s definuje čas kdy VPN server posílá prázdné zprávy pokud VPN klient nic neposílá, rekey=no značí, že VPN server nebude opětovně spojení vyjednávat pokud má vypršet (nicméně může si ho vyjednat VPN klient) [2]:

. . .
conn ikev2-vpn
    . . .
    dpdaction=clear
    dpddelay=300s
    rekey=no

Nyní budou konfigurovány parametry IPsec serveru. Ten je v definovaný řetězcem “left”.

Parametr left=%any přijímá připojení ze všech  aktivních rozhraní VPN serveru, do leftid zadat buď doménové jméno nebo IP adresu VPN serveru, kterou jste zvolili v parametru –san výše, leftcert definuje vytvořený certifikát, bez kterého se server nebude moci sám ověřit u klientů, nebo dokončit vyjednávání v IKEv2, leftsendcert=always definuje, že každý klient, který se připojí k serveru, obdrží kopii veřejného certifikátu server-cert.pem VPN serveru, leftsubnet=0.0.0.0/0 značí, že všechen klientský provoz se bude tunelovat na VPN server [1].

Upozornění: V příkazu leftid, zadávat pouze zavináč [@] pokud se bude používat doménové jméno pro připojení.

. . .
conn ikev2-vpn
    . . .
    left=%any
    leftid=@zadat_domenove_jmeno_nebo_IP_adresu
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0

Nyní budou konfigurovány parametry IPsec klienta. Ten je v definovaný řetězcem “right”.

Parametr right=% any značí, že server bude přijímat připojení z jakékoliv IP adresy vzdáleného klienta, rightid=%any zajistí, že VPN server neodmítne připojení od klientů, kteří poskytli svou identitu ještě před vytvořením tunelu, rightauth=eap-mschapv2 je autentizační metoda ověřující klienty na VPN serveru, rightsourceip definuje rozsah VPN IP adres pro klienty, rightdns definuje DNS servery pro VPN klienty a rightsendcert=never říká, že klienti nepotřebují posílat certifikát, aby získali veřejný certifikát VPN serveru [1, 2]:

. . .
conn ikev2-vpn
    . . .
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never

Díky parametru eap_identity=%identity StrongSwan žádá klienta o přihlašovací údaje:

. . .
conn ikev2-vpn
    . . .
    eap_identity=%identity

Nakonec budou přidány řádky určující různé algoritmy výměny klíčů, hashování, autentizace či šifrování, které může VPN klient používat. Každá šifrovací sada je od ostatních oddělena čárkou. Například chacha20poly1305-sha512-curve25519-prfsha512 je jedna sada a aes256gcm16-sha384-prfsha384-ecp384 je další. Uvedené šifrovací sady jsou vybrány tak, aby zajistily nejvyšší bezpečnost:

. . .
conn ikev2-vpn
    . . .
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp2048,aes128-sha1-modp2048!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1!

Takto by měl vypadat celý konfigurační soubor ipsec.conf:

config setup
    charondebug="ike 1, knl 1, cfg 0"
    uniqueids=no

conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@zadat_domenove_jmeno_nebo_IP_adresu
    leftcert=server-cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.10.10.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity
    ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp2048,aes128-sha1-modp2048!
    esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1!

Pozn. Prozatím není možné vytvořit DNS suffix / doménové jméno pro příslušný IP VPN rozsah. Více v [6].

TIP – Split-Tunneling:

Pokud je potřeba vybrat jen určitý provoz, který se bude směrovat do VPN tunelu definují se v parametru leftsubnet všechny IP adresy a subnety. Příklad: Chci tunelovat subnety 192.168.0.0/24, 192.168.15.0/24 a IP adresu 8.8.8.8:

leftsubnet=192.168.0.0/24,8.8.8.8/32,192.168.15.0/24

5. Konfigurace VPN autentizace:

VPN server je nyní nakonfigurován tak, aby přijímal připojení od klientů, nicméně je potřeba dokonfigurovat přihlašovací údaje v souboru ipsec.secrets pro VPN klienty:

sudo vim /etc/ipsec.secrets

V souboru ipsec.secrets je potřeba říci VPN serveru, kde hledat privátní klíč a jak ho zparsovat. To se provede vložením následujícího řádku (řádek musí začínat dvojtečkou):

: RSA "server-key.pem"

Následně definovat v souboru ipsec.secrets přihlašovací údaje pro VPN klienta:

vas_login : EAP "vase_heslo"

Takto by měl vypadat celý konfigurační soubor ipsec.secrets:

: RSA "server-key.pem"
vas_login : EAP "vase_heslo"

Pozn. Jedny přihlašovací údaje mohou být sdílené se všemi VPN klienty, ale je i možné zvolit pro každého uživatele přihlašovací údaj zvlášť definováním dalšího řádku.

Restartovat StrongSwan:

sudo systemctl restart strongswan-starter

6. Konfigurace Firewallu a IP forwardingu:

Pozn. UFW je nutné zapnout, jelikož se budou aplikovat pravidla v /etc/ufw/before.rules souboru.

Pokud VPN server konfigurujete přes SSH, je doporučeno přidat pravidlo pro SSH, aby se “nezařízla” aktuální SSH relace:

sudo ufw allow OpenSSH

Povolit firewall:

sudo ufw enable

Povolit standardní porty IPsec UDP/500 a UDP/4500:

sudo ufw allow 500,4500/udp

Všechny povolené porty lze vylistovat příkazem sudo ufw status.

Dále potřeba zjistit jméno rozhraní vedoucí do internetu:

ip route show default

Výpis příkazu ukazuje, že pro přístup do internetu je použito eno1 rozhraní:

default via 192.168.0.1 dev eno1 proto static metric 100

Aby došlo ke správnému routingu mezi VPN klienty a internetem, je potřeba přidat do souboru before.rules následující pravidla:

sudo vim /etc/ufw/before.rules

Přidat následující řádky označené tučným písmem nad sekci *filter a přepsat podle potřeby jméno rozhraní:

*nat
-A POSTROUTING -s 10.10.10.0/24 -o eno1 -m policy --pol ipsec --dir out -j ACCEPT
-A POSTROUTING -s 10.10.10.0/24 -o eno1 -j MASQUERADE
COMMIT

*mangle
-A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o eno1 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360
COMMIT

*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
. . .

Popis pravidel výše:

První NAT pravidlo akceptuje všechny IPsec pakety se zdrojovou IP adresou ze subnetu 10.10.10.0/24. (10.10.10.0/24 byl subnet přiřazený VPN klientům v ipsec.conf)
Druhé NAT pravidlo nastavuje, že všechny pakety se zdrojovou IP adresou v subnetu 10.10.10.0/24 se budou překládat (maskovat) na adresu odchozího rozhraní (v tomto případě na IP adresu z rozhraní eno1).
Pravidlo v sekci mangle upravuje maximální velikost segmentu paketů, aby se zabránilo potenciálním problémům s určitými VPN klienty. TCP segment o velikosti mezi 1361-1536 bajtů, bude zmenšen na 1360 bajtů, aby se paket nefragmentoval (to by jinak mohlo nastat kvůli režii IPsec hlaviček)

Další řádky označené tučným písmem přidat pod sekci *filter:

. . .
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]

-A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT
-A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT

Popis pravidel výše:

Obě tato pravidla akceptují forwardování IPsec ESP paketů ze subnetu 10.10.10.0/24.

Aby mohl být klientský VPN provoz směrován do internetu je potřeba v souboru sysctl.conf zapnout směrování IPv4 paketů:

sudo vim /etc/ufw/sysctl.conf

Odkomentovat následující řádek:

net/ipv4/ip_forward=1

Dále v souboru sysctl.conf vypnout zasílání a přijímání ICMP redirect zpráv, jelikož mohou být využity k MITM útokům (příkaz net/ipv4/conf/all/accept_redirects=0 by již měl být v souboru zahrnutý):

. . .
net/ipv4/conf/all/accept_redirects=0
net/ipv4/conf/all/send_redirects=0

Nakonec v souboru sysctl.conf deaktivovat zjišťování Path MTU, aby bylo zabráněno problémům s fragmentaci paketů:

. . .
net/ipv4/ip_no_pmtu_disc=1

Deaktivací a opětovným povolením bude restartováno nastavení Firewallu:

sudo ufw disable
sudo ufw enable

Logy:

grep 'ipsec\|charon' /var/log/syslog

Přístup k VPN serveru z internetu:

Pro přístup z internetu na VPN server je potřeba mít veřejnou IP adresu (zeptat se svého poskytovatele připojení). Tuto veřejnou IP adresu je potřeba namapovat k VPN serveru. To se nejčastěji provádí na routeru přes port forwarding (přesměrování portů), kde je potřeba povolit porty UDP/500 a UDP/4500. Každý router má ve svém nastavení port forwarding jinde. Např. TP-Link ma tuto funkci pod Forwarding > Virtual Servers. Obecný průvodce pro několik routerů, kde nastavit port forwarding je možné najít zde:

https://www.noip.com/support/knowledgebase/general-port-forwarding-guide/

Otestování VPN připojení:

Před připojením na VPN server je potřeba zkopírovat VPN klientovi certifikát certifikační autority obsahující veřejný klíč. Nejjednodušší způsob, jak to udělat je přihlásit se na VPN server a vypsat obsah souboru ca-cert.pem:

cat /etc/ipsec.d/cacerts/ca-cert.pem

Výstup by měl vypadat nějak takto:

-----BEGIN CERTIFICATE-----
MIIC8Jvb3QgQ0EwHhcNMjdG5mXzgwDQYJKoZIhvcNAQEMBQAwODELMAkGA1UEZIh

. . .

H2YUdz8XNHrJHvMQKWFpi0rlEcMs+MSXPFWE3Q7UbaZJ/h8wpSldSUbQRUlphExJ
dJ4PX+MUJO/vjG1/ie6Kh25xbBAc3qNq8siiJZDwrg6vjEK7eiZ1rA==
-----END CERTIFICATE-----

Na VPN klientovi vytvořit soubor ca-cert.pem (musí mít příponu .pem) a zkopírovat do něj obsah certifikátu včetně řádků —–BEGIN CERTIFICATE—– a —–END CERTIFICATE—–:

Test připojení z OS Windows:

Tyto instrukce byly testovány na Windows 10 verze 1709 a 2004. Pravděpodobně nastavení pro “mezi verze Windows” lišit nebudou.

a) Import ca-cert.pem certifikátu:

1. Otevřít vyhledávání kliknutím na WIN+R a vepsat mmc.exewin+r

2. Spustí se Windows Management Console. Nahoře v menu kliknout na File a vybrat Add or Remove Snap-in:

import certifikatu do windows 10

Kliknout na Certificates následně na Add:

import certifikatu do windows 10

Aby VPN fungovala s jakýmkoliv uživatelem, vybrat Computer account a kliknout na Next:

import certifikatu do windows 10

Konfigurace probíhá na tomto počítači proto zvolit Local computer a kliknout na Finish:

import certifikatu do windows 10

Potvrdit OK:

import certifikatu do windows 10

Pod složkou Console Root, rozevřít Certificates (Local Computer) přes Trusted Root Certification Authorities k Certificates:

import certifikatu do windows 10

Kliknout na složku Certificate vybrat All Task > Import:

import certifikatu do windows 10

Otevře se Certificate Import wizard. Kliknout na Next:

import certifikatu do windows 10

Kliknout na Browse:

import certifikatu do windows 10

Pro lokalizaci certifikátu CA je potřeba změnit příponu na All Files (*.*), vybrat ca-cert.pem a kliknout na Open:

import certifikatu do windows 10

Jakmile je certifikát CA vybrán pokračovat na Next:

import certifikatu do windows 10

Umístění certifikátu musí být pod Trusted Root Certification Authorities:

import certifikatu do windows 10Kliknutím na Finish se importuje certifikát CA:

import certifikatu do windows 10

Certifikát CA by se měl objevit pod Certificates:

import certifikatu do windows 10

b) Konfigurace silnější DH grupy

V době psaní tohoto článku je problém, že Windows 10 navrhuje již slabou a prolomenou skupinu DH group 2 (1024-bit MODP). DH algoritmus slouží k vytvoření a bezpečné výměně sdíleného klíče, který se následně použije pro symetrické šifrování dat.

Implementace silnějšího DH algoritmu:

Vepsat cmd (příkazový řádek) a otevřít jej jako administrátor:

příkazový řádek

Aplikovat příkaz níže. Ten vytvoří silnější skupinu DH group 14 (2048-bit MODP):

reg add HKLM\System\CurrentControlSet\Services\Rasman\Parameters /v NegotiateDH2048_AES256 /t REG_DWORD /d 1 /f

c) Nastavení VPN připojení:

Proklikat se k “Network and Sharing Center” přes Control Panel\All Control Panel Items\Network and Sharing Center a kliknout na Set up a new connection or network:

StrongSwan VPN - nastaveni WIN10

Zvolit Connect to a workplace:

StrongSwan VPN - nastaveni WIN10Zvolit No, create a new connection:

StrongSwan VPN - nastaveni WIN10

Vybrat Use my internet connection (VPN):

StrongSwan VPN - nastaveni WIN10

Zadat buďto doménové jméno nebo IP adresu VPN serveru, podle toho, co bylo vloženo do parametru –san při konfiguraci VPN serveru. Následně kliknout na Create:

StrongSwan VPN - nastaveni WIN10

V Control Panel\Network and Internet\Network Connections kliknout pravým tlačítkem na vytvořené VPN rozhraní a zvolit Properties. V rubrice Security upravit typ VPN připojení na IKEv2 s autentizací EAP-MSCHAP v2:

StrongSwan VPN - nastaveni WIN10

Kliknout na ikonku Internet access v liště a zvolit VPN Connection. Po kliknutím na Connect by se mělo objevit okno pro zadání přihlašovacích údajů:

StrongSwan VPN - nastaveni WIN10Upozornění: Ukázalo se, že pokud jsem se připojil ze stejného subnetu ve kterém jsem měl i VPN server přes namapovanou veřejnou IP adresu (veřejnou IP adresu mám až na routeru poskytovatele), nešlo se z Windows 10 připojit. Musel jsem to otestovat přes jinou síť, a tak jsem zvolil připojení přes mobilní síť, kde již problém nebyl.

Test připojení z OS Android:

a) Import ca-cert.pem certifikátu:

  1. Nahrát certifikát ca-cert.pem mobilu/tabletu. Např. je možné si jej poslat přes email.
  2. Stáhnout strongSwan VPN Client z Google Play do mobilu/tabletu.
  3. Otevřít aplikaci strongSwan VPN client a kliknout nahoře vpravo na more či tři tečky a vybrat CA certificates
  4. Opět kliknout nahoře vpravo na more či tři tečky a vybrat Import certificate
  5. Vyhledat a importovat ca-cert.pem certifikát

b) Konfigurace VPN klienta:

  1. V aplikaci strongSwan VPN client kliknout na ADD VPN PROFILE.
  2. Jako Server zadat buďto doménové jméno nebo IP adresu VPN serveru, podle toho, co bylo vloženo do parametru –san při konfiguraci VPN serveru.
  3. Jako VPN typ zvolit IKEv2 EAP (Username/Password).
  4. Vyplnit uživatelské jméno a heslo (tak jak bylo nakonfigurováno na VPN serveru v souboru /etc/ipsec.secrets).
  5. Odšktnout Select automatically v sekci CA certificate a kliknout na Select CA certificate.
  6. Kliknout na IMPORTED a vybrat the certifikát, který byl naimportován (v konfiguraci VPN server byl pojmenovaný jako “VPN root CA”).
  7. Volitelně vyplnit Profile name (optional).
  8. Pro připojení k VPN serveru kliknout na vytvořený VPN profil.

Test připojení z OS Linux:

Upozornění: Ukázalo se, že pokud jsem se připojil ze stejného subnetu ve kterém jsem měl i VPN server přes namapovanou veřejnou IP adresu (veřejnou IP adresu mám až na routeru poskytovatele), nešlo se z Linuxu připojit. Musel jsem to otestovat přes jinou síť, a tak jsem zvolil připojení přes mobilní síť, kde již problém nebyl.

Varianta 1:

Test připojení z OS Linux byl prakticky vyzkoušen na Ubuntu 20.04 LTS

1. Aktualizace seznamu balíčků z repozitářů:

sudo apt-get update

2. Nainstalovat strongswan balíček a libcharon-extra-plugin, což je knihovna extra pluginů pro IPsec klienta:

sudo apt install strongswan libcharon-extra-plugins

3. Jakýmkoliv způsobem překopírovat certifikát ca-cert.pem do adresáře /etc/ipsec.d/cacerts/

3. Deaktivovat StrongSwan, aby se VPN nespustila automaticky

sudo systemctl disable --now strongswan-starter

4. Editovat /etc/ipsec.secrets:

sudo vim /etc/ipsec.secrets

a nakonfigurovat uživatelské jméno a heslo (tak jak bylo nakonfigurováno na VPN serveru):

vas_login : EAP "vase_heslo"

5. Editovat ipsec.conf:

sudo vim /etc/ipsec.conf

a definovat konfiguraci níže:

Pozn. Zadat buďto doménové jméno nebo IP adresu VPN serveru, podle toho, co bylo vloženo do parametru –san při konfiguraci VPN serveru.

config setup

conn ikev2-rw
    right=zadat_domenove_jmeno_nebo_IP_adresu
    rightid=zadat_domenove_jmeno_nebo_IP_adresu
    rightsubnet=0.0.0.0/0
    rightauth=pubkey
    leftsourceip=%config
    leftid=vas_login
    leftauth=eap-mschapv2
    eap_identity=%identity
    auto=start

Připojení k VPN serveru se provede příkazem:

sudo systemctl start strongswan-starter

Status, zda StrongSwan běží, se provede příkazem:

sudo systemctl status strongswan-starter

Pozn. Zda stanice dostala IP adresu z VPN serveru se dá zjistit ip a příkazem.

Odpojení k VPN serveru se provede příkazem:

sudo systemctl stop strongswan-starter

Pozn. Pro Ubuntu 18.04 je postup nastavení a připojení popsaný výše obdobný, jen je nutné místo strongswan-starter použít strongswan.

Varianta 2:

Test připojení z OS Linux byl prakticky vyzkoušen na Ubuntu 18.04 LTS a Ubuntu 20.04 LTS.

1. Aktualizace seznamu balíčků z repozitářů:

sudo apt-get update

2. Nainstalovat charon-cmd, což je jednoduchý IPsec VPN klient (pozn. instalace strongswan balíčku není potřebná):

sudo apt install charon-cmd libcharon-extra-plugins

3. Jakýmkoliv způsobem překopírovat ca-cert.pem a přesunout se do složky kde byl překopírován ca-cert.pem certifikát.

4. Připojit se na VPN server pomocí služby charon-cmd a certifikátu ca-cert.pem. Vložit vytvořený login, který byl vytvořen na VPN server v souboru ipsec.secrets a zadat buďto doménové jméno nebo IP adresu VPN serveru, podle toho, co bylo vloženo do parametru –san při konfiguraci VPN serveru.

sudo charon-cmd --host zadat_domenove_jmeno_nebo_IP_adresu --identity vas_login --cert /etc/ipsec.d/cacerts/ca-cert.pem

5. Po zadání příkazu výše, vyskočí výzva k zadání hesla. Pro připomenutí toto heslo bylo opět vytvořeno na VPN server v souboru ipsec.secrets.

Pozn. Pro odpojení z VPN, stisknout CTRL+C.

Aktuálně připojení uživatelé, jejich parametry, statistiky (aplikovat příkazy na VPN serveru) [5]:

Počet aktuálně připojených uživatelů s alokací VPN IP adres a jejich loginy či využití VPN IP poolu:

ipsec leases

Výpis příkazu ipsec leases:

Leases in pool '10.10.10.0/24', usage: 2/254, 1 online
10.10.10.2 online 'vas_login'
10.10.10.1 offline 'vas_login'

Vypíše status připojených klientů:

ipsec status

Vypíše detailní status připojených klientů + připojuji legendu níže:

ipsec statusall

Výpis příkazu ipsec statusall:

Status of IKE charon daemon (strongSwan 5.8.2, Linux 5.4.0-62-generic, x86_64):
  uptime: 41 minutes, since Feb 25 21:16:13 2021
  malloc: sbrk 3084288, mmap 0, used 1299088, free 1785200
  worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 2
  loaded plugins: charon test-vectors ldap pkcs11 tpm aesni aes rc2 sha2 sha1 md5 mgf1 rdrand random nonce x509 revocation constraints pubkey pkcs1 pkcs7 pkcs8 pkcs12 pgp dnskey sshkey pem openssl gcrypt af-alg fips-prf gmp curve25519 agent chapoly xcbc cmac hmac ctr ccm gcm ntru drbg curl attr kernel-netlink resolve socket-default connmark farp stroke updown eap-identity eap-aka eap-md5 eap-gtc eap-mschapv2 eap-dynamic eap-radius eap-tls eap-ttls eap-peap eap-tnc xauth-generic xauth-eap xauth-pam tnc-tnccs dhcp lookip error-notify certexpire led addrblock unity counters
Virtual IP pools (size/online/offline):
  10.10.10.0/24: 254/1/1
Listening IP addresses:
  192.168.0.7
Connections:
   ikev2-vpn:  %any...%any  IKEv2, dpddelay=300s
   ikev2-vpn:   local:  [1.2.3.4] uses public key authentication
   ikev2-vpn:    cert:  "CN=1.2.3.4"
   ikev2-vpn:   remote: uses EAP_MSCHAPV2 authentication with EAP identity '%any'
   ikev2-vpn:   child:  192.168.0.0/24 === dynamic TUNNEL, dpdaction=clear
Security Associations (1 up, 0 connecting):
   ikev2-vpn[8]: ESTABLISHED 11 minutes ago, 192.168.0.7[1.2.3.4]...39.128.25.98[vas_login]
   ikev2-vpn[8]: IKEv2 SPIs: aa6641abf6468cc8_i aa89784c7eae6486_r*, rekeying disabled
   ikev2-vpn[8]: IKE proposal: CHACHA20_POLY1305/PRF_HMAC_SHA2_512/CURVE_25519
   ikev2-vpn{5}:  INSTALLED, TUNNEL, reqid 5, ESP in UDP SPIs: c72855a7_i 6863aa23_o
   ikev2-vpn{5}:  CHACHA20_POLY1305, 3806 bytes_i (51 pkts, 1s ago), 10322 bytes_o (49 pkts, 1s ago), rekeying disabled
   ikev2-vpn{5}:   192.168.0.0/24 === 10.10.10.1/32

Legenda:

uptime: 41 minutes, since Feb 25 21:16:13 2021 – jak dlouho a od jakého data běží StrongSwan

Virtual IP pools (size/online/offline) – přidělený VPN IP pool, jaká je velikost VPN poolu, kolik adres je online a kolik offline

ESTABLISHED 11 minutes ago, 192.168.0.7[1.2.3.4]…39.128.25.98[vas_login] – před kolika minutami se VPN klient připojil, reálná IP adresa VPN serveru, v závorce veřejná IP adresa VPN serveru, IP adresa ze které se VPN klient připojil a jeho login

CHACHA20_POLY1305/PRF_HMAC_SHA2_512/CURVE_25519 – ve formátu: typ symetrické šifry/typ autentizace/typ asymetrické šifry

bytes_i (51 pkts, 1s ago) – celkový počet příchozích bajtů a v závorce celkový počet příchozích paketů a před kolika sekundami byly přijaty

bytes_o (49 pkts, 1s ago) – celkový počet odchozích bajtů a v závorce celkový počet odchozích paketů a před kolika sekundami byly přijaty

192.168.0.0/24 === 10.10.10.1/32 – první je subnet co se tuneluje do VPN, druhá je IP adresa VPN klienta

Zdroje:

[1] https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-20-04
[2] https://wiki.strongswan.org/projects/strongswan/wiki/connsection
[3] https://wiki.strongswan.org/projects/strongswan/wiki/ForwardingAndSplitTunneling
[4] https://serverfault.com/questions/965244/strongswan-ikev2-vpn-on-windows-10-client-policy-match-error
[5] https://wiki.strongswan.org/projects/strongswan/wiki/ipseccommand
[6] https://serverfault.com/questions/978465/strongswan-domain-and-suffix-dns

Dobrovolný dar

Ahoj čtenáři, rád bych tě poprosil aby ses zamyslel, co je vše potřeba ke vzniku článku.
Jakožto amatérský softwarový kutil musím:

1) Nejdříve vše nastudovat v cizích jazycích.
2) Vše následně prakticky vyzkoušet.
3) Svoje poznatky a zkušenosti napsat do článku který si právě přečetl v jazyku kterému rozumíš.
4) Dát článku hlavu a patu a publikovat.

Každý článek zabere několik hodin práce, za kterou mi nikdo neplatí.
Prosím zvaž, kolik času jsem ti právě ušetřil.
Pokud ti to stojí aspoň za cenu jedné kávy, tak mi ji kup.
Předem moc děkuji.

Příspěvek tak můžeš provést zasláním libovolné částky na mé číslo účtu 1558701011/3030 Nebo můžeš dar poslat kliknutím na tento odkaz Podpořit tento WEB , který tě přesměruje na mou platební bránu Revolut.

Dar je také možné poslat ve formě Bitcoinu na BTC peněženku bc1qqdf5fp42a7srwwhh2rut8zr9x4jm5c8fqc9qw6

Veškeré peněžní prostředky budu také používat na zlepšení kvality své webové tvorby a na psaní nových technických návodů. Za každý dar předem děkuji.

2 thoughts on “Nastavení StrongSwan VPN serveru na Ubuntu 20.04

  1. Michal Vašíček

    Skvělý návod. Bohužel nefunguje s Apple (iOS).

    Reply
    1. administrator Post author

      Dekuji, bohuzel s Applem nemam navod vyzkouseny.

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *