Iptables - stavový firewall (4)

Napsal O webu (») 25. 9. 2006 v kategorii Operační systémy, přečteno: 3956×

Dnes se naučíme, jak z internetu zpřístupnit počítač ve vnitřní síti. Dosud jsme si jenom ukazovali, jak propůjčit veřejnou adresu, ale v každém případě musel navazovat spojení vždy počítač ve vnitřní síti. Způsoby, jak zařídit, aby mohl navazovat do naší vnitřní sítě spojení počítač z internetu, si představíme dva. Prvním je jednodušší přesměrování portů. Druhým způsobem pak je přesměrování adresy.

Přesměrování portů

Tato technika teoreticky funguje velmi jednoduše. Pokud na náš server přijde nějaký packet na určitý port, firewall provede DNAT a tedy přepošle packet na počítač ve vnitřní síti. My musíme jen nastavit, který port chceme přesměrovat a kam packet přepošleme. Z minulého dílu víme, že pravidla pro DNAT budeme vkládat do PREROUTING řetězce. Firewallem pak projde už pozměněný packet. Představme si tedy situaci, kdy chceme mít ve vnitřní síti webserver. Ten poběží na stroji s IP adresou 192.168.1.2 na portu 80. Pokračovat budeme v nastavení skriptu z minulého dílu. Pravidlo pro PREROUTING bude znít následovně:

LAN_IP_X="192.168.1.2"

$IPTABLES -t nat -A PREROUTING -p tcp -d $INET_IP --dport 80 -j DNAT --to $LAN_IP_X:80


Pozornější čtenář si ale říká, že to není všechno. Pozměněný packet totiž ještě musíme předat z jednoho rozhraní na druhé a to máme nyní povolené jenom pro navázané spojení. A jelikož toto spojení ještě není navázané, musíme do řetězce FORWARD přidat následující pravidlo:

$IPTABLES -A FORWARD -i $INET_IFACE -o $LAN1_IFACE -p tcp -d $LAN_IP_X --destination-port 80 -j ACCEPT

Tímto řetězcem tedy povolíme předání našeho přesměrovaného packetu mezi rozhraními. Po znovunačtení pravidel již můžeme přistupovat na webserver ve vnitřní síti. Tato technika má ale jedno omezení. Co když chceme těch webserverů ve vnitřní síti mít více? Pak bychom museli na serveru přesměrovávat port 80 pro jeden webserver, třeba port 81 pro druhý webserver atd. Cílový port přesměrování může zůstat stejný, tzn. webservery ve vnitřní síti mohou všechny běžet na portu 80. Co ale máme dělat, pokud bychom nechtěli webservery od sebe rozlišovat číslem portu na vnějším rozhraní? Pokud jsme vlastníky více veřejných IP adres, nabízí se nám dvě možnosti. Můžeme analogicky přesměrovávat porty i na ostatních adresách, přičemž se nám webservery rozliší podle veřejné adresy. Nebo můžeme využít obecnější řešení a tím je přesměrování celé adresy.

Přesměrování adresy

Tato technika má širší využití než přesměrování portů. Můžeme ji využít třeba v případě, pokud nevíme, jaké porty máme přesměrovat (nevíme předem, které služby na cílovém počítači poběží). Teoreticky si představit pravidlo je opět jednoduché - jakýkoliv packet, který příjde na danou veřejnou adresu, přepošleme na daný počítač ve vnitřní síti. To provedeme následujícím pravidlem:

$IPTABLES -t nat -A PREROUTING -p all -i $INET_IFACE -d $INET_IP_X -j DNAT --to $LAN_IP_X

Přičemž INET_IP_X specifikuje přesměrovávanou veřejnou adresu a LAN_IP_X cílový počítač. Samozřejmě musíme opět povolit předání všech žádoucích packetů mezi rozhraními:

$IPTABLES -A FORWARD -d $LAN_IP_X -p all -j ACCEPT

Posledním krokem pak bude přidělení veřejné IP adresy počítači ve vnitřní síti. Pokud by tomu tak nebylo, pak by se využila naše stávající IP maškaráda. Ve výsledku by uživatel v internetu chtěl přistoupit na náš webserver (na INET_IP_X), ale ten by odpovídal z jiné adresy (z INET_IP) a uživatel by nemohl navázat spojení. Přidělení veřejné IP adresy provedeme pravidlem:

$IPTABLES -t nat -A POSTROUTING -s $LAN_IP_X -o $INET_IFACE -j SNAT --to $INET_IP_X

Od tohoto momentu můžeme přistupovat z internetu k počítači ve vnitřní síti, jakoby mu patřila veřejná adresa. Velmi pozorný čtenář si všimnul jednoho nedostatku. Co kdyby chtěly k našemu počítači s veřejnou IP adresou přistupovat i ostatní počítače ve vnitřní síti? Ostatní počítače by se mohly odkazovat na neveřejnou adresu. Ale to mnohým službám nestačí. Typickým příkladem jsou herní servery. Na našem počítači s přesměrovanou adresou založíme hru, naše IP adresa se zapíše na herní server (bude tam tedy zapsaná přesměrovaná veřejná IP adresa). Druhý počítač v naší vnitřní síti kontaktuje herní server, zjistí veřejnou adresu založené hry a má problém. Pokud se snaží k veřejné adrese přistoupit, dojde k následujícímu: packet je odeslán na naši výchozí bránu, kde ale náš PREROUTING neproběhne, protože je nastaven jenom směrem z internetu. Protože neproběhne PREROUTING, packet zjistí, že byl na cílovou adresu doručen (protože adresa, na kterou se snaží připojit, je ve skutečnosti IP adresa serveru). Náš server mu ale samozřejmě spojení odmítne, protože tam hra založená není. Co s tím?

Řešením je použít PREROUTING i na cestu z vnitřní sítě ven. Pokud zjistíme, že nějaký počítač vnitřní sítě chce přistoupit na přesměrovanou veřejnou adresu, přepošleme jeho packet na daný počítač ve vnitřní síti (tj. ten, na který veřejnou adresu přesměrováváme). To zapíšeme jednoduchým pravidlem:

$IPTABLES -t nat -A PREROUTING -p all -i $LAN1_IFACE -d $INET_IP_X -j DNAT --to $LAN_IP_X

Tedy modifikujeme cílovou adresu packetu na náš počítač se založenou hrou. Představme si tedy cestu packetu od počítače ve vnitřní síti, který se snaží připojit na přesměrovanou veřejnou adresu. Od počítače putuje packet na výchozí bránu, tam je packet přesměrován zpět do vnitřní sítě na počítač se založenou hrou. Tam je packet přijat a odpověď na něj je zaslána na zdrojovou adresu packetu. A ta je jaká? Stále z vnitřního rozsahu. To znamená, že odpověď je odeslána počítači přímo. Co to pro něj znamená? Poslal packet na jednu adresu, ale odpovědi se mu dostalo z jiné adresy. Co s tím?

Řešením je použití POSTROUTING pro packety, které mají adresy vnitřní sítě a které navíc směřují ze serveru na počítač se založenou hrou. Tedy měníme zdrojovou adresu příslušných packetů. Zdrojovou adresu můžeme nastavit teoreticky na cokoliv (samozřejmě co není z rozsahu naší vnitřní sítě). Pravidlo bude vypadat takto:

$IPTABLES -t nat -A POSTROUTING -d $LAN_IP_X -s $LAN1 -o $LAN1_IFACE -j SNAT --to $LAN1_IP

Zaměňujeme tedy zdrojovou adresu packetu a nahrazujeme ji adresou vnitřního rozhraní serveru (třeba).

Jak tedy packet putuje? Počítač ve vnitřní síti zašle packet na přesměrovávanou veřejnou adresu. Packet dorazí na výchozí bránu (tj. náš server), kde se mu změní jak zdrojová, tak cílová adresa. Odtud tedy putuje na počítač ve vnitřní síti se založenou hrou. Ten packet přijme a zašle odpověď na jeho zdrojovou adresu, tj. v našem případě adresa serveru. Odpověď tedy putuje zpět na server, kde je packetu zpět nahrazena zdrojová a cílová adresa (inverzní tabulky SNAT a DNAT). Ze serveru si to packet namíří přímo k počítači, který požadavek zaslal.

Nyní je již všechno funkční a můžeme se na přesměrovávanou veřejnou adresu odkazovat odkudkoliv. Nakonfigurovaný firewall, který umí přesměrovávat veřejné adresy, si můžete stáhnout zde. Tento firewall vychází z konfigurace M. Petříčka a upravil jsem jej tak, ať lze přesměrování adres jednoduše přidávat zapsáním nové adresy do pole. Ve skriptu se už přesměrování adres nastaví samo pomocí cyklů.


Závěr

V tomto dílu jsme se naučili dvě techniky a to přesměrovávaní portů a přesměrovávání adresy. Přesměrování portů je technika poměrně jednoduchá, ale má také své omezení. Přesměrování adresy je technika značně komplexnější, její nastavení je ale o to složitější. Vysvětlili jsme si všechna zákoutí, která mohou na vás při přesměrovávání čekat.
Autor: Radim Poloch

Štítky: iptables
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel tři a dvě