Jak to chápu, firewally (za předpokladu výchozího nastavení) odmítnou veškerý příchozí provoz, který nemá předchozí odpovídající odchozí provoz.
Na základě obrácení ssh připojení a SSH Tunneling Made Easy , lze pomocí reverzního SSH tunelování obejít omezující omezení brány firewall.
Chtěl bych provádět příkazy Shell na vzdáleném počítači. Vzdálený počítač má svůj vlastní firewall a je za dalším firewallem (routerem). Má IP adresu jako 192.168.1.126 (nebo něco podobného). Nejsem za bránou firewall a znám IP adresu vzdáleného počítače, jak je vidět z Internetu (nikoli adresu 192.168.1.126). Navíc mohu někoho požádat, aby nejprve provedl jako vzdálený počítač ssh (something)
jako root.
Mohl by mi někdo krok za krokem vysvětlit, jak funguje reverzní tunel SSH, aby obešel brány firewall (brány firewall místních a vzdálených počítačů a další firewall mezi nimi)?
Jaká je role přepínačů (-R
, -f
, -L
, -N
)?
Rád vysvětluji tento druh věcí vizualizací. :-)
Vaše připojení SSH považujte za zkumavky. Velké trubky. Normálně se dostanete přes tyto trubky, abyste spustili prostředí na vzdáleném počítači. Shell běží ve virtuálním terminálu (tty). Ale tuto část už znáte.
Myslete na svůj tunel jako na trubku uvnitř trubice. Stále máte velké připojení SSH, ale volba -L nebo -R vám umožní nastavit menší trubku uvnitř.
Každá trubice má začátek a konec. Velká trubice, vaše připojení SSH, začala u vašeho klienta SSH a končí na serveru SSH, ke kterému jste se připojili. Všechny menší zkumavky mají stejné koncové body, kromě toho, že role "start" nebo "end" je určena tím, zda jste použili -L
nebo -R
(příslušně) k jejich vytvoření.
(Neřekl jste, ale budu předpokládat, že "vzdálený" stroj, který jste zmínil, ten, který stojí za bránou firewall, má přístup k internetu pomocí Network Address Translation (NAT). Je to tak důležité, takže opravte tento předpoklad, pokud je nepravdivý.)
Při vytváření tunelu určíte adresu a port, na který bude odpovídat, a adresu a port, na který budou doručeny. The -L
řekne tunelu, aby odpověděl na místní straně tunelu (hostitel, na kterém je spuštěn váš klient). The -R
volba říká tunelu, aby odpověděl na vzdálené straně (SSH server).
Takže ... Abyste mohli SSH z Internetu do počítače za bránou firewall, potřebujete, aby dotyčný stroj otevřel připojení SSH do vnějšího světa a zahrnul -R
tunel, jehož „vstupní“ bod je „vzdálenou“ stranou jeho spojení.
Z výše uvedených dvou modelů chcete ten pravý.
Od hostitele firewalled:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Klientovi to řekne, aby vytvořil tunel s -R
zadejte vstupní bod. Cokoli, co se připojí k portu 22222 na vzdáleném konci tunelu, skutečně dosáhne „portu 22 localhost“, kde „localhost“ je z pohledu koncového bodu tunelu (tj. Vašeho ssh klienta).
Další možnosti jsou:
-f
řekne ssh samému pozadí poté, co se ověří, takže nemusíte sedět a spouštět něco na vzdáleném serveru, aby tunel zůstal naživu.-N
říká, že chcete připojení SSH, ale ve skutečnosti nechcete spouštět žádné vzdálené příkazy. Pokud vše, co vytváříte, je tunel, pak zahrnutím této možnosti ušetříte zdroje.-T
zakáže přidělování pseudotty, což je vhodné, protože se nepokoušíte vytvořit interaktivní prostředí.Pokud nenastavíte klíče DSA nebo RSA pro přihlášení bez hesla, bude to výzva k zadání hesla.
Důrazně doporučujeme používat odhozený účet (nikoli vlastní přihlášení), který jste nastavili právě pro tento tunel/zákazník/server.
Nyní z vašeho Shell yourpublichost navažte spojení s Firewalled Hostem tunelem:
ssh -p 22222 [email protected]
Dostanete výzvu s klíčem hostitele, protože jste pravděpodobně nikdy tohoto hostitele nezasáhli. Poté dostanete výzvu k zadání hesla pro účet username
(pokud jste nenastavili klíče pro přihlášení bez hesla).
Pokud se chystáte pravidelně přistupovat k tomuto hostiteli, můžete také zjednodušit přístup přidáním několika řádků do svého ~/.ssh/config
file:
Host remotehostname
User remoteusername
Hostname localhost
Port 22222
Upravte remotehostname
a remoteusername
, aby vyhovovaly. Pole remoteusername
se musí shodovat s vaším uživatelským jménem na vzdáleném serveru, ale remotehostname
může být libovolný název hostitele, který vám vyhovuje, nemusí odpovídat ničemu, co lze vyřešit.
Viz také:
Stroj, do kterého je zadán příkaz ssh tunnel, se nazývá "váš hostitel".
local: -L Specifies that the given port on the local (client) Host is to be forwarded to the given Host and port on the remote side.
ssh -L sourcePort:forwardToHost:onPort connectToHost
Znamená: spojit se ssh do connectToHost
a předat všechny pokusy o připojení místnísourcePort
na port onPort
na stroj s názvem forwardToHost
, kterého lze dosáhnout ze stroje connectToHost
.
remote: -R Specifies that the given port on the remote (server) Host is to be forwarded to the given Host and port on the local side.
ssh -R sourcePort:forwardToHost:onPort connectToHost
Znamená: spojit se ssh do connectToHost
a předat všechny pokusy o připojení vzdálenésourcePort
na port onPort
na stroj s názvem forwardToHost
, na který se dostanete z místního počítače.
-f
Řekne ssh samotnému pozadí poté, co se ověří, takže nemusíte sedět a spouštět něco na vzdáleném serveru, aby tunel zůstal naživu.-N
Říká, že chcete připojení SSH, ale ve skutečnosti nechcete spouštět žádné vzdálené příkazy. Pokud vše, co vytváříte, je tunel, pak zahrnutím této možnosti ušetříte zdroje.-T
Zakáže pseudottyčkování, což je vhodné, protože se nepokoušíte vytvořit interaktivní prostředí.Třetí obrázek představuje tento tunel. Ale modrý počítač s názvem "Váš hostitel" představuje počítač, kde někdo spouští tunel ssh, v tomto případě stroj s firewallem .
Takže, požádejte někoho o zahájení ssh tunelového připojení k vašemu počítači. Příkaz by měl v podstatě vypadat
ssh -R 12345:localhost:22 YOURIP
Nyní je tunel otevřen. Nyní se můžete připojit pomocí ssh k firewalled stroju tunelem s příkazem
ssh -p 12345 localhost
který se připojí k vašemu vlastnímu localhost
(váš počítač) na portu 12345
, ale port 12345
je přes tunel přeposlán na port 22 localhost počítače s firewallem (tj. samotný počítač s firewallem).
tunelování ssh funguje pomocí již vytvořeného spojení ssh pro odesílání dalšího provozu.
Když se připojujete ke vzdálenému serveru, obvykle máte pouze 1 kanál pro normální interakci uživatele (nebo 3 kanály, pokud považujete STDIN/STDOUT/STDERR za samostatné). Proces lokálního nebo vzdáleného ssh může kdykoli otevřít další kanály na existujícím připojení. Tyto kanály pak odesílají/přijímají provoz tunelu. Když odesíláte nebo přijímáte jakýkoli provoz, proces ssh jednoduše říká „tento provoz je pro kanál foobar“.
V zásadě to funguje takto:
127.0.0.1
, ale lze jej změnit).Tento proces je stejný pro tunelování vpřed i vzad (ve výše uvedeném postupu stačí zaměnit slova „local“ a „remote“). Tunel může spustit kterákoli strana. To nemusí být ani při prvním spuštění ssh. Tunely můžete otevřít, když je již spuštěn ssh (viz ESCAPE CHARACTERS
, konkrétně ~C
).
Pro roli -R
, -f
, -L
, a -N
, opravdu byste se měli jen podívat na manuálovou stránku, to vám dá nejlepší možné vysvětlení. Ale zmíním se o -R
a -L
.-R
řekne vzdálenému ssh, aby poslouchal spojení, a že místní ssh by se měl připojit ke skutečnému cíli. -L
řekne místnímu ssh, aby poslouchal spojení, a že vzdálený ssh by se měl připojit ke skutečnému cíli.
Poznámka, jedná se o velmi hrubý popis, ale měl by vám poskytnout dostatek informací, abyste věděli, co se děje
To je vysvětleno v příručce SSH, zejména rozdíly mezi -L
(místní) a -R
(dálkový).
-L
-L [bind_address:]port:Host:hostport
Určuje, že daný port na místním (klientském) hostiteli má být přeposlán na daného hostitele a port na vzdálené straně .
To funguje přidělením soketu k poslechu portu na místní straně, případně vázaného na zadanou vazbu_adresu.
Kdykoli dojde k připojení k tomuto portu, se připojení přesměruje přes zabezpečený kanál a naváže se připojení na port
Host
hostport
ze vzdáleného počítače .
Následující příklad vyladí relaci IRC z klientského počítače 127.0.0.1
(localhost
) pomocí portu 1234 ke vzdálenému serveru server.example.com
:
$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10
Poznámka: -f
možnost pozadí ssh a vzdálený příkaz sleep 10
je specifikováno tak, aby umožňovalo dostatek času ke spuštění služby, která má být tunelována.
Příklad:
ssh `-N` -L 22000:localhost:11000 remote.server.com
-N
Poté, co se připojíte, zůstaňte tam (nedostanete výzvu Shell)
Nevykonávejte vzdálený příkaz.
-L 22000
Připojení vznikne na portu 22000 vašeho osobního [~ # ~] l [~ # ~] ocal stroje
localhost:11000
- remote.server.com
zajistí, že druhý konec tunelu je localhost
, port 11000
Zdroj: Ilustrovaný průvodce, tutoriál, návod, postup při ssh tuneling .
-R
-R [bind_address:]port:Host:hostport
Určuje, že daný port na vzdáleném (serverovém) hostiteli má být přeposlán na daného hostitele a port na místní straně .
To funguje přidělením soketu k poslechu
port
na vzdálené straně, a kdykoli je navázáno připojení k tomuto portu, je spojení přeposláno přes zabezpečený kanál a je vytvořeno připojení k portuHost
porthostport
z místního počítače .
Příklad:
ssh -N -R 22000:localhost:11000 remote.server.com
-N
Poté, co se připojíte, zůstaňte tam (nedostanete výzvu Shell)
Nevykonávejte vzdálený příkaz.
-R
22000 Připojení vznikne na portu 22000 počítače [~ # ~] r [~ # ~] (v tomto případě remote.server.com)
localhost:11000
váš osobní, místní počítač zajistí, že druhý konec tunelu je localhost
, port 11000
Zdroj: Ilustrovaný průvodce, tutoriál, návod, postup při ssh tuneling .