Co je reverzní tunelování SSH? (a jak jej používat)

Potřebujete se dostat pomocí SSH na server s Linuxem, který je mimo vaši dosah? Zpřístupněte si ho pomocí reverzního tunelování a získejte tak přímý přístup. Ukážeme si, jak na to.

Kdy je vhodné použít reverzní tunelování SSH?

Někdy může být komplikované se dostat k vzdáleným počítačům. Například síť, ve které se nacházejí, může mít přísná pravidla firewallu nebo složité nastavení překladu síťových adres (NAT). Jak se tedy k takovému počítači připojíte, když to potřebujete?

Pojďme si zavést terminologii. Váš počítač je lokální, protože je fyzicky u vás. Počítač, ke kterému se chcete připojit, je vzdálený, protože je umístěn jinde.

Pro účely tohoto návodu budeme vzdálený počítač nazývat „wdzwdz“. Běží na něm Ubuntu Linux a má fialové terminálové okno. Lokální počítač nazveme „Sulaco“ a běží na Manjaro Linux s žlutými terminálovými okny.

Běžně byste se k vzdálenému počítači připojili SSH z vašeho lokálního počítače. To ale v našem scénáři není možné. Ať už je síťový problém jakýkoliv, reverzní tunelování je užitečné, když se k vzdálenému počítači nelze připojit přímo.

Pokud je síťová konfigurace na vaší straně jednoduchá, vzdálený počítač se může připojit k vám. To však samo o sobě nestačí, protože vám to neposkytne interaktivní terminál na vzdáleném počítači. Je to ale základ. Máte navázané spojení mezi oběma stroji.

Řešením je reverzní tunelování SSH.

Co je to reverzní tunelování SSH?

Reverzní tunelování SSH využívá existující připojení pro vytvoření nového spojení z lokálního počítače zpět na vzdálený počítač.

Protože původní spojení proběhlo ze vzdáleného počítače k vám, jeho využití opačným směrem je „reverzní“. A protože SSH je samo o sobě zabezpečené, vkládáte tak zabezpečené spojení do jiného zabezpečeného spojení. Vaše připojení ke vzdálenému počítači pak funguje jako privátní tunel uvnitř původního spojení.

Odtud pochází název „reverzní tunelování SSH“.

Jak to funguje?

Reverzní tunelování SSH je založeno na tom, že vzdálený počítač využije existující připojení k naslouchání novým požadavkům na spojení z lokálního počítače.

Vzdálený počítač naslouchá na určeném portu vašeho lokálního stroje. Když zaznamená požadavek na SSH na tomto portu, předá ho zpět po existujícím spojení, tentokrát sám sobě. Tím vytvoří nové spojení z vašeho lokálního počítače na ten vzdálený.

Je to jednodušší na provedení, než na popis.

Použití reverzního tunelování SSH

SSH by měl být na vašem Linuxovém systému již nainstalován, ale možná budete muset spustit SSH démona (sshd), pokud váš lokální počítač ještě nikdy nepřijímal SSH připojení.

sudo systemctl start sshd

Pro spouštění SSH démona při každém restartu počítače použijte tento příkaz:

sudo systemctl enable sshd

Na vzdáleném počítači použijeme následující příkaz:

Volba -R (reverse) říká SSH, že na vzdáleném počítači má být vytvořeno nové SSH spojení.
„43022:localhost:22“ říká SSH, že požadavky na port 43022 na lokálním počítači mají být přeposlány na port 22 na vzdáleném počítači. Port 43022 byl vybrán, protože je veden jako nepřidělený. Nejedná se o žádné speciální číslo.
[email protected] je uživatelský účet, ke kterému se vzdálený počítač připojí na lokálním stroji.

ssh -R 43022:localhost:22 [email protected]

Může se objevit varování, že jste se ještě nikdy nepřipojili k lokálnímu počítači. Nebo se zobrazí varování při přidávání údajů o připojení do seznamu známých hostitelů SSH. Co se vám zobrazí závisí na tom, jestli někdy dříve bylo vytvořeno spojení ze vzdáleného počítače na lokální.

Budete vyzváni k zadání hesla k uživatelskému účtu, který používáte pro připojení k lokálnímu počítači.

Všimněte si, že po navázání spojení se příkazová řádka změní z [email protected] na [email protected]

Nyní jsme připojeni k lokálnímu počítači ze vzdáleného počítače. Můžeme mu zadávat příkazy. Zkusíme příkaz who k zobrazení přihlášení na lokálním stroji.

who

Vidíme, že uživatel s účtem „dave“ je přihlášen k lokálnímu počítači a že se připojil i vzdálený počítač (pod stejným uživatelským jménem) z IP adresy 192.168.4.25.

Připojení ke vzdálenému počítači

Protože je připojení ze vzdáleného počítače úspěšné a naslouchá připojení, můžeme se pokusit připojit ke vzdálenému počítači z lokálního.

Vzdálený počítač naslouchá na portu 43022 na vašem lokálním počítači. Takže – možná trochu neintuitivně – se pro připojení ke vzdálenému počítači musíme z lokálního počítače připojit na port 43022. Tento požadavek na připojení bude předán vzdálenému stroji.

ssh localhost -p 43022

Budete vyzváni k zadání hesla k uživatelskému účtu a pak se připojíte ke vzdálenému počítači z lokálního. Náš počítač Manjaro hlásí „Vítejte v Ubuntu 18.04.2 LTS“.

Všimněte si, že se příkazová řádka změnila z [email protected] na [email protected] Dosáhli jsme našeho cíle vytvořit SSH připojení k našemu těžko dostupnému vzdálenému počítači.

Používání SSH s klíči

Pro usnadnění připojování se ze vzdáleného počítače na lokální, si můžeme nastavit SSH klíče.

Na vzdáleném počítači zadejte tento příkaz:

ssh-keygen

Budete vyzváni k zadání hesla. Můžete stisknout Enter a ignorovat požadavky na heslo, ale to se nedoporučuje. Znamenalo by to, že kdokoliv na vzdáleném počítači by se mohl připojit na váš lokální počítač bez nutnosti zadávání hesla.

Tři nebo čtyři slova oddělená speciálními znaky vytvoří dostatečně silné heslo.

Vaše SSH klíče budou vygenerovány.

Potřebujeme přenést veřejný klíč na lokální počítač. Použijte tento příkaz:

ssh-copy-id [email protected]

Budete vyzváni k zadání hesla k uživatelskému účtu, ke kterému se přihlašujete, tedy v tomto případě [email protected]

Při prvním pokusu o připojení ze vzdáleného počítače k lokálnímu, budete muset zadat heslo. Nebudete ho muset zadávat znovu pro další požadavky, dokud zůstane toto okno terminálu otevřené.

Ne všechny tunely jsou strašidelné

Některé tunely mohou být temné a spletité, ale reverzní tunelování SSH není nijak složité, pokud si udržíte v hlavě vztah mezi vzdáleným a lokálním počítačem. A pak si to obrátíte.