IPsec na IPv6

Když jsem byl poprvé postavený před úkol vyrobit privátní šifrovaný tunel mezi různými pobočkami jednoho podniku, sáhnul jsem po IPsec, i když se nabízela řada dalších možností. Pokud si pamatuji, lákalo mě na IPsec to, že jde o technologii standardizovanou, podporovanou v IPv6. A i když jsem o IPv6 tehdy ani neuvažoval, nechtěl jsem si zavřít ani tato vrátka a chtěl jsem získat zkušenosti nejraději právě s IPsec.

Moje první VPN byla postavená na balíku OpenSwan. Fungovalo to hezky. Neklame-li mne paměť, vytvořilo se v každém z routerů jedno síťové rozhraní právě pro účely VPN. V pravidlech iptables se s tím pak dobře pracovalo - veškerý provoz, který se objevil na síťovém rozhraní tap0 (nepamatuji si název), patřil do vedlejší sítě a bylo snadné jej filtrovat.

Postupem času byl balík OpenSwan nahrazen balíkem IPsec Tools a jednoho dne jsem byl providerovým natem (NAT - network address translation, překlad adres) prostě donucen k přechodu. Filozofii balíku IPsec Tools jsem ovšem neporozuměl. Síťová rozhraní určená speciálně pro VPN zmizela, veškerý provoz se objevoval na rozhraní, kterým byl router připojený do internetu. Moje první myšlenka: "Co tohle vymyslelo za inteligenta"? Abych se nemusel příliš trápit s pravidly v iptables a neohrozil bezpečnost sítě, zprovoznil jsem VPN mezi dvěma servery umístěnými vevnitř sítě, až za firewally. Neexistenci speciálního síťového rozhraní jsem až do nedávna považoval za těžký handycap a katastrofální nedomyšlenost ze strany autorů balíku IPsec Tools.

Před pár týdny jsem začal experimentovat s IPv6. Jednou z věcí, kterou mě napadlo vyzkoušet, bylo samozřejmě IPsec. Život síťového administrátora je s IPv6 v mnoha ohledech neporovnatelně jednodušší, postavím-li jako protiklad IPv4. S IPv6 mi najednou docvaklo a pochopil jsem, proč v IPsec Tools žádné zvláštní síťové rozhraní pro VNP neexistuje a existovat nemůže. V IPv6 totiž neexistuje ani VPN. A jestliže něco neexistuje, nepotřebuje to ke své neexistenci žádné zvláštní prostředky a zacházení.

Aby můj provokativní výrok nezapadl a aby byl dostatečně úderný, uvedu jej v dalším nadpisu:

Pro IPv6 neexistuje žádná VPN

Abych své tvrzení ozřejmil, vysvětlím v prvé řadě fungování VPN s IPv4. Obvykle se spojují dvě oddělené sítě - dejme jim adresový rozsah 10.10/16 a 10.20/16. Mezi těmito sítěmi leží celý širý internet s adresami, které s rozsahy našich síti nekomunikují. V IPv4 nelze poslat IP paket počítači 10.10.1.1 na počítač 10.20.1.1, protože takový paket bude zahozen pravděpodobně už na prvním routeru mezi oběma sítěmi. Mezi sítě je proto nutné vložit vlastní - virtuální router, který spojení mezi oběma sítěmi zprostředkuje (a udělá to šifrovaně). Aby mohl router spojovat dvě sítě, potřebuje k tomu obvykle dvě síťové karty - proto je neexistence dalšího síťového rozhraní v IPsec Tools tak matoucí a nepříjemná.

Jaká je však situace v IPv6? Všechny počítače v obou vnitropodnikových sítích mají veřejnou IP adresu. Firewall mezi internetem a vnitřní sítí je pochopitelně i nadále nutnost - nechceme přeci, aby se nám kdokoliv z internetu procházel naší sítí. I provoz zevnitř ven je vhodné omezit - skladník ke své práci na noční směně přístup na internet určitě nepotřebuje. I když na firewallu neexistuje NAT a i když jsou všechny adresy veřejné, síť je díky striktním pravidlům chráněná stejně dobře, jako na IPv4. Neexistence NATu navíc dovoluje pravidla podstatným způsobem zjednodušit - zmenší se tak prostor pro dělání chyb.

A teď přijde ta nejdůležitější informace: obě sítě na sebe díky veřejným adresám vidí. Mezi sítěmi nemusí být žádný speciální router, který překlene jinak nezdolatelnou propast internetu. V pravidlech firewallu stačí povolit mezi oběma sítěmi veškerý provoz (s omezeními uvedenými v předchozím odstavci, aby vám skladník na noční nestahoval péčko) a provoz mezi různými pobočkami je zajištěn. Protože mezi sítěmi není žádný virtuální router, nepotřebujete ani další síťové rozhraní.

Má to však háček - provoz mezi pobočkami není nijak zabezpečen. Kdokoliv na internetu si může prohlédnout nejen IP adresy a vidí tedy i vnitřní strukturu vaší sítě, kdokoliv na interentu si může dokonce přečíst obsah vašich datových paketů a tím defakto prozkoumat i obsah vašich disků, aniž by jakkoli zaútočil na některou z vašich sítí.

Zde nastupuje na scénu IPsec, který jednoduše zapne mezi oběma firewally na obou pobočkách šifrování. Žádný tunel se nevytváří, důvod pro existenci nějaké virtuální privátní sítě neexistuje, mezi oběma hraničními routery se prostě jen zapne šifrování.

Prostě se jen zapne šifrování... a filozofie IPsec najednou dává smysl.

Jak IPsec funguje

Popis činnosti maximálně zjednoduším, je zbytečné sáhodlouze líčit věci, které už jsou popsané jinde:

http://knihy.nic.cz

Ve stručnosti to shrnu aspoň takto: každý paket, který prochází skrz router se zapnutým IPsec, se porovná s tabulkou politik. Pravidla v této tabulce si můžete představit například jako pravidla iptables. V této tabulce je kupříkladu uvedeno, že pakety odcházející na pobočku B se mají zašifrovat (sedíme na routeru pobočky A). Dále je zde uvedeno pravidlo, že pakety přicházející z pobočky B jsou zašifrované a musejí se rozšifrovat.

Pro šifrování existují dva režimy: transport a tunnel. Režim transport zašifruje pouze obsah každého paketu. Hlavičky, kde jsou uvedené IP adresy obou stran, zůstávají čitelné. Při průchodu přes internet tak může případný útočník prozkoumat architekturu vaší sítě. Režim tunnel zašifruje i původní hlavičky a v paketech zůstanou pouze IP adresy obou hraničních serverů. Případný útočník sice vidí, že nějaká komunikace probíhá, odesilatel, místo určení a obsah paketu mu však zůstává zcela skryt.

Politiky se nastavují pomocí příkazu setkey. V praxi je však takové nastavení příliš složité, protože se musí nastavit veškeré parametry šifrované komunikace a to včetně hesel. Práci s nastavením vám proto usnadní další pomocník, který domluví veškeré parametry šifrovaného spojení za vás. V IPsec Tools k tomu slouží program racoon.

Jak IPsec nastavit

Každý z obou uvedených programů (setkey a racoon) mají vlastní konfigurační soubor. Navíc potřebujete ještě třetí konfigurační soubor s hesly. Nebudu to příliš rozebírat, vložím sem přímo ukázku konfiguračních souborů s potřebnými komentáři. Bude-li vám připadat, že je ukázka příliš stručná, najděte si na internetu nějaký článek o nastavení IPv4 - najdete jich více než dost. Hlavním záměrem tohoto článku bylo upozornit na snadnost a přímočarost nastavení IPsec v IPv6 síti, ne detailní rozbor konfigurace.

Součástí ukázky jsou dva šifrované tunely, jeden v režimu transport mezi dvěma konkrétními počítači, druhý pak v režimu tunnel mezi dvěma sítěmi. Konfigurace na protějším routeru vypadá stejně, pouze adresy jsou zrcadlově přehozené.

Propojovat budeme síť 2001:db8:a::/48 (síť A) a 2001:db8:b/48 (síť B), pro transport pak přibereme i počítač s adresou 2001:db8:c::1. Routery mají adresy 2001:db8:a::1 a 2001:db8:b::1.

/etc/racoon/racoon.conf

path pre_shared_key "/etc/racoon/psk.txt";

# Racoon bude poslouchat na této adrese
# Máte-li nastavené i IPv4 adresy, můžete uvést i ty.
listen {
    isakmp          2001:db8:a::1;
}

# Slovem 'anonymous' se nastavují defaultní parametry. 
# Jednotlivá spojení se budou odkazovat na tuto část
remote anonymous {
    exchange_mode   main;
    generate_policy on;
    proposal {
        encryption_algorithm    3des;
        hash_algorithm          md5;
        authentication_method   pre_shared_key;
        dh_group                modp1024;
        }
}

# Tato SA se použije pro všechna spojení, nejsou-li pro spojení
# nastavené jiné parametry
sainfo anonymous {
    pfs_group                   modp768;
    encryption_algorithm        3des;
    authentication_algorithm    hmac_md5;
    compression_algorithm       deflate;
}

# Seznam počítačů (routerů), se kterými navazujeme spojení 
# pro výměnu klíčů a nastavení parametrů linky
remote 2001:db8:b::1  inherit anonymous { }
remote 2001:db8:c::1  inherit anonymous { }

/etc/racoon/setkey.conf

#!/sbin/setkey -f

flush;
spdflush;

# tunel do sítě B
# Na prvním řádku jsou sítě, mezi kterými se komunikuje,
# na druhé řádku jsou uvedené IP adresy routerů. Ty
# zabezpečují síťový provoz, hlavičky jsou nastavené na
# tyto IP adresy

# Politika pro odchozí pakety
spdadd 2001:db8:a::1/48 2001:db8:b::1/48 any -P out ipsec
    esp/tunnel/2001:db8:a::1-2001:db8:b::1/require ;

# Politika pro příchozí pakety
spdadd 2001:db8:b::1/48 2001:db8:a::1/48 any -P in ipsec
    esp/tunnel/2001:db8:b::1-2001:db8:a::1/require ;

# transport na host C
# Nastavení je podobné jako v režimu tunnel
# Nastavení hraničních routerů chybí, není potřeba,
# protože hlavičky IP paketu zůstávají původní, adresy se nemění

# Politika pro odchozí pakety
spdadd 2001:db8:a::1/48 2001:db8:c::1/48 any -P out ipsec
    esp/transport//require ;

# Politika pro příchozí pakety
spdadd 2001:db8:c::1/48 2001:db8:a::1/48 any -P in ipsec
    esp/transport//require ;

/etc/racoon/psk.txt

2001:db8:a::1    heslo_pro_router_A
2001:db8:c::1    heslo_pro_pocitac_C

V souboru racoon.conf si všimněte konstrukcí uvedených jako anonymous. Jejich pomocí se nastaví defaultní hodnoty - v žádném jiném návodu jsem zatím takto provedenou konfiguraci neviděl. Díky této konfiguraci oceníte snadnost nastavení, máte-li šifrovaných spojení větší množství. Potom vám stačí zadávat pouze řádek "remote 2001:db8:b::1 inherit anonymous {}", heslo, a zhruba čtyři řádky do souboru s politikami (setkey.conf).