Hlavní navigace

Tuneluji, tuneluješ, tunelujeme: IPSec

17. 7. 2003
Doba čtení: 5 minut

Sdílet

Další možností, jak vytvořit tunel mezi dvěma sítěmi, je IPSec. To je podstatně mocnější technologie. Nejen, že vytvoří tunel, ale zároveň sama nastaví routing a hlavně umí zajistit šifrování přenášeného provozu.

Její nasazení ale není úplně bezproblémové. Tím prvním, na co narazíte, je fakt, že IPSec není standardní součásti kernelu řady 2.4. Některé distribuce ho v jádru přesto mají (SuSE, Mandrake, Debian), jinde však musíte patchovat kernel sami. Jádra řady 2.5 již mají IPSec podporu standardně zabudovanou. Tedy, přesněji řečeno, mají podporu IPv6, které IPSec obsahuje automaticky. Ale nebojte se, i tento IPSec lze používat v IPv4 sítích.

Dále ještě potřebujete balík programů pro práci s IPSec. Ten buď najdete ve své distribuci (v Debianu balík freeswan), nebo je, stejně jako patch do kernelu, dostupný na strákách projektu: www.freeswan.org.

Nyní se trochu podíváme na konfiguraci IPSecu. Konfigurace samotná je obsažena v souboru /etc/ipsec.conf. Na počátku jsou globální nastavení:

config setup
    interfaces=%defaultroute
    klipsdebug=none
    plutodebug=none
    plutoload=%search
    plutostart=%search
    uniqueids=yes

Zde se nastavují ladící výpisy a také, která IPSec spojení se mají automaticky navazovat po startu IPSecu. (Výchozí nastavení toto nechává podle nastavení u jednotlivých spojení.)

Důležitou položkou globální konfigurace je interfaces. V nastavení výše se říká, že IPSec má používat zařízení, přes které jde default route – zjednodušeně řečeno, zařízení, kterým odchází packety do internetu. Toto nastavení je také ve většině případů správné. V některých situacích budeme chtít používat IPSec na jiném zařízení nebo na více zařízeních. Toho dosáhneme nastavením:

interfaces=ipsec0=eth1

případně:

interfaces="ipsec0=eth1 ipsec1=ppp0"

Dále již následují samotné definice tunelu. Definici tunelu si zde postupně po řádcích rozebereme. Nejprve je jméno tunelu:

conn centrala-pobocka1

Dále vidíte definici „levého“ konce tunelu – jeho IP a podsíť, která se za ním nachází:

left=123.45.67.90
leftsubnet=192.168.0.0/16

Stejně tak následuje definice pro pravý konec tunelu:

right=123.45.67.80
rightsubnet=192.168.1.0/24

Zde bych se na chvíli zastavil. Jak vidíte, IPSec opravdu definuje propojení sítí – v konfiguraci se mu předkládá definice sítí, které má spojovat, a vnější IP routerů. Tedy vše je v konfiguraci a kromě speciálních případů se nemusí po konfiguraci tunelu nic měnit, IPSec má dostatek informací, aby vše zajistil sám. Jak jste si možná všimli, používám i v tomto příkladu síťovou konfiguraci firmy použitou už přivysvětlování GRE v minulém dílu.

Dále je pěkné, že se nerozlišuje místní a vzdálený konec tunelu. V definici se pouze určí „levá“ a „pravá“ strana tunelu. IPSec automaticky pozná, na které „straně“ se nachází počítač, na němž je spuštěn. Tak může být konfigurace tunelu na obou koncích stejná, což snižuje chybovost při konfiguraci.

Nyní řekneme IPSecu, jaké budeme používat klíčování. IPSec umí buď manuální, kde se klíč jednou nastaví a šifruje se jím veškerá komunikace, nebo automatické, kdy se klíč použije pouze pro navázání spojení a následně se vygenerují a používají náhodné klíče, které se v pravidelných intervalech obměňují. Automatické klíčování ztěžuje rozšifrování komunikace při úniku klíče a doporučuji jej používat. Nastavíme jej direktivami:

authby=rsasig
leftrsasigkey=0sDJ9jdDFJ390FJjf3m...
rightrsasigkey=0sMof9dfj2/fwedf...

Klíče získáme tak, že na levém počítači zadáme příkaz:

ipsec showhostkey --left

a na pravém:

ipsec showhostkey --right

a výstupy těchto příkazů zkopírujeme do konfigurace. Pozor při kopírování, abychom zkopírovali celé klíče (stejně tak při přenášení konfigurace na druhý stroj systémem copy&paste je toto častý problém). Pokud nemáme host key (většinou se vytváří už při instalaci balíku), vytvoříme si ho příkazy:

ipsec newhostkey --output /etc/ipsec.secrets --hostname muj.pocitac.cz
chmod 600 /etc/ipsec.secrets

Následující direktiva určuje, co se s tunelem bude dít při startu IPSecu:

auto=start

Pokud uvedeme auto=add, IPSec si po (re)startu nahraje do paměti definici tunelu. Pokud uvedeme auto=start, pokusí se navíc tunel nastartovat. Tak to bude nastaveno u většiny odladěných tunelů. Nyní můžeme nastartovat IPSec pomocí skriptu v /etc/init.d a doufat, že vše bude fungovat. Já však spíše radím postupné oživování:

Nejprve se ujistíme, že nebude problém s firewally. IPSec potřebuje pro své fungování, aby na oba počítače docházely UDP packety na port 500 a dále packety s IP protokoly číslo 50 a 51.

Pak podle příkladu výše vytvoříme konfiguraci v /etc/ipsec.conf a rozkopírujeme ji na oba stroje. Nic nerestartujeme. Zadáme příkaz:

ipsec auto --add centrala-pobocka1

na obou počítačích. Rozebereme si příkaz:

  • ipsec – Příkaz pro práci s IPSecem.
  • auto – Budeme pracovat s tunelem s automatickým klíčováním
  • –add centrala-pobocka1 – Chceme přidat (nahrát) do paměti tunel tohoto jména

Potom můžeme zadat příkaz ipsec auto –status, který nám vypíše tunely nahrané v paměti a jejich stavy.

Nyní nadešel čas tunel spustit. To se provede příkazem ipsec auto –up centrala-pobocka1. Příkaz stačí zadat na jednom počítači, na druhém se tunel nastartuje sám, musí ale být nahrán v paměti. Projde-li všechno v pořádku, uvidíme výstup podobný tomuto:

gw:/etc# ipsec auto --up centrala-pobocka1
104 "centrala-pobocka1" #3: STATE_MAIN_I1: initiate
106 "centrala-pobocka1" #3: STATE_MAIN_I2: sent MI2, expecting MR2
108 "centrala-pobocka1" #3: STATE_MAIN_I3: sent MI3, expecting MR3
004 "centrala-pobocka1" #4: STATE_MAIN_I4: ISAKMP SA established
112 "centrala-pobocka1" #4: STATE_QUICK_I1: initiate
004 "centrala-pobocka1" #4: STATE_QUICK_I2: sent QI2, IPsec SA established

Funkčnost tunelu můžeme zkontrolovat opět pomocí ipsec auto –status. Funkční tunel má v (trochu nepřehledném) statutu napsáno IPsec SA established a ISAKMP SA established.

Pokud se spojení nenavazuje, uvidíte následující:

gw:/etc# ipsec auto --up centrala-pobocka1
104 "centrala-pobocka1" #2: STATE_MAIN_I1: initiate
010 "centrala-pobocka1" #2: STATE_MAIN_I1: retransmission; will wait 20s for response
010 "centrala-pobocka1" #2: STATE_MAIN_I1: retransmission; will wait 40s for response
010 "centrala-pobocka1" #2: STATE_MAIN_I1: retransmission; will wait 40s for response
...

Je možné, že neprocházejí packety na UDP port 500 v jednom směru. Zkuste předchozí příkaz zastavit a dát ipsec auto –up centrala-pobocka1 na druhém počítači. Je rovněž možné, že jste při přenosu konfigurace udělali chybu. Pokud ano, tento příkaz ji vypíše. Chybu v konfiguraci je nutné opravit. Ale nestačí pouze změnit soubor. Je nutné pomocí:

root_podpora

    ipsec auto --delete centrala-pobocka1
    ipsec auto --add centrala-pobocka1

znovu nahrát konfiguraci do paměti IPSecu. Nyní můžeme zkusit celý proces znovu.

Pokud tunel naběhne, měl by projít PING mezi počítači z obou sítí (opět, stejně jako u GRE, pozor na firewally). Záměrně říkám počítači obou sítí, protože PING mezi konci tunelu neprojde, proto je potřeba trochu upravit routing. O tom ale až příště.

Byl pro vás článek přínosný?