Lekce 3 - SSH - TCP tunelování
V minulé lekci, SSH - Instalace a nastavení serveru, jsme nainstalovali a nastavili SSH server na operačních systémech Linux a Windows.
V předchozích dílech jsme si vyzkoušeli základní konfiguraci SSH serveru i klienta a jak navázat spojení. Co známe teoreticky stačí k běžnému použití, byla by ale škoda nevyužít některé pokročilé možnosti. Dnes se podíváme na tunelování.. Pokud používáte cygwin, použijte návody pro Linux.
TCP Tunelování
Prozatím jsme SSH používali jen k připojení k serveru - jako terminál. Kromě toho můžeme ale SSH server využít i jako tzv. tunel. V praxi to znamená, že všechny přenosy provedené skrze tunel nepůjdou přímo k cíli, ale nejdřív na SSH server. Ukážeme si to na příkladu odeslání dat. Chceme poslat data na nějaký server.. Pokud to uděláme přes tunel, data se ve skutečnosti pošlou prvně na SSH server (tedy v zašifrované podobě) a až pak budou odeslána na cílový server.
Tunel je realizován přesměrováním portů (port forwarding), ale lze jej také využít v kombinaci se SOCKS proxy (o tom později). Port forwarding, jak už název napovídá, v praxi znamená, že pošlu data portem A na SSH server a ten je přepošle na cílový server na port B. Lze jej bez problému nastavit pro oba směry a mít tak plnohodnotný tunel.
A k čemu vlastně to TCP tunelování je? Zmínil bych dvě situace... Zaprvé. Není vůbec neobvyklé, že zaměstnavatel/škola blokují určité servery, popř. rovnou celé porty. Nebo provoz sledují a přístup k určitým službám může být tvrdě penalizován. Co s tím? My už odpověď známe.. Jednoduše si komunikaci přesměrujeme přes nějaký SSH server. Je zakázán port 12451 (což může být třeba port nějaké hry)? Nevadí - pošleme si to třeba přes 16455. Toto se navíc špatně sleduje a blokuje, takže to většina správců vůbec neřeší. Druhá situace je použití veřejného připojení - například někde v kavárně. Nikdy nevíte, kdo poslouchá (a odposlechnout data z veřejné sítě je otázka chvilky). Použitím tunelu si vlastně vytvoříme šifrované spojení a podstatně tím zvýšíme bezpečnost dat, které chceme přenést.
Lokální port forwarding
Přesměrování lokálního portu na vzdálený port. K použití je třeba na SSH serveru nastavit atribut AllowTcpForwarding.
Linux a Mac
Pro zapnutí lokálního port forwardingu, musíte před příkaz ssh přidat přepínač -L. Zde je příklad příkazu:
$ ssh -L 9000:mailserver.com:25 remoteuser@remotehost
Příkaz přesměruje lokální port 9000 na vzdálený port 25 serveru mailserver.com. Nyní když se připojíte v emailovém klientovi na svůj mailový účet na serveru mailserver.com, budou se všechny maily odesílat (ne příjmat) přes šifrovaný tunel. Pamatujte, že na linuxových SSH serverech nemůžete jako lokální port (zde 9000) použít bez rootovských práv port nižší než 1024.
Windows
V PuTTY běžte do sekce SSH->Tunnels. Do položky Source port zadejte lokální port, do Destination server a port, na které chcete přesměrovávat. Tunel vytvoříte kliknutím na Add a můžete jich vytvořet více. Tunel se otevírá tlačítkem Open.
![SSH](images/11998/ssh/dil_3/putty_tunnel1.png)
Vzdálený port forwarding
Vzdálený port forwarding se používá přesně opačným způsobem. Například jste za routerem s NAT a potřebujete někomu ukázát svůj výtvor, co máte pouze na lokálu. Můžete použít právě vzdálený port forwarding. Port na SSH serveru se použije jako forward port na váš lokální port. Podmínka je explicitní povolení na serveru (u OpenSSH volba GatewayPorts).
Linux a Mac
Na Linuxu a Macu se vzdálený port forwarding používá následujícím způsobem, přepínačem -R :
$ ssh -R 9000:localhost:80 remoteuser@remotehost
Nyní, když v prohlížeči zadáte URL http://remotehost:9000, zobrazí se hlavní stránka vašeho lokálního HTTP serveru (pokud nějaký máte, pokud ne, zobrazí se chyba prohlížeče). Zase jako u lokálního port forwardingu, první hodnota (zde 9000), nesmí být bez root práv nižší než 1024.
Windows
V PuTTY běžte opět do sekce SSH->Tunnels. Do položky Source port napište port, který chcete použít na vzdáleném serveru a do pole Destination napište localhost:port, kde port nahraďte portem vaší lokální služby, na kterou se bude přesměrovávát. Dole zaškrtněte místo Local Remote, a klikněte na Add.
![SSH](images/11998/ssh/dil_3/putty_tunnel2.png)
SOCKS Proxy
Jedná se o transparetní HTTP forwarder, který existuje k tomu, aby předával síťový provoz mezi klientem a serverem. V zásadě to funguje tak, že pošlete požadavek na webovou stránku - ten jde ale prvně na SSH server (skrze TCP tunel). SSH server pak pošle požadavek na cílový server a přijme odpověď, kterou zase odešle zpátky nám. Webovou stránku tak v zásadě "prohlíží" SSH server, ale obsah vidíme my. Je to jednodušší, než manuálně vytvářet tunel, ale je potřeba podpora ze strany SSH serveru. Námi používané OpenSSH ji má.
Linux a Mac
Tunelové SOCKS proxy vytvoříte příkazem :
$ ssh -D 9999 remoteuser@remotehost
Příkaz vytvoří tunelované SOCKS proxy na lokálním portu 9999. Nyní si například SOCKS proxy můžete nastavit ve Firefoxu, a to s nastavením localhost na port 9999. Port můžete samozřejmě libovolně měnit.
![SSH](images/11998/ssh/dil_3/socks_ff.png)
Windows
V PuTTY opět běžte do sekce SSH->Tunnels. Do položky source port napište port SOCKS proxy, které bude lokálně vytvořeno. Změnte přepínač na Dynamic, a klikněte na Add. Poté se můžete připojit. SOCKS proxy potom můžete nastavit v Firefoxu, s detaily localhost a portem, kterým jste zadali v nastavení.
![SSH](images/11998/ssh/dil_3/putty_tunnel3.png)
Přehled přepínačů
Dnes jsme si ukázaly tři nové přepínače SSH.
-L | Local, vytvoření lokálního port forwardingu |
-R | Remote, vytvoření vzdáleného port forwardingu |
-D | Dynamic, vytvoření SOCKS proxy spojení |
Když použijete příkazy, které jsme si ukázali, budou vypisovat otravné hlášky a otevírat nový shell, které ovšem při vytváření tunelu nepotřebujeme. Naštěstí exitují přepínače, které toto nastavují..
-N | neobjeví se výzva k přihlášení |
-n | zabrání čtení znaků ze stdin |
-T | zabrání otevření terminálu |
Ideálně tedy můžeme spouštět příkazy následovně:
$ ssh -L -nNT 9000:mailserver.com:25 remoteuser@remotehost
Takhle SSH vůbec neotevře terminál ani nic nevypíše, jen provede
příkaz, co jsme chtěli. Aby to fungovalo, musíte se ovšem autorizovat
klíčem (o tom si povíme příště). Pokud na server přistupujeme pomocí
hesla, logicky ho musíme nějak zadat..
To je pro dnešek vše. Příště se podíváme na klíče - co to je, jak to funguje a k čemu se to dá použít.