Přelez, přeskoč a podlez NAT

20. 6. 2006
Doba čtení: 3 minuty

Sdílet

Hlavním problémem IPv4 sítích je malý adresní prostor, který nedovoluje každému počítači přidělit jeho vlastní veřejnou IP adresu. To přináší problém v případě, že chcete propojit dva počítače, které jsou za překladačem adres (NAT). I tady ovšem existuje snadné řešení.

Většina poskytovatelů připojení pro domácnosti veřejné IP adresy automaticky nepřiděluje. Někdy stačí požádat, jindy je potřeba si připlatit. Jsou ovšem i takoví poskytovatelé, kteří vás odmítnou s tím, že veřejné IP adresy prostě nemají.

Ano, na běžné surfování, vybírání pošty a Jabber samozřejmě veřejnou nepotřebujete a NAT vám poslouží velmi dobře. Co když ale potřebujete nějak jednoduše přenášet soubory, opravit kamarádovi na dálku nastavení jeho počítače, případně si chcete zahrát nějaké hry?

Existuje pochopitelně možnost využít jiný stroj, který veřejnou IP má a sestavit přes něj třeba VPN. Ne každý ovšem má podobné zázemí k dispozici a pokud nepracujete jako admin, těžko něco takového seženete. Existuje ovšem jednodušší řešení. Jmenuje se nat-traverse.

nat-traverse

Název nat-traverse se skládá ze slov NAT a traverse. NAT je zkratka pro Network Address Translation, což znamená překlad síťových adres. Traverse je anglické slovo, které znamená překročit, zkřížit a přetnout. Z toho plyne, že nat-traverse je program pro překročení NAT.

Instalace

Je možné, že nat-traverse najdete v repozitářích své oblíbené distribuce. Pokud tomu tak není, nemusíte zoufat. Jedná se o jednoduchý perlový skript, který využívá jen základních modulů a není jej potřeba nijak kompilovat ani složitě instalovat.

Stačí tedy do systému nainstalovat Perl (5.6.1 a vyšší) a pak ze stránky projektu stáhnout jeden soubor se skriptem. To je celá instalace.

Jak to funguje?

Princip, kterým program sestavuje spojení na NAT je poměrně jednoduchý, popíšeme si jej postupně v několika krocích. Nejprve schéma naší sítě:

PC1 ---- NAT1 ------ internet ------ NAT2 ---- PC2

Našim cílem je tedy vytvořit stabilní spojení mezi PC1 a PC2, které jsou za překladači adres NAT1 a NAT2, nad kterými nemáme žádnou kontrolu. Pokud bychom ji měli, bylo by snadné nastavit třeba port forwarding. My ovšem předpokládáme, že NAT1 a NAT2 jsou v rukou našich providerů.

Program je potřeba pustit na obou počítačích a zadat mu adresu NATu na druhé straně. Kromě toho je potřeba mu předat čísla místního a vzdáleného UDP portu. Vše totiž probíhá na UDP.

root@pc1# nat-traverse 4000:ip_nat2:4001

root@pc2# nat-traverse 4001:ip_nat1:4000

Místo ip_nat1 a ip_nat2 samozřejmě doplníme adresy protějších NATů, aby program věděl, kam musí směřovat svou komunikaci.

Celý postup je tedy následující:

  1. PC1 odešle náhodná data v podobě UDP paketu na NAT2. Ten samozřejmě ví, že žádná komunikace neprobíhá, a tak pakety zahodí.
  2. PC2 pošle náhodná data na NAT1. Ten si ovšem myslí, že se jedná o odpověď na první pakety, protože přicházejí od NAT2. Proto je NAT1 doručí až k PC1.
  3. PC1 opět pošle paket na NAT2. Teď si i NAT2 myslí, že se jedná o odpověď na paket z druhého kroku a tak data předá k PC2.

A je hotovo, oba NATy se domnívají, že jde o regulérní komunikaci s druhou stranou. Podle NAT1 komunikuje PC1 se strojem NAT2 a naopak. V tuto chvíli tedy existuje UDP most mezi PC1 a PC2. Informace z něj jsou k dispozici na standardním vstupu/výstupu net-traverse. Můžeme jej tedy použít třeba k jednoduchému přímému chatu. To by nám mohlo stačit k posílání jednoduchých dat, ale my bychom samozřejmě měli raději plnohodnotné spojení.

Spojení s pomocí pppd

nat-traverse umožňuje s pomocí parametru --cmd="příkaz" spustit po stabilizaci spojení libovolný příkaz, který pak může využít standardního vstupu/výstupu k posílání dat na druhou stranu.

My potřebujeme něco, co nám přes jeden jednoduchý komunikační kanál sestaví kompletní TCP/IP spojení. Pro tyto účely je přímo napsán démon pppd, vždyť přes telefonní linku můžeme také posílat data jako přes nat-traverse a ony nám ze sériového portu na druhé straně ve stejném pořadí vypadávají.

Proto zavoláme program na obou stranách s novými parametry:

ict ve školství 24

root@pc1# nat-traverse --cmd="pppd updetach noauth passive notty ipparam vpn 10.0.0.1:10.0.0.2" 4000:ip_nat2:4001

root@pc2# nat-traverse --cmd="pppd nodetach notty noauth" 4001:ip_nat1:4000

pppd se bude chovat dle očekávání a vytvoří nám nové spojení ppp0 s námi zvolenými IP adresami. V tu chvíli už se jedná o plné TCP/IP, přes které můžeme normálně bez omezení komunikovat třeba se SSH serverem na druhé straně nebo prostě jak je libo.

Závěr

V době, kdy se IPv6 příliš neprosazuje, je net-traverse jedním z nejjednodušších způsobů, jak propojit dva počítače za „neproniknutelnou” hradbou neochotného providera. Výborně se přes něj paří třeba BZflag.

Máte u domácího providera veřejnou IP?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.