Last Updated on 24/01/2023 by administrator
Konfigurace StrongSwan VPN server Ubuntu 22.04
Konfigurace StrongSwan VPN server Ubuntu 22.04
Motivace:
Článek popisuje instalaci a konfiguraci VPN IKEv2 pomocí StrongSwan na Ubuntu 22.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 22.04 LTS. Konkrétně na open-source platformě Proxmox verze 7.2-3 pod template ubuntu-22.04-standard_22.04-1_amd64.tar.zst
Implementace [1]:
Poznámka pro administrátory, vytvářející StrongSwan na Proxmox – je potřeba vytvořit LXC Privilegovaný kontejner.
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, balíček libcharon-extra-plugins pro instalaci potřebného EAP pluginu. Poslední balíček libtss2-tcti-tabrmd0 slouží obsahuje sdílenou knihovnu obsahující TPM2 Access Broker & Resource Management.
sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd0
Verze StrongSwan:
ipsec version
Výstup příkazu ipsec version:
Linux strongSwan U5.9.5/K5.15.30-2-pve
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 4096bitový 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 VPN server:
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:
Konfigurace StrongSwan VPN server na Ubuntu vyžaduje zapnout UFW, 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
Tímto je konfigurace StrongSwan VPN server na Ubuntu 22.04 hotova.
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.exe
2. Spustí se Windows Management Console. Nahoře v menu kliknout na File a vybrat Add or Remove Snap-in:
Kliknout na Certificates následně na Add:
Aby VPN fungovala s jakýmkoliv uživatelem, vybrat Computer account a kliknout na Next:
Konfigurace probíhá na tomto počítači proto zvolit Local computer a kliknout na Finish:
Potvrdit OK:
Pod složkou Console Root, rozevřít Certificates (Local Computer) přes Trusted Root Certification Authorities k Certificates:
Kliknout na složku Certificate vybrat All Task > Import:
Otevře se Certificate Import wizard. Kliknout na Next:
Kliknout na Browse:
Pro lokalizaci certifikátu CA je potřeba změnit příponu na All Files (*.*), vybrat ca-cert.pem a kliknout na Open:
Jakmile je certifikát CA vybrán pokračovat na Next:
Umístění certifikátu musí být pod Trusted Root Certification Authorities:
Kliknutím na Finish se importuje certifikát CA:
Certifikát CA by se měl objevit pod Certificates:
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:
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:
Zvolit Connect to a workplace:
Zvolit No, create a new connection:
Vybrat Use my internet connection (VPN):
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:
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:
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ů:
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 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:
- Nahrát certifikát ca-cert.pem mobilu/tabletu. Např. je možné si jej poslat přes email.
- Stáhnout strongSwan VPN Client z Google Play do mobilu/tabletu.
- Otevřít aplikaci strongSwan VPN client a kliknout nahoře vpravo na more či tři tečky a vybrat CA certificates
- Opět kliknout nahoře vpravo na more či tři tečky a vybrat Import certificate
- Vyhledat a importovat ca-cert.pem certifikát
b) Konfigurace VPN klienta:
- V aplikaci strongSwan VPN client kliknout na ADD VPN PROFILE.
- 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.
- Jako VPN typ zvolit IKEv2 EAP (Username/Password).
- Vyplnit uživatelské jméno a heslo (tak jak bylo nakonfigurováno na VPN serveru v souboru /etc/ipsec.secrets).
- Odšktnout Select automatically v sekci CA certificate a kliknout na Select CA certificate.
- Kliknout na IMPORTED a vybrat the certifikát, který byl naimportován (v konfiguraci VPN server byl pojmenovaný jako “VPN root CA”).
- Volitelně vyplnit Profile name (optional).
- 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 Ubuntu 22.04 LTS a Ubuntu 20.04 LTS 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 22.04 LTS a 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 restart 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 22.04 LTS 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.9.5, Linux 5.15.30-2-pve, x86_64): uptime: 41 minutes, since Jan 23 21:32:02 2023 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 Jan 23 21:32:02 2023 – 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
Řešení problémů:
1) Chyba „TPM 2.0 – could not load „libtss2-tcti-tabrmd.so.0“ [7]
Chyba nastane při příkazu: pki –gen –type rsa –size 4096 –outform pem > ~/pki/private/ca-key.pem
PM 2.0 – could not load „libtss2-tcti-tabrmd.so.0“
plugin ‚tpm‘: failed to load – tpm_plugin_create returned NULL
Řešení problému:
Nainstalovat balíček libtss2-tcti-tabrmd0:
apt install libtss2-tcti-tabrmd0
2) Nezobrazují se výstupy příkazů „ipsec ..“
Např se jedná o příkazy:
ipsec leases ipsec status ipsec statusall
Řešení problému:
Pokud se konfigurace prováděla na Proxmox, je potřeba vytvořit LXC Privilegovaný kontejner.
Zdroje:
[1] https://www.digitalocean.com/community/tutorials/how-to-set-up-an-ikev2-vpn-server-with-strongswan-on-ubuntu-22-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
[7] https://stackoverflow.com/questions/70542297/tpm-2-0-could-not-load-libtss2-tcti-tabrmd-so-0