V domácej LAN používam rôzne sieťové zariadenia ku ktorým by som chcel mať prístup aj keď som mimo svojej LAN. Vzhľadom k tomu, že disponujem verejnou IPv4 adresou, tak jednou z možností by bolo každé zariadenie vystaviť prostredníctvom NAT do internetu (ako napr. webovy server). Avšak k týmto zariadeniam nemám v úmysle dávať prístup celému svetu, potrebujem aby boli prístupne len pre mňa. Ďalšou z možností je použiť VPN tunel.
- Výber VPN služby
- Dynamic DNS
- OpenVPN server
- Vytvorenie užívateľa
- Inštalácia balika openvpn-client-export
- Export konfiguračného súboru
- Nastavenie klienta na smartphone
- Záver
- Použitá literatúra
Výber VPN služby
V pfSense sú na výber 3 možnosti ako bezpečne a šifrovane komunikovať medzi sieťami, resp. sieťou a klientom, ktoré zvyčajne na seba nevidia (čiže sa nachádzajú v rôznych oblastiach (kľudne sa môžu nachádzať aj na rôznych kontinentoch)).
- L2TP/IPSec
- OpenVPN
Wireguard
Keďže už mám nejaké skúsenosti s OpenVPN a s fungovaním som veľmi spokojný, tak som sa rozhodol že využijem znova túto službu. V súčasnej dobe používam firewall pfSense 2.5.0-RELEASE a nedávno som sa dozvedel, že z verzie 2.5.1-RELEASE bol Wireguard odstránený. Ak by som sa teda rozhodol pre Wireguard tak po aktualizácii na 2.5.1 by som musel všetky tunely z pfSense odstrániť a aj tak by som musel prejsť na OpenVPN, prip. L2TP/IPSec.
Dynamic DNS
Pokiaľ ešte nemáme vytvorený hostname a naša verejná IPv4 je dynamická, tak odporúčam vytvoriť si na nejakom Free DNS servery doménové meno (hostname). V pfSense je k dispozícii aj Dynamic DNS klient, ktorý v sebe integruje najznámejšie dynamic DNS servery. Odporúčam vytvoriť konto na no-ip. Ak teda máme vytvorené konto s nejakým hostname, tak vo webovom rozhraní pfSense sa presunieme na
Services --> Dynamic DNS --> Add
A vyplníme položky, ktoré som na obrázku vyznačil červenou farbou
- Service Type – No-IP
- Interface to monitor – WAN
- Hostname – to čo sme si vytvorili na no-ip
- Username – užívateľsk meno na no-ip
- Password – heslo na no-ip
- Password Confirm – potvrdíme heslo

OpenVPN server
Nastavenie OpenVPN servera predstavuje najdôležitejšiu časť tohto blogu. Konfigurácia môže prebiehať prostredníctvom sprievodcu (wizard), alebo ručným nastavením. V podstate je to jedno, akurát sprievodca je možno o niečo jednoduchší a uľahčuje konfiguráciu menej zdatným užívateľom. V rámci webového rozhrania pfSense prejdeme na
VPN --> OpenVPN --> Wizards
Typ servera
Teraz potrebujeme vybrať spôsob ako sa budeme klient autentifikovať na OpenVPN server. Na výber máme 3 možností:
- Local user access
- LDAP
- Radius
Použijeme prvý typ (Local user access) a klikneme na button >>Next

Pridávame certifikačnú autoritu
Ďalším krokom bude vytvorenie certifikačnej autority (CA) pre vydávanie resp. podpisovanie certifikátov pre server, ale aj pre klientov. Väčšina položiek je pred-konfigurovaná, takže mi si zvolíme len Descriptive name. Dĺžka kľúča je prednastavená na 2048 bitov, čo je v celku bezpečné. Niekto však môže namietať, že tento kľúč je možné za určitých okolnosti prelomiť, takže na výber má aj iné dĺžky až po 16384 bitov. Takáto vysoká hodnota by značne zaťažila výpočtový výkon, takže sa neodporúča. Ak chcete byť úplne v bezpečí, tak 4096 bitov je naozaj bezpečné. Ostatné kolónky môžeme, ale nemusíme vypĺňať. teraz môžeme kliknúť na button >> Add new CA
- Descriptive name – mojalan_ca
- Key length – 2048 bit
- Lifetime – 3650

Pridávame nový certifikát servera
Tak isto vyplníme niektoré položky, resp. jednu položku a ostatné ponecháme ako sú:
- Descriptive name – mojalan_server_ca
Klikneme na button >> Create new certificate

Všeobecné nastavenie servera
Pozorný čitateľ si určite všimne (viď nasledujúci obrázok), že pre službu OpenVPN nepoužívam štandardný port 1194, ale port 11194. Dôvod je ten, že jeden OpenVPN už v sieti používam, takže som pre tento server musel zvoliť iný port. Čo sa týka výberu portu, tak máme si možnosť vybrať z 65536 (čo je 2^16). Viac o portoch pozri wikipediu. Dosť často sa zvykne pre VPN siete použiť aj port 443, ktorý sa štandardne používa na https. Dôvod je ten, že niektorí klienti môžu mať blokované všetky porty okrem portov 80/443 (tieto porty nezvykne blokovať žiadaný poskytovateľ, pretože na tých portoch funguje web). Ostatné kolónky necháme ako sú a Description si zvolíme podľa svojho
- Interface – WAN
- Protocol – UDP on IPv4 only
- Local port – 11194 (ak je to jediný alebo prvý OpenVPN, môže ostať na1194)
- Description – čo si zvolíme, je len na nás

Cryptographic setting
Túto časť nastavíme podľa obrázka. Toto nastavenie hovorí ako bude prebiehať autentifikácia a šifrovanie v tunely. Je to už kvázi prednastavené.

Nastavenie tunela
Tu je dôležité nastaviť „Tunel Network“ to bude naša novo vytvorená sieť cez ktorú sa budú klienti pripájať na našu lokálnu sieť LAN. Zapisuje sa aj s maskou podsiete v tvare CIDR (čiže /24). Upozorňujem, že takáto sieť sa na pfSense nesmie nachádzať. Ak by sme napr. už používali na inej sieti VPN 10.8.1.0/24, tak musíme zvoliť iný rozsah napr. 10.8.2.0/24. Ďalšou položkou je „Local Network„. To je naša existujúca LAN na ktorú sa budu pripájať klienti z VPN siete. Položku Inter-Client Communication môžeme označiť a vtedy môžu medzi sebou komunikovať aj VPN klienti.
- IPv4 Tunnel Network – 10.8.1.0/24
- Redirect Gateway – prázdne
- Local network – 192.168.1.0/24
- Inter-client communication – fajka

Nastavenie klienta
Tu budeme nastavovať DNS servery pre VPN klientov. Môžeme použiť aj miestnu adresu DNS servera, príp. nastavíme rekurzívne resolvery z ktorých budú dostávať odpovede VPN klienti. Po nastavení klikneme na button >>Next
- Dynamic IP – necháme fajku
- Topology – Subnet One IP address per client in common subnet
- DNS Server x – zvolíme si nejake známe rekurzívne resolvery

Pravidla firewallu
V predvolenom nastavení je všetka komunikácia na VPN blokovaná. V tejto časti sprievodcu by sme mali označiť obidva checkboxy, ktoré nám vygenerujú pravidla vo firewalle a tak ich nemusíme vytvárať ručne. Prvé pravidlo nám otvorí port na cieľovom rozhraní, čo je naše WAN rozhranie a povolí sa klientom pripojiť na OpenVPN server. Pravidlo je vygenerované tak, že prístup povolí z akejkoľvek zdrojovej IP adresy. Ak to chceme zmeniť a pridať konkrétnu zdrojovú IP adresu, môžeme neskôr toto pravidlo editovať. Druhé pravidlo, ktoré systém automaticky vygeneruje hovorí o tom, že klient bude mať prístup aj do LAN siete. Po nastavení klikneme na button >>Next.

Tieto pravidlá môžeme skontrolovať ak sa po skončení sprievodcu pozrieme do pravidiel WAN a novo vytvorenej položky v pravidlách OpenVPN.
Firewall --> Rules --> WAN
Firewall --> Rules --> OpenVPN
Na konci nám sprievodca oznámi, že dokončil konfiguráciu a ešte nás upozorní, že ak chceme exportovať konfiguračné súbory klientom, tak by sme mali nainštalovať OpenVPN Client Export package. Teraz po kliknutí na button >>Finish ukončíme sprievodcu. OpenVPN server je teraz nastavený a beží. Z hľadiska nastavenia OpenVPN servera to je všetko. V ďalších krokoch budeme vytvárať užívateľov.

Vytvorenie užívateľa
V rámci webového rozhranie pfSense sa presunieme na:
System --> User Manager
Vyplníme len niektoré položky:
- Username – zvolíme meno pre klienta
- Password – zvolíme heslo pre klienta + potvrdíme heslo
- Full name – môžeme zvoliť aj plné meno
- Certificate – označíme Click to create a user certificate

Po označení checkboxu Certificate sa rozbalí ďalšia ponuka, kde nastavíme parametre pre vytvorenie certifikátu klienta. Nastavíme to podľa obrázku a klikneme na Save. Týmto krokom sme ukončili vytvorenie užívateľa, ktorému bol zároveň vygenerovaný certifikát.

Inštalácia balíka openvpn-client-export
Teraz keď máme vytvorený a funkčný OpenVPN server, vytvoreného prvého klienta s platným certifikátom, môžeme sa vyskúšať k serveru pripojiť. Problém, ktorý nás čaká je konfigurácia OpenVPN klienta. Veľmi pekný balík ktorý to za nás všetko spraví a vyexportuje nám už hotový konfiguračný súbor pre akúkoľvek platformu z ktorej sa budeme na OpenVPN server pripájať, ma názov openvpn-client-export. Inštalácia balíka je veľmi jednoduchá. V rámci webového rozhrania pfSense prejdeme na:
System --> Package Manager --> Available Packages
Do vyhľadávacieho poľa zadáme čo hľadáme, čiže openvpn-client-export a po vyhľadaní klikneme na button +Install. Nainštalovaný balík potom nájdeme na:
VPN --> OpenVPN --> Client Export
Export konfiguračného súboru
Nastavíme podľa obrázka. Dôležité je skontrolovať položku Host Name Resolution aby bola nastavená na našu dyndns adresu, ktorú sme vytvorili v tomto kroku. Ostatné parametre môžeme ponechať ako sú

V ďalšej časti by sme mali vidieť klienta (alebo klientov) pre ktorých chceme exportovať konfiguračné súbory. V mojom prípade je tam jediný klient a to je xiaomi (viď nasledujúci obrázok). Ja som testoval pripojenie do VPN siete cez môj Android smartphon. Poslednou úlohou je export konfiguračného súboru, kde nám stačí kliknúť na button pre ktorú platformu chceme config exportovať. Čiže ja som klikol na button Android a config som uložil do PC. Súbor ma obyčajne koncovku .ovpn a obsahom je certifikačná autorita, certifikát klienta, privátny kľúč a staticky kľúč. Na začiatku súboru sú parametre nevyhnutné k pripojeniu na server.
persist-tun
persist-key
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305:AES-256-CBC
data-ciphers-fallback AES-256-CBC
auth SHA256
tls-client
client
remote dyndns_name.com 11194 udp4
lport 0
verify-x509-name "mojalan_server_ca" name
auth-user-pass
remote-cert-tls server
explicit-exit-notify
Tento konfiguračný súbor je potrebné preniesť bezpečnou cestou do smartphonu, alebo do zariadenia z ktorého sa budeme na OpenVPN server pripájať. Ja som ho preniesol síce nebezpečným FTP protokolom, ale v rámci LAN siete, takže pravdepodobnosť odchytenia MiTM je vylúčená.

Nastavenie klienta na smartphone
V súčasnej dobe používam starší smartphone Xiaomi RedMi Note 3. Na pripojenie sa do OpenVPN siete som si zvykol na aplikáciu OpenVPN Client Free, ktorá je veľmi jednoduchá a prehľadná. Predpokladajme, že konfiguračný súbor sme už nahrali bezpečným spôsobom do smartphonu. Teraz otvoríme aplikáciu OpenVPN Client Free a postupujeme podľa obrázkov 1-6:
- Ťukneme na ikonku plus (+)
- Ťukneme na ikonku Import OpenVPN profile
- Vyhľadáme a ťukneme na konfig.ovpn, ktorý sme do smartphonu nahrali
- Ťukneme na ikonku pripojiť
- Zadáme meno a heslo
- Sme pripojený!
Ak sa klient nachádza na stabilnom internetovom pripojení, tak pripojenie do VPN siete prebehne do 1-2 sekúnd. Teraz keď sme pripojený šifrovaným VPN tunelom do našej LAN sieťe, môžeme otestovať akékoľvek sieťové zariadenie v sieti LAN (napr. nejaké routery, smart boxy, alebo lokálne servery atď.). Tak isto ako sa klient cez tunel dostane do LAN siete, tak aj z LAN siete sa vieme dostať na klienta. Ak sa v rámci webového rozhrania pfSense presunieme na:
Status --> OpenVPN

Tak vidíme pripojených klientov. Momentálne je pripojený len jeden klient xiaomi s pridelenou IP adresou 10.8.1.2.
Záver
V tomto návode sme si ukázali ako pomocou pfSense vytvoríme šifrovaný VPN tunel na pripojenie klienta do lokálnej siete. Popísal som len základné, ale bezpečné nastavenie OpenVPN servera. Ešte by som snáď na záver pripomenul, že je dôležité spraviť si zálohu dôležitých certifikátov, kľúčov, resp. celej konfigurácie OpenVPN servera. Tak ako obvykle v pfSense je na to klikátko „Diagnostic -> Backup & Restore„. V prípade problémov s OpenVPN je možnosť nahliadnuť do lógov „Status -> System logs -> OpenVPN„.