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ářů:
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:
Výstup příkazu ipsec version:
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:
Omezit přístup do složky pki jen pro aktuálního uživatele:
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.
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:
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:
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
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.
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:
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:
Vytvořit soubor 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í:
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]:
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]:
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í.
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]:
Díky parametru eap_identity=%identity StrongSwan žádá klienta o přihlašovací údaje:
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:
Takto by měl vypadat celý konfigurační soubor ipsec.conf:
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:
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:
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):
Následně definovat v souboru ipsec.secrets přihlašovací údaje pro VPN klienta:
Takto by měl vypadat celý konfigurační soubor ipsec.secrets:
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:
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:
Povolit firewall:
Povolit standardní porty IPsec UDP/500 a UDP/4500:
Všechny povolené porty lze vylistovat příkazem sudo ufw status.
Dále potřeba zjistit jméno rozhraní vedoucí do internetu:
Výpis příkazu ukazuje, že pro přístup do internetu je použito eno1 rozhraní:
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:
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í:
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:
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ů:
Odkomentovat následující řádek:
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ý):
Nakonec v souboru sysctl.conf deaktivovat zjišťování Path MTU, aby bylo zabráněno problémům s fragmentaci paketů:
Deaktivací a opětovným povolením bude restartováno nastavení Firewallu:
Logy:
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:
Výstup by měl vypadat nějak takto:
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):
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 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ářů:
2. Nainstalovat strongswan balíček a libcharon-extra-plugin, což je knihovna extra pluginů pro IPsec klienta:
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
4. Editovat /etc/ipsec.secrets:
a nakonfigurovat uživatelské jméno a heslo (tak jak bylo nakonfigurováno na VPN serveru):
5. Editovat 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.
Připojení k VPN serveru se provede příkazem:
Status, zda StrongSwan běží, se provede příkazem:
Pozn. Zda stanice dostala IP adresu z VPN serveru se dá zjistit ip a příkazem.
Odpojení k VPN serveru se provede příkazem:
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ářů:
2. Nainstalovat charon-cmd, což je jednoduchý IPsec VPN klient (pozn. instalace strongswan balíčku není potřebná):
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.
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:
Výpis příkazu ipsec leases:
Vypíše status připojených klientů:
Vypíše detailní status připojených klientů + připojuji legendu níže:
Výpis příkazu ipsec statusall:
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
Skvělý návod. Bohužel nefunguje s Apple (iOS).
Dekuji, bohuzel s Applem nemam navod vyzkouseny.