Úvod > Návody > SSH připojení k počítači za NATem aneb Stavíme reverzní tunel

SSH připojení k počítači za NATem aneb Stavíme reverzní tunel

Často nastává situace, kdy se chceme připojit k počítači, který je za NATem – tj. například routerem, a nemá tak veřejnou IP adresu. To je také nezřídkakdy případ mnoha sdílených sítí od menších poskytovatelů.

Chceme-li pak přenášet data mezi dvěma počítači, z čehož jeden je „schován“, čelíme určitému problému, který je na první pohled neřešitelný. Nicméně řešení existuje a je docela snadné (byť na první pohled pracné).

Elegantně nám pomůže vytvoření tzv. reverzního SSH tunelu.

Obsah

Situace

Máme počítač, ze kterého se chceme přihlásit do počítače za NATem (třeba ve firemní síti). První počítač bude „Doma“, druhý počítač (do kterého se chceme přihlásit) bude „Kancelář“.

(Samozřejmě že první počítač může být váš přenosný, který používáte na cestách, v kavárnách apod., druhý pak domácí schovaný za routerem či neveřejnou IP adresou. Důležité je pochopit princip.)

Co je důležité zmínit, potřebujeme i třetí počítač s veřejnou IP adresou v internetu (Server). Pro vytvoření serveru můžeme využít buď některou ze služeb typu No-IP (zdarma), hostingový server nebo počítač, který vám někdo dá k dispozici (třeba kolega, kamarád či kdokoli, kdo svůj stroj – ať už osobní, nebo serverový nevypíná). Podmínkou samozřejmě je, aby server měl veřejnou/dedikovanou IP adresu a aby na něm běžel SSH server (služba).

Teď k modelové situaci:

  • Počítač, ke kterému se připojujeme (Kancelář), používá pro SSH port číslo P1 (standardně 22, ale kvůli bezpečnosti je lepší port změnit na některý z dynamických portů, viz text o vytvoření SSH: Jak na SSH).
  • Počítač, který používáme v internetu pro vytvoření reverzního tunelu (Server), pro SSH používá jiný port, P2. Pro náš účel teď otevřeme na tomto vzdáleném serveru další port, libovolný z dynamického rozsahu, budeme ho označovat jako P3; podmínkou je, že nesmí být využíván již běžícím procesem – viz předchozí článek.

Postup, jak se připojit k počítači za NATem, sestává ze dvou jednoduchých kroků:

  1. Vytvoření reverzního tunelu mezi počítačem v kanceláři (počítač, ke kterému se chceme přihlašovat) a serverem.
  2. Vytvoření tunelu mezi domácím počítačem a serverem.

V tento okamžik už vidíme, v čem spočívá celý fígl: protože budou vytvořeny dva tunely s jedním serverem, je možné tímto „prodlouženým“ tunelem propojit i domácí počítač a kancelář, byť mezi nimi neexistuje přímé spojení.

Co je nutné vědět a nastavit před vytvořením reverzního tunelu SSH

Za prvé, samozřejmě musíme mít uživatelský účet na serveru. Pokud používáme webové služby, jako je No-IP, použijeme přidělené údaje.

Jestliže však spoléháme na server od třetí osoby (třeba kolegy či kamaráda), účet v systému nám musí vytvořit on. Pamatujte prosím, že hesla na obou účtech by měla být silná.

Za druhé, důležité je, aby na straně serveru a na počítači v kanceláři (počítači, kam se chceme hlásit) byla v nastavení SSH serveru (sshd_config) povolena možnost GatewayPorts.

Stav zjistíme zadáním příkazu

$ su
# cat /etc/ssh/sshd_config | grep GatewayPorts

V případě, že zmíněná možnost chybí, je zakomentována nebo má hodnotu no, tento konfigurační soubor otevřeme a upravíme.

# nano /etc/ssh/sshd_config

A upravíme řádek

# GatewayPorts no

na

GatewayPorts yes

Pozn.: V případě, že by tunelování nefungovalo, GatewayPorts yes změníme na

GateWayPorts clientspecified

Dále na obou stranách odkomentujeme řádek

#AllowTcpForwarding yes

popř. jej vytvoříme.

Po dokončení úprav restartujme SSH server (na openSUSE)

# service sshd restart

(a na Ubuntu)

$ sudo service ssh stop
$ sudo service ssh start

Navázaní spojení, postavení tunelu

V prvním kroku uděláme reverzní tunel mezi počítačem v kanceláři a serverem.

Na počítači v kanceláři zadáme příkaz:

$ ssh -R P3:localhost:P1 uzivatel_na_serveru@IP-Serveru

kde P3 je (libovolný) port, jenž otevřeme pro tunel na straně serveru, P1 je pak port SSH na naší straně v kanceláři (standardně 22, ale pokud jsme vybrali předtím jiný, musíme zadat správnou hodnotu).

Pozn.: Je-li na serveru používán firewall (například v operačním systému openSUSE), je nezbytné příslušný port (P3) ve firewallu povolit:

Yast → Bezpečnost → Firewall

V levé části okna vybereme Povolené služby, na pravé straně okna pak otevřeme volbu Pokročilé. Do kolonky TCP port zadáme příslušný port.

Příklad: Počítač v kanceláří používá pro SSH (nestandardní) port 52528 (P1). Server má otevřený port 49500 (P2). Pak reverzní tunel vytvoříme jako

$ ssh -R 49500:localhost:52528 uzivatel@IP-Serveru

kde uzivatel@IP-Serveru nahradíme správnými údaji (jako franta@192.168.1.10).

Reverzní tunel (-R) dělá to, že komunikace příchozí na port 49500 vzdáleného serveru je přesměrována na port 52528 počítače v kanceláři.

Pozn.: V případě, že se připojení nezdaří (např. vyprší časový limit), zkusme příkaz doplnit o parametr -v

$ ssh -v -R P2:localhost:P1 uzivatel_na_serveru@IP-Serveru

Teď uvidíme, jak se postupně navazuje spojení a jak se vytváří tunel – díky tomu je možné zjistit, kde nastala chyba. Například často je výstupem následující:

debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to IP-Serveru [IP-Serveru] port 22

Používá-li totiž vzdálený server pro SSH jiný port namísto standardního portu 22, musíme tento port v uvedeném příkazu pro sestavení tunelu specifikovat.

K tomu slouží parametr -p. Je-li na serveru pro SSH službu vyhrazen port třeba 31231, zadáme

$ ssh -p 31231 -R 49500:localhost:52528 uzivatel_na_serveru@IP-Serveru

V druhém kroku musíme se serverem spojit počítač doma.

Použijeme uživatelské jméno přiřazené účtu v systému v kanceláři, ovšem s IP adresou patřící serveru. Fígl je v tom, že pomocí portu, který jsme na serveru otevřeli a kterým server komunikuje s počítačem v kanceláři, se protunelujeme rovnou až do kanceláře, voilá!

$ ssh -p 49500 uzivatel_v_kancelari@IP-Serveru

Všimněme si prosím, že jsme zadali číslo portu, který jsme pro reverzní tunel otevřeli na serveru.

Jakmile zanikne tunel mezi počítači Kancelář ↔ Server, zanikne i spojení Doma ↔ Kancelář.

Aby nedošlo k přerušení

Určitě je dobré, aby tunel mezi počítačem v kanceláří a serverem vydržel co nejdéle. Totiž neaktivní spojení se brzy přerušují – proto musíme v konfiguračním soubor sshd_config nastavit pár důležitých věcí.

Za prvé – nastavte na serveru hodnotu parametru TCPKeepAlive na yes. Tím SSH říkáte, aby připojeným klientským počítačům (stroji v kanceláři) pravidelně vysílal zprávy o tom, že běží.

Za druhé, vyhledejte v tomtéž konfiguračním souboru parametr ClientAliveInterval a nastavte jej třeba na hodnotu 15. Tím se zaručí, že zprávy o aktivním spojení budou mezi serverem a kanceláři posílány co 15 sekund.

Za třetí, parametr ClientAliveCountMax nastavte například na hodnotu 40. Ta udává počet ztracených zpráv při přerušení spojení po dobu 10 minut. To znamená, že pokud bude 10 minut spojení mezi serverem a klientem 10 minut neaktivní (problém v síti), spojení se nadobro uzavře. (Totiž: 10 minut je 600 sekund; za tu dobu je vysláno 600/15 zpráv, tj. 40. Samozřejmě si hodnoty můžete přizpůsobit podle sebe.)