Tuneluji, tuneluješ, tunelujeme: přesměrování portů

2. 7. 2003
Doba čtení: 4 minuty

Sdílet

V následující sérii článků probereme různé metody přesměrovávání toku dat v sítích. Začneme jednoduchým přesměrováním portů a skončíme až u vytváření VPN pomocí šifrovaných tunelů.

Přesměrovávání

Občas není nutné zavádět přímo tunelování, postačí přesměrování portů (port forwarding). To jest: Aplikace si myslí, že se spojuje na port P1 na počítači C1, ale data tohoto spojení jsou na onom počítači odchycena a poslána „tunelem“ na druhý počítač. Otamtud vede druhé spojení, které data dopraví na port P2 počítače C2. Lépe to ukazuje následující obrázek:



Přesměrování portů pomocí SSH

Nejprve se podíváme na přesměrování pomocí SSH. Příkaz ssh má nepovinné parametry:

-L port1:host2:port2

a

-R port1:host2:port2

Je-li zadán některý z nich, začne ssh po vytvoření spojení poslouchat na TCP portu port1. Je-li zadán parametr -L, poslouchá na počítači, ze kterého se spojujete (lokálním), je-li zadán -R, poslouchá na počítači, na nějž se spojujete (vzdáleném). Pokud na dotyčný port přijde spojení, SSH ho protuneluje svým šifrovaným kanálem („vedle“ normálního přenosu příkazů) a z počítače na druhém konci tunelu (v případě -L vzdáleného, u -R lokálního) se spojí na port port2 počítačehost2. K čemu to může být dobré?

Podívejte se na následující obrázek:


Představte si, že jste doma na počítači Poc1. Ve firmě máte na počítači Poc2 SSH konto a na počítači Poc3 poštu přístupnou přes POP3. Chcete mít ke své poště přístup i z domova, a to i offline, tedy si ji chcete stahovat k sobě. Pokud použijete obyčejné POP3, půjde vaše heslo přes celý internet v otevřené podobě a navíc POP3 port počítače Poc3 nemusí být zvenku vůbec dostupný. Proto můžete zadat příkaz:

lemming@Poc1:~$ ssh -L pop3:Poc3:pop3 Poc2

Po dobu, po kterou bude aktivní toto spojení, můžete z firmy stahovat poštu připojením se na „pop3 server“ na vašem lokálním počítači. Heslo půjde po Internetu zašifrované v SSH kanálu.

Další příklad:



Váš správce sítě zakazuje přístup na některé weby (třeba root.cz ;-). Ale máte povolen SSH přístup ven na počítač Poc2 a na portu 3128 počítače Poc3 běží proxy server, který můžete využívat. Zadáte tedy příkaz:

lemming@Poc1:~$ ssh -L 3128:Poc3:3128 Poc2

Pak stačí v browseru nastavit jako proxy servery localhost:3128 a můžete browsit bez omezení. Zde také vidíte první příklad opravdového „tunelování“ – vytvořeným tunelem projdete omezením (například firewallem) jako nůž máslem.

Užitečnou a v praxi často využívanou možností tunelování přes SSH je tunelování XWindows spojení. XWindows umí už „od přírody“ zobrazovat aplikaci na jiném počítači, než na kterém běží. Bohužel, data takto přenášená po síti nejsou nijak zabezpečena proti odposlechu a/nebo manipulaci. Proto se velmi hodí přepínač -X příkazu ssh. Zadáte-li (z XWindows, t.j. třeba z xtermu nebo rxvt):

lemming@Poc1:~$ ssh -X Poc2

budou všechny X aplikace, spuštěné z tohoto spojení na vzdáleném stroji, zobrazovány na vaší obrazovce. Data budou přenášena SSH tunelem a budou tedy zajištěna proti odposlechu i proti manipulaci. Toto nastavení si můžete zapnout jako implicitní pomocí direktivy ForwardX11 yes v souboru ~/.ssh/config. Jen bych chtěl upozornit, že tunelování XWindows spojení je možné zakázat nastavením serveru, proto přepínač nemusí fungovat se všemi počítači.

Na závěr bych jen dodal, že bohužel podle mých zkušeností není přesměrovávání pomocí SSH zcela spolehlivé. Pokud bylo spuštěno, vždy mi po několika dnech spadlo – SSH na portu stále poslouchalo, ale spojení nebylo přenášeno. Možná je tato chyba již opravena, nevím, v poslední době jsem přes SSH nic dlouhodobě netuneloval.

Přesměrování pomocí iptables

Další možností přesměrovávání portů nebo i celých adres je přesměrování pomocí iptables. Příkladem příkazu, který zavede přesměrování, může být třeba:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.5:80

Tento příkaz přesměruje port 80 na lokálním počítači na port 80 počítače 192.168.1.5.  Můžeme to využít například v případě, kdy máme pouze jednu veřejnou adresu a chceme, aby WWW server dostupný zvenku neběžel na firewallu.  Spustíme ho tedy na počítači 192.168.1.5 v de­militarizované zóně a na firewallu nastavíme výše uvedené přesměrování.

Výhodou tohoto způsobu je fakt, že přesměrování lze nastavit nejen pro lokální počítač, ale i pro počítač, jenž je přes firewall pouze routován:

iptables -t nat -A PREROUTING -i eth0 -p tcp -d 123.45.67.89 --dport 80 -j DNAT --to 123.45.67.90:80

Tímto způsobem přesměrujeme pakety jdoucí na port 80 počítače …89 na port 80 počítače …90. Může se nám to hodit třeba v případě, kdy potřebujeme zobrazovat chybovou (informační) stránku po dobu, kdy je počítač …89 dole:


Není cílem tohoto článku být manuálem k iptables, přesto alespoň v krátkosti rozeberu parametry tohoto příkladu:

  • iptables – Příkaz pro manipulaci s iptables
  • -t nat – Budeme pracovat s tabulkou NAT
  • -A PREROUTING – Pravidlo přidáme to řetězce (chainu) PREROUTING
  • -i eth0 – Budeme pracovat pouze s pakety přicházejícími přes zařízení eth0 (vnější) …
  • -p tcp – …používajícími protokol TCP …
  • -d 123.45.67.89 – …jdoucími na počítač s tímto IP …
  • –dport 80 – … na port 80.
  • -j DNAT – Takovýmto paketům přepiš cílovou adresu …
  • –to 123.45.67.90:80 – … na toto IP na port 80.

Těm bystřejším z vás už jistě došlo, že aby vše fungovalo, je nutné přepisovat i zdrojovou adresu paketů, jdoucích opačným směrem. Na to není třeba tvořit pravidlo, to si zajistí iptables samy.

ict ve školství 24

Pokud vynecháme čísla portů, můžeme přesměrovat celý provoz adresy na nějakou jinou, například veřejné IP na počítač v interní síti:

iptables -t nat -A PREROUTING -i eth0 -p tcp -d 123.45.67.80 -j DNAT --to 192.168.1.5

Tím jsme probrali různé možnosti přesměrovávání portů. Existují i jiné aplikace, které jej umožňují, například redir, jejich použití je obdobné jako ve výše uvedených příkladech. Příště se už podíváme na tunelování veškerého síťového provozu.

Autor článku