4.10.2021
Na fotovoltaických elektrárnách míváme typicky zařízení, obvykle průmyslové PC nebo FotobotHW, na kterém běží Linux, které sbírá data z různých zdrojů, ukládá je do lokální databáze a poslouchá na síti a čeká na různé řídící povely. Někdy na takovém počítači dokonce i vyvíjíme různé komunikační protokoly. Je totiž mnohem snazší nainstalovat na BBB překladač C++ a vyvíjet dálkově, než přijet na elektrárnu, případně dovézt kus elektrárny do kanceláře. Odjet kvůli pár řádkům kódu na Ukrajinu leze do peněz. Přivézt z Ukrajiny ½ MW střídač je ještě dražší a je s tím spousta papírování, nehledě na to, že vysokozdvižný vozík to po schodech do kanceláře nedoveze a pod stůl to nedám. Můj vyslanec na elektrárně proto musí být spolehlivě dostupný přes internet.
Velká elektrárna je z pohledu připojení k internetu poměrně dobře kontrolované prostředí. Obvykle se zde najde správce sítě, který umí nastavit statickou adresu do DHCP a nastavit NAT pro některé porty, ale nemusí to být pravidlem a hlavně může být problém takového člověka sehnat a domluvit se s ním (pamatujete? Ukrajina).
Internet dnes není jednoduché prostředí. To kdysi dávno, když 4 miliardy adres bylo víc, než si kdy kdo dokázal představit v nejdivočejších snech, neexistoval NAT a o firewallech se vedly pouze akademické spory v učených spisech, byla situace jednoduchá. Do zařízení se nastavila pevná IP adresa a ta byla vidět z internetu odkudkoliv. Aspoň teoreticky.
Dnes je situace složitější. Počítačů je tolik, že adresní rozsah IPv4 nestačí. Za kdekterou veřejnou IPv4 adresou je schovaných několik různých zařízení, jejich počet může jít klidně do stovek či tisíců. Bez sofistikované spolupráce se správcem takové sítě je nemyslitelné dostat k takovým zařízením rozumný přístup (ssh, http, https…) Ideální by byla pro každé takové zařízení veřejná IP adresa, ale IPv4 adresy nejsou. Opakuji: nejsou. A nebudou. Pokud se omezíme na IPv4, internet prostě nefunguje. Je rozbitý na milióny kousků, které už se slepit nedají. Řešením by bylo IPv6, ale získat IPv6 připojení uprostřed pole ve východní Evropě není běžné. Běžné to není ani v západní Evropě, ani u nás v Česku. Z důležitých webů nepodporuje IPv6 už jen github, ale na straně ISP vládne tma a středověk.
Jak to tedy zařídit, aby bylo zařízení spolehlivě dostupné ihned po zapojení do lokální sítě? Řekněme si to rovnou: na IPv4 to nejde. Ale protokol IPv6 má dostatek adres, tam to jde zařídit poměrně snadno. Když sáhneme po protokolu IPv6, můžeme navzdory technicky zaostalému ISP na poli zařídit veřejnou IP adresu pro každé zařízení i každou síť na fotovoltaických elektrárnách.
Na elektrárnách (a jinde) používáme dále popsané řešení s těmito vlastnostmi:
Celá struktura je patrná z obrázku. K prvnímu zařízení je připojená celá síť (to jsou ty zelené čtverečky), druhé a třetí zařízení jsou single. Šedou oblastí jsou ohraničené celky, které obvykle pracují v rámci jednoho počítače.
Adresy z obrázku jsou zvolené z rozsahu 2001:db8::/32, který se používají v dokumentacích a v příkladech. Pro své účely budete potřebovat prefix v rozsahu /56 (minimum), ideálně však /48 (použito v příkladu)
Celá síť zde má rozsah 2001:db8:0::/48. Rozsah 2001:db8:0:1::/64 je použitý pro interní firemní síť. Ta se dá samozřejmě dále dělit. Vyčlenit lze například samostatný adresní rozsah pro DMZ (není na obrázku).
Pro vlastní zařízení je vyhražený prostor 2001:db8:0:1000::/52 – každá adresa, která začíná 2001:db8:0:1xxx patří do některé ze sítí vyhražených pro externí zařízení. Protože každé zařízení dostává celou síť s rozsahem /64, lze použít zařízení jako router a schovat za ně množství dalších zařízení. V rozsahu 2001:db8:0:1000::/49 lze naadresovat 4096 sítí (mínus jedna síť spojovací – popsáno dále). Pokud vám takové množství nestačí, je možné rozšířit počet sítí na téměř celý rozsah 2001:db8:0::/48, čímž získáme prostor pro více než 64 tisíc zařízení. Pokud máte od svého ISP masku /56, dokážete takto naadresovat jen asi 250 zařízení (něco padne na spojovací sítě, intranet atd).
Žlutou barvou je v obrázku naznačená spojovací síť. Pro spojovací síť stačí jediná síť s maskou /64. Adresa serveru je statická, adresy pro zařízení se vytvářejí dynamicky při vytvoření IPSec spojení. V dalším popisu je pro spojovací síť vyhražený rozsah 2001:db8:0:1000::/64.
Hadice vyvedené růžovou barvou představují spojení mezi serverem v podnikové síti a mezi jednotlivými zařízeními. Spojení může probíhat jak protokolem IPv4, tak IPv6. Adresy zde nejsou důležité. Na jedné straně bude samozřejmě adresa (IPv4 nebo IPv6) serveru, na straně druhé pak věřejná IP adresa zařízení – většinou jediná IPv4 adresa, kterou dostanete od ISP pro připojení celé své sítě. Celé spojení je zašifrované a transport je v módu tunnel. Co se děje uvnitř spojení je nevysledovatelné. Navenek může být vidět pouze IPSec provoz, ale komunikující adresy a obsah komunikace je spolehlivě skrytý.
Tomuto tématu jsem se věnoval už ve starším článku. Podrobnosti si můžete přečíst tam. I když připojení uživatelských počítačů se od připojení zařízení mírně liší, požadavky zůstávají v principu stejné:
V dřívějším článku o připojení uživatelských stanic (notebooků) byly pro identifikaci serveru použité certifikáty. To má svůj důvod – ve Windows se bez certifikátů neobejdete, certifikát na serveru je občanka, kterou se prokazuje server klientským stanicím. Bezpečnost může být s certifikáty o něco vyšší, nevýhodou je ale složitější nastavení serveru a pravidelná starost o aktualizaci certifikátů. U připojení linuxových zařízení lze zvolit konfiguračně jednodušší cestu a jak stanice, tak server se mohou prokazovat heslem.
U nastavení strongswan je použitá jedna nezvyklá finta. Na serveru je prohozená strana left a right. Obvykle bývá strana left vyhražená pro server, zde je to naopak. Důvod je jednoduchý: část konfigurace s nastavením zařízení je stejná jak na serveru, tak na zařízení. Při vytváření konfigurace nového zařízení toho nemusíte tolik opisovat, stačí CTRL-C a CTRL-V.
Server musí mít povolené routování IPv6 v souboru /etc/sysctl.conf:
net.ipv6.conf.all.forwarding=1
Nastavení strongswan, soubor /etc/ipsec.conf:
############################################# # Nastavení pro zařízení conn device001 leftid = device001 leftsubnet = 2001:db8:0:1001::/64 also = deviceXXX auto = add conn device002 leftid = device002 leftsubnet = 2001:db8:0:1002::/64 also = deviceXXX auto = add …a tak dál, pro každé zařízení samostatná sekce conn ############################################# # /etc/ipsec.conf # Společná část pro všechna zařízení conn deviceXXX auto = ignore closeaction = clear # Lokální strana, POZOR - Přehozeno!!!!! right = vpn.devices.hobrasoft.cz rightid = vpn_devices rightsubnet = ::/0 rightauth = psk rightsendcert = never # Remote strana, POZOR - Přehozeno!!!!! left = %any leftauth = psk leftsourceip = 2001:db8:0:1000::/97 leftdns = 2001:db8:0:1::1 # DNS server pro zařízení (zde je místěný v intranetu) ############################################# # Společná nastavení pro celý IPSec server conn %default keyexchange = ikev2 rekey = yes forceencaps = no compress = no fragmentation = yes closeaction = restart dpdaction = hold dpddelay = 60s auto = start ike = aes256-aes128-sha512-modp4096! esp = aes256-aes128-sha512-modp4096!
Nastavení strongswan, soubor /etc/ipsec.secrets:
# /etc/ipsec.secrets vpn_devices : PSK "heslo-serveru" device001 : PSK "heslo-device-001" device001 : PSK "heslo-device-002" …
Na serveru je nutné nastavit IPv6 adresu pro spojovací síť. V distribuci Debian to můžeme zařídit například v souboru /etc/network/interfaces. Zde je uvedená pouze část souboru, v praxi bude nastavení složitější a síťová rozhraní budou mít pravděpodobně adres více:
# /etc/network/interfaces # Nastavení IPv6 adresy spojovací sítě iface eth0 inet6 static address 2001:db8:0:1000::1 netmask 64
Na zařízení je nutné nastavit přidělenou statickou IPv6 adresu. V distribuci Debian to můžeme zařídit například v souboru /etc/network/interfaces:
# /etc/network/interfaces auto lo iface lo inet loopback # Nastavení IPv4 iface eth0 inet dhcp # Nastavení IPv6 iface eth0 inet6 static address 2001:db8:0:1001::1 netmask 64
U nastavení strongswan je to zařízeno záměrně tak, aby celá konfigurace zařízení byla pokud možno na jednom místě, aby byla společná s konfigurací na serveru a aby se dala většina konfigurace jednoduše zkopírovat.
# /etc/ipsec.conf ########################################## # Tento kus je nutné změnit pro každé zařízení zvlášť! # Stejný kus konfigurace je i na serveru. # Stačí CTRL-C CTRL-V conn device001 leftid = device001 leftsubnet = 2001:db8:0:1001::/64 also = deviceXXX auto = start # na serveru je add, při kopírování změňte na start ########################################## # Společné pro všechna zařízení, neměňte conn %default keyexchange = ikev2 closeaction = restart dpdaction = restart dpddelay = 30s rekey = yes auto = start compress = no fragmentation = yes forceencaps = yes ike = aes128-aes256-sha512-modp4096! esp = aes128-aes256-aes128-sha512-modp4096! conn deviceXXX auto = ignore # protistrana right = vpn.devices.hobrasoft.cz rightid = vpn_devices rightsubnet = ::/0 rightauth = psk # moje strana leftsourceip = %config6 leftauth = psk
Do souboru /etc/ipsec.secrets na zařízení zkopírujte ze serveru heslo pro server i pro příslušné zařízení. Ostatní hesla nevadí, ale z důvodů zabezpečení bych je tam nekopíroval:
# /etc/ipsec.secrets vpn_devices : PSK "heslo-serveru" device001 : PSK "heslo-device-001"
Spojení prostřednictvím ipsec občas umře a StrongSwan nedovede spojení znovu nahodit automaticky. Do cronu (nebo do systemd) si proto doplňte jednoduchou periodicky spouštěnou službu (třeba co minutu) pro hlídání a opětovné nastartování šifrovaného kanálu.
#!/bin/bash if [ "$(/usr/sbin/ipsec status | grep 'none')" = " none" ]; then /bin/systemctl restart ipsec fi
Server poslouchá na UDP portu 4500. UDP je zde použito kvůli připadnému NATu v cestě – tomu se dnes na IPv4 obvykle nevyhnete. Protokol IPSec je zapouzdřený do UDP a nemění se. NAT má totiž jednu šílenou vlastnost – zasahuje do obsahu paketů. Pozměněné pakety by IPSec zahodilo, spojení by nefungovalo. Smrt NATu!
Požadavek od zařízení přijde na server dnes obvykle protokolem IPv4. StrongSwan prostřednictvím tohoto spojení vytvoří spojovací síť z rozsahu 2001:db8:0:1000::/97. Adresa této spojovací sítě na straně zařízení není pevně daná. U připojení notebooku to nevadí, adresa je veřejná, přidělená z ověřeného rozsahu a pro přístup k síťovým prostředkům uvnitř intranetu to stačí.
U zařízení ale potřebujeme mít adresu vždy stejnou. Zařízení má proto nastavenou statickou adresu už při startu systému. IPSec na straně serveru pak doplní routovací tabulky o cestu k síti konkrétního zařízení při vytvoření spojení. Na straně zařízení nastaví IPSec výchozí bránu pro IPv6 na adresu serveru ve spojovací síti.
V době, kdy je spojení neaktivní, má zařízení nastavenou pouze jednu adresu z našeho rozsahu:
2001:db8:0:1001::1/64
Jakmile je spojení aktivní, doplní se i adresa spojovací sítě, adresy jsou dvě:
2001:db8:0:1000::47/97 # dynamická adresa bodu ve spojovací síti 2001:db8:0:1001::1/64 # statická adresa zařízení nastavená v konfiguraci sítě
Užitečným pomocníkem je příkaz ipsec status
.
Na stanici byste měli vidět při správně vytvořeném spojení něco takového:
Security Associations (1 up, 0 connecting): device001[11]: ESTABLISHED 2 hours ago, 10.0.3.10[device001]...123.276.123.82[vpn_devices] device001{44}: INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c212bd6b_i cc854e6f_o device001{44}: 2001:db8:0:1001::/64 === ::/0
Zařízení je už nyní kompletně nastavené tak, aby dokázalo zprostředkovat přístup do IPv6 internetu všem ostatním zařízením v lokální síti. Ostatní zařízení o tom pouze neví. Adresu routeru (zde 2001:db8:0:1001::1) můžete nastavit ručně v síťové konfiguraci, ale lepší je automatické nastavení. K tomu slouží program radvd. Ten posílá do lokální sítě informaci o výchozím routeru a případně i DNS (některé OS DNS neakceptují).
Nastavení radvd může být velmi jednoduché:
interface eth0 { AdvSendAdvert on; MinRtrAdvInterval 10; MaxRtrAdvInterval 60; AdvHomeAgentFlag off; prefix 2001:db8:0:1001::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; }; RDNSS 2001:db8:0:1::1 { AdvRDNSSLifetime 3600; }; };
Radvd bych ale spouštěl jen ve velmi dobře kontrolovaném prostředí. Veškerý IPv6 provoz by totiž začal chodit přes váš firemní server a zatěžoval by linku. V lokální síti daného zařízení pak nesprávné nastavení mohlo kompletně rozbít nastavení IPv6 a znemožnit tak rozumné fungování lokální sítě.
Popsané nastavení IPSec nepoužívá žádné „speciální“ síťové rozhraní pro šifrovaná data a je to tak správně. Vše je řízené pomocí politik. Šifrované i nešifrované pakety se objevují na venkovním síťovém rozhraní (zde eth0). Pro spoustu lidí to může být matoucí. Kdyby to takto fungovalo na IPv4, začaly by se jim na venkovním síťovém rozhraní objevovat pakety z lokálního rozsahu (například 192.168.1.0/24), což obvykle není dobře. U IPv6 ale žádné lokální rozsahy nejsou, takové pakety se na venkovním rozhraní objevují běžně. IPSec se v IPv6 síti nepoužívá pro „vytvoření VPN“, ale pro zajištění šifrování mezi dvěma body na internetu. Těmito body mohou být sítě, nebo jednotlivé počítače. Pakety se stejným obsahem a stejnými adresami mezi nimi běhají bez ohledu na to, jestli jsou šifrované nebo ne. Existence virtuálního síťového rozhraní zde nemá žádné opodstatnění.
Pro připojení jednoho jediného zařízení jsme spotřebovali obrovský adresní prostor:
Ušetřit lze, pokud si necháte přidělit od svého ISP prostor /56, tj. 2⁷² = 4 722 366 482 869 645 213 696 adres. Potom je bilance příznivnější.
Ale i kdybyste využili zbývající adresní prostor do poslední mrtě, připojení jediného zařízení vás vždy bude stát nejméně 2⁶⁴ + 2 = 18 446 744 073 709 551 618 adres. Je to v pořádku a není to plýtvání. Kvůli tomu bylo IPv6 vynalezeno.