Jak funguje reverzní tunelování SSH?

Pokud tomu rozumím, brány firewall (za předpokladu výchozího nastavení) popírají veškerý příchozí provoz, který nemá předchozí odpovídající odchozí provoz.

Na základě Reverzní připojení ssh a SSH Tunneling Made Easy lze použít reverzní SSH tunelování kolem otravných omezení brány firewall.

Chtěl bych na vzdáleném počítači provádět příkazy shellu. Vzdálený počítač má vlastní bránu firewall a je za další bránou firewall (směrovač). Má IP adresu jako 192.168.1.126 (nebo něco podobného). Nejsem za firewallem a znám IP adresu vzdáleného počítače, jak je vidět z internetu (ne adresu 192.168.1.126). Navíc mohu někoho požádat, aby provedl ssh (something) jako root na vzdáleném počítači jako první.

Mohl by mi někdo krok za krokem vysvětlit, jak reverzní tunelování SSH funguje, aby bylo možné obejít 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)?

Komentáře

Odpovědět

Rád vysvětluji tento druh věcí pomocí vizualizace. 🙂

Vaše připojení SSH považujte za elektronky. Velké trubky. Za normálních okolností se těmito trubicemi dostanete a spustíte shell na vzdáleném počítači. Shell běží ve virtuálním terminálu (tty). Tuto část však již znáte.

Představte si svůj tunel jako trubici uvnitř trubice. Stále máte velké připojení SSH, ale volba -L nebo -R vám umožní nastavit v ní menší trubku.

Každá trubice má začátek a konec. Velká trubice, vaše připojení SSH, začalo u vašeho klienta SSH a končí na serveru SSH, ke kterému jste se připojili. Všechny menší trubky mají stejné koncové body, kromě toho, že role „start“ nebo „end“ je určena tím, zda jste použili -L nebo -R (v uvedeném pořadí) k jejich vytvoření.

(Neřekl jste to, ale předpokládám, že že „vzdálený“ stroj, který jste zmínili, ten za firewallem, může přistupovat k Internetu pomocí překladu síťových adres (NAT). To je trochu důležité, proto prosím opravte tento předpoklad, pokud je nepravdivý.)

Když vytvoříte tunel, určíte reklamu šaty a port, na který bude odpovídat, a adresu a port, na který bude doručen. Možnost -L řekne tunelu, aby odpověděl na místní straně tunelu (hostitel, na kterém běží váš klient). Možnost -R řekne tunelu, aby odpověděl na vzdálené straně (server SSH).

ssh tunelové směry

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 k vnějšímu světu a zahrnoval -R tunel, jehož„ vstupní “bod je„ vzdálená “strana jeho připojení.

Ze dvou výše uvedených modelů chcete ten pravý.

Od hostitele se zabezpečenou bránou:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com 

Toto řekne klientovi, aby vytvořil tunel s -R položkou emote směřovat. Cokoli, co se připojí k portu 22222 na vzdáleném konci tunelu, ve skutečnosti dosáhne „localhost port 22“, kde „localhost“ je z pohledu výstupního bodu tunelu (tj. Vašeho klienta ssh).

Další možnosti jsou:

  • -f řekne ssh, aby se po ověření ověřilo na pozadí, takže nemusíte sedět a něco běhat na vzdálený server, 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í této možnosti šetří zdroje.
  • -T zakáže alokaci pseudo-tty, což je vhodné, protože nejste pokus o vytvoření interaktivního prostředí.

Pokud nezadáte klíče DSA nebo RSA pro přihlášení bez hesla, bude zde výzva k zadání hesla.

Pamatujte, že je to SILNÉ doporučeno použít účet pro vyhodení (nikoli vlastní přihlášení), který jste nastavili pouze pro tento tunel / zákazník / server.

Nyní z vašeho shellu na yourpublichost , navázat připojení k hostiteli firewallem prostřednictvím tunelu:

ssh -p 22222 username@localhost 

Vy budete získejte klíčovou výzvu hostitele, protože jste tohoto hostitele pravděpodobně nikdy nezasáhli. Potom „získáte výzvu k zadání hesla pro účet username (pokud nenastavíte klíče pro přihlášení bez hesla).

Pokud k tomuto hostiteli budete přistupovat pravidelně, můžete přístup také zjednodušit přidáním několika řádků do svého souboru ~/.ssh/config:

host remotehostname User remoteusername Hostname localhost Port 22222 

Upravte remotehostname a remoteusername tak, aby vyhovovaly. = „5c38e00a51“>

pole se musí shodovat s vaším uživatelským jménem na vzdáleném serveru, aleremotehostnamemůže být libovolný název hostitele, který vám vyhovuje, nemusí odpovídat ničemu, co by bylo možné vyřešit.

Viz také:

Komentáře

  • co ssh -D. Vysvětlete prosím stejnou metodu.
  • Servery proxy SOCKS nejsou stejné jako tunely. Máte-li otázku, jak je používat, požádejte o to .
  • I ‚ m mít velmi obtížné období po tomto vysvětlení kvůli volnému použití termínů: server, klient, místní počítač, vzdálený počítač, hostitel, yourpublichost, localhost, remotehostname. Se všemi těmito volnými a nedefinovanými pojmy se dalo předpokládat, že by někdo potřeboval k nastavení až 8 počítačů. Tvrdím to, protože ve všech ostatních aspektech se to zdá být velmi dobrým vysvětlením. Omezte a definujte výrazy.
  • @ Rucent88, si nejsem jistý, jaké snížení by bylo možné. Klient naváže připojení k serveru. Tato ‚ běžná terminologie po celém světě sítí. Místní a vzdálené stroje se zdají docela samozřejmé. Pokud jste ‚ po přečtení dokumentace zmateni ohledně SSH nebo obecné terminologie unixu, jsem si ‚ jisti, že ‚ Nebudu mít problém najít zde lidi, kteří jsou velmi ochotní odpovědět na všechny vaše dotazy.
  • @ghoti Je to ‚ skutečně matoucí, protože místní a vzdálené stroje jsou relativní. Když sedím na pracovišti, můj domácí počítač je dálkový ovladač, když sedím doma, je pracovní počítač vzdálený. Server a klient jsou také matoucí, když mluvíme o tunelování. Například pokud se připojím z práce z domova pomocí ssh -R. Připojuji se ke své práci z domácího počítače připojením localhost. Z pohledu soketů je tedy server sám domácím počítačem. Ale logicky jsem se připojil ke svému pracovnímu počítači. To je ‚ matoucí.

Odpověď

Nakreslil jsem některé náčrtky

Stroj, do kterého je zadán příkaz ssh tunnel, se nazývá »váš hostitel« .

ssh tunel vycházející z místního


ssh tunel vycházející ze vzdáleného

Úvod

  1. místní: -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á: připojit se ssh k connectToHost a předat všechny pokusy o připojení místní sourcePort na port onPort na počítači s názvem forwardToHost, ke kterému se lze dostat ze connectToHost stroje.

  2. 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á: připojit se ssh k connectToHost a přeposlat všechny pokusy o připojení na vzdálené sourcePort na port onPort na počítači s názvem forwardToHost, který je dostupný z místního počítače.

Další možnosti

  • -f řekne ssh, aby se po ověření ověřilo na pozadí, takže nemusíte sedět a běhat na vzdáleném serveru, aby tunel zůstat 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í této možnosti šetří zdroje.
  • -T zakáže alokaci pseudo-tty, což je vhodné, protože nejste pokouší se vytvořit interaktivní shell.

Váš příklad

Třetí obrázek představuje tento tunel. Ale modrý počítač s názvem »váš hostitel« představuje počítač, kde někdo spustí tunel ssh, v tomto případě firewallovaný stroj.

Takže požádejte někoho o připojení ssh tunelu k vašemu stroji. Příkaz by měl v zásadě vypadat

ssh -R 12345:localhost:22 YOURIP 

Nyní je tunel otevřen.Nyní se můžete připojit přes ssh k firewallovému stroji tunelem pomocí příkazu

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ředán na port 22 místního hostitele brány firewall počítač (tj. samotný počítač s firewallem).

Komentáře

  • @erik, Jak jste tyto obrázky nakreslili?
  • I použil nástroj pro vektorové kreslení s otevřeným zdrojovým kódem s názvem Inkscape a mé myši (no, ve skutečnosti je to trackball: Marble FX od společnosti Logitech).
  • @ ghoti: Ve výchozím nastavení bude naslouchací soket na serveru (na mém obrazu -R žlutý vzdálený hostitel) vázán pouze na rozhraní zpětné smyčky. To může být přepsáno zadáním bind_address. Prázdná bind_address nebo adresa „*“ označuje, že vzdálený soket by měl naslouchat na všech rozhraních. – Takže to zkuste: Na modrém počítači spusťte ssh -R 1234:localhost:8000 yellowcomputer. A také na modrém stroji spusťte python -m SimpleHTTPServer (jednoduchý webový server na portu 8000). Pak ve webovém prohlížeči na žlutém stroji otevřete URL http://localhost:1234 a uvidíte, že to funguje.
  • @erik, ach, ta matoucí část je, protože moje oči jsou špatně – ve vašich příkazech jsem ‚ neviděl prostor před remotehost. Po bližším prozkoumání zjistím, že vaše diagramy vůbec ‚ t vůbec neřeší volitelnou bind_address. Omlouváme se za zmatek.
  • @briankip Ano, samozřejmě. Alespoň pokud chcete provést ssh připojení k počítači za bránou firewall (prostřednictvím tunelu nebo přímo, pokud to brána firewall umožňuje). Tj.: Příkaz ssh, který napíšete na počítači s firewallem, otevře pouze tunel, ale nespustí se a nebude fungovat jako ssh-daemon / -server. Vaše další otázka by měla znít, jak spustit sshd bez oprávnění root (pokud je to váš problém). 🙂

Odpověď

tunelování ssh funguje tak, že se k odeslání dalšího provozu používá již vytvořené připojení ssh.

Když se připojujete ke vzdálenému serveru, obvykle máte pouze 1 kanál pro běžnou interakci s uživatelem (nebo 3 kanály, pokud považujete STDIN / STDOUT / STDERR za samostatný). Místní nebo vzdálený proces 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 v tunelu. Při odesílání nebo přijímání jakéhokoli provozu proces ssh jednoduše říká „tento provoz je pro kanál foobar“.

V podstatě to funguje takto:

  1. Řeknete ssh, aby začal poslouchat na portu XXXX a že veškerý přijatý provoz by měl být tunelován a poté nastaven na YYYY na portu ZZZZ.
  2. Místní ssh začne poslouchat na portu XXXX (obvykle na 127.0.0.1, ale lze jej změnit).
  3. Některá aplikace otevře připojení k portu XXXX na místním počítači.
  4. Místní ssh otevře kanál ke vzdálenému ssh a řekne „jakýkoli provoz na tomto kanálu přejde na YYYY: ZZZZ
  5. Vzdálený ssh se připojí k YYYY: ZZZZ a odešle zpět „OK, kanál je otevřený“
  6. Nyní veškerý provoz odeslaný po připojení k portu XXXX na místním počítači je proxy ssh na YYYY: ZZZZ.

Tento proces je přesně stejný pro dopředné i zpětné tunelování (stačí zaměnit slova „local“ a „remote“ v výše uvedený postup). Každá strana může spustit tunel nemusí to být ani při prvním spuštění ssh. Tunely můžete otevírat, když je již spuštěn ssh (viz ESCAPE CHARACTERS, konkrétně ~C).

Role -R, -f, -L a -N, měli byste se jen podívat na manuálovou stránku, která vám poskytne nejlepší možné vysvětlení. Ale zmíním -R a -L.
-R řekne vzdálenému ssh poslouchat připojení a místní ssh by se měl připojit ke skutečnému cíli. -L říká místnímu ssh, aby naslouchal připojení, a že vzdálený ssh by se měl připojit ke skutečnému cíli.

Upozorňujeme, že toto je velmi hrubý popis, ale měl by vám poskytnout dostatek informací, abyste věděli, o co jde

Odpověď

To je vysvětleno v příručce SSH, zejména rozdíly mezi -L (local) a -R (vzdálený).


-L

-L [bind_address:]port:host:hostport

Určuje, že daný port na místním (klientském) hostiteli má být předán danému hostiteli a port na vzdálené straně .

Funguje to tak, že alokujete soket, který poslouchá port na místní straně, volitelně spojený se zadanou adresou bind_address.

Kdykoli se k tomuto portu připojí, připojení je předáváno přes zabezpečený kanál a je navázáno do host port hostport ze vzdáleného počítače .

Následující příklad tuneluje relaci IRC z klientského počítače 127.0.0.1 (localhost) pomocí portu 1234 na vzdálený server server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10 

Poznámka: Možnost -f pozadí ssh a vzdálený příkaz sleep 10 je zadán tak, aby umožňoval čas na spuštění služby, která má být tunelována.

Příklad:

ssh `-N` -L 22000:localhost:11000 remote.server.com 
  • -N Po připojení se tam jen pověste (nedostanete výzvu pro shell)

    Nevykonávejte vzdálený příkaz.

  • -L 22000 Připojení vznikne na portu 22 000 vašich osobních údajů, L ocal machine

  • localhost:11000remote.server.com zajistí, že druhý konec tunelu je localhost, port 11000

ssh -N -L 22000: 192.168.1.2: 11000 remote.server.com

Zdroj: Ilustrovaný průvodce, návod, návody k tunelování ssh .


-R

-R [bind_address:]port:host:hostport

Určuje, že daný port vzdáleného hostitele (serveru) má být předán g iven hostitel a port na místní straně .

Funguje to tak, že přidělíte soket, kterému nasloucháte port na na vzdálenou stranu a kdykoli je provedeno připojení k tomuto portu, je připojení předáno přes zabezpečený kanál a připojení je na host port hostport 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, jednoduše tam zavěste (nedostanete výzvu pro shell)

    Neprovádějte vzdálený příkaz.

  • -R 22000 Připojení bude navázáno na portu 22000 emulátoru R (v tomto případě remote.server.com)

  • váš osobní místní počítač zajistí, že druhý konec tunelu je localhost, port 11000

ssh -N -R 22000: localhost: 11000 remote.server.com

Zdroj: Ilustrovaný průvodce, návod, návody k tunelování ssh .

Komentáře

  • ucho a ústa jasně ukazují, kdo ‚ mluví a kdo ‚ naslouchá!
  • Miluji vaše ilustrace!

Odpovědět

Vazba na síťová rozhraní při vytváření reverzních SSH tunelů je vysvětlena v tomto příspěvku . Zde je příklad se 4 počítači umístěnými ve dvou různých sítích:

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *