Cum funcționează tunelul SSH invers?

După cum înțeleg acest lucru, firewall-urile (presupunând setările implicite) refuză tot traficul de intrare care nu are trafic de ieșire corespunzător anterior.

Pe baza Inversarea unei conexiuni ssh și Tunelare SSH simplificată , tunelarea SSH inversă poate fi utilizată pentru a obține în jurul restricțiilor greoaie de firewall.

Aș dori să execut comenzi shell pe o mașină la distanță. Mașina la distanță are propriul său firewall și se află în spatele unui firewall suplimentar (router). Are o adresă IP precum 192.168.1.126 (sau ceva similar). Nu sunt în spatele unui firewall și știu adresa IP a mașinii la distanță, așa cum se vede de pe Internet (nu adresa 192.168.1.126). În plus, pot cere pe cineva să execute ssh (something) ca rădăcină mai întâi pe mașina de la distanță.

Poate cineva să-mi explice, pas cu pas, cum funcționează tunelarea SSH inversă pentru a ocoli paravanele de protecție (paravanele de protecție ale mașinilor locale și la distanță și paravanul de protecție suplimentar dintre ele)? / p>

Care este rolul comutatoarelor (-R, -f, -L, -N)?

Comentarii

Răspuns

Îmi place să explic acest tip de lucruri prin vizualizare. 🙂

Gândiți-vă la conexiunile SSH ca la tuburi. Tuburi mari. În mod normal, veți ajunge prin aceste tuburi pentru a rula un shell pe un computer la distanță. Shell rulează într-un terminal virtual (tty). Dar știți deja această parte.

Gândiți-vă la tunelul dvs. ca la un tub într-un tub. Aveți în continuare conexiunea SSH mare, dar opțiunea -L sau -R vă permite să configurați un tub mai mic în interiorul său.

Fiecare tub are un început și un sfârșit. Tubul mare, conexiunea dvs. SSH, a început cu clientul dvs. SSH și ajunge la serverul SSH la care v-ați conectat. Toate tuburile mai mici au aceleași puncte finale, cu excepția faptului că rolul „start” sau „end” este determinat de dacă ați utilizat -L sau -R (respectiv) pentru a le crea.

(Nu ai spus, dar o să presupun că aparatul „la distanță” pe care l-ați menționat, cel din spatele firewall-ului, poate accesa Internetul folosind Traducerea adreselor de rețea (NAT). Acest lucru este foarte important, așa că vă rugăm să corectați această ipoteză dacă este falsă.)

Când creați un tunel, specificați un anunț rochia și portul pe care va răspunde, precum și adresa și portul către care va fi livrat. Opțiunea -L spune tunelului să răspundă pe partea locală a tunelului (gazda care rulează clientul dvs.). Opțiunea -R spune tunelului să răspundă pe partea de la distanță (serverul SSH).

direcții tunel ssh

Deci … Pentru a putea face SSH de pe Internet într-o mașină din spatele unui firewall, aveți nevoie ca mașina în cauză să deschidă o conexiune SSH către lumea exterioară și să includă un -R tunel al cărui punct de„ intrare ”este partea„ la distanță ”a conexiunii sale.

Dintre cele două modele prezentate mai sus, îl doriți pe cel din dreapta.

De la gazda firewall:

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

Aceasta îi spune clientului dvs. să stabilească un tunel cu o intrare emote -R punct. Orice lucru care se atașează la portul 22222 de la capătul cel mai îndepărtat al tunelului va ajunge de fapt la „portul localhost 22”, unde „localhost” este din perspectiva punctului de ieșire al tunelului (adică clientul dvs. ssh).

Celelalte opțiuni sunt:

  • -f spune ssh să se fundalizeze după ce se autentifică, deci nu trebuie să stați în jur rulând ceva server de la distanță pentru ca tunelul să rămână în viață.
  • -N spune că doriți o conexiune SSH, dar de fapt nu doriți să rulați nicio comandă la distanță. Dacă tot ce creați este un tunel, atunci includerea acestei opțiuni economisește resurse.
  • -T dezactivează alocarea pseudo-tty, ceea ce este adecvat deoarece nu sunteți încercând să creați un shell interactiv.

Va exista o provocare a parolei, cu excepția cazului în care ați configurat cheile DSA sau RSA pentru o autentificare fără parolă.

Rețineți că este PUTERNIC v-a recomandat să utilizați un cont aruncat (nu propriul dvs. login) pe care l-ați configurat doar pentru acest tunel / client / server.

Acum, din shell-ul dvs. pe yourpublichost , stabiliți o conexiune la gazda firewall prin tunel:

ssh -p 22222 username@localhost 

Veți ” obțineți o provocare cheie pentru gazdă, deoarece probabil că nu ați mai lovit această gazdă până acum. Apoi, veți primi o provocare de parolă pentru contul username (cu excepția cazului în care ați configurat cheile pentru autentificarea fără parolă).

Dacă „veți accesa în mod regulat această gazdă, puteți simplifica accesul adăugând câteva linii la fișierul ~/.ssh/config:

host remotehostname User remoteusername Hostname localhost Port 22222 

Reglați remotehostname și remoteusername pentru a se potrivi. remoteusername câmpul trebuie să se potrivească cu numele dvs. de utilizator de pe serverul de la distanță, dar remotehostname poate fi orice nume de gazdă care vi se potrivește, nu trebuie să se potrivească cu nimic rezolvabil.

Vezi și:

Comentarii

  • ce zici de ssh -D. Vă rugăm să explicați folosind aceeași metodă.
  • Proxy-urile SOCKS nu sunt la fel ca tunelurile. Dacă aveți o întrebare despre cum să le utilizați, vă rugăm să întrebați-o .
  • I ‘ Am o perioadă foarte dificilă ca urmare a acestei explicații din cauza utilizării slabe a termenilor: server, client, mașină locală, mașină la distanță, gazdă, dvs. publicichost, localhost, remotehostname. Cu toți acești termeni liberi și nedefiniți, s-ar putea presupune că cineva ar avea nevoie de până la 8 computere pentru a configura acest lucru. Afirm acest lucru pentru că în toate celelalte aspecte pare o explicație foarte bună. Vă rugăm să reduceți și să definiți termeni.
  • @ Rucent88, nu ‘ nu sunt sigur ce reducere ar fi posibilă. Un client stabilește o conexiune la un server. Acea ‘ terminologie comună în întreaga lume a rețelei. Mașinile locale și la distanță par destul de evidente. Dacă ‘ sunteți confuz cu privire la SSH sau la terminologia generală Unix după ce ați citit documentația, ‘ sunt sigur că ‘ Nu voi avea probleme să găsesc oameni foarte dispuși să răspundă la orice întrebări pe care le aveți.
  • @ghoti Este ‘ într-adevăr confuz, deoarece local iar aparatele la distanță sunt relative. Când stau la locul de muncă, computerul meu de acasă este telecomanda, când stau acasă, computerul de la locul de muncă este la distanță. Serverul și clientul sunt, de asemenea, confuze atunci când vorbim de tunelare. De exemplu, dacă mă conectez la domiciliu de la serviciu cu ssh -R. Mă conectez la serviciu de la computerul de acasă prin conectarea localhost. Deci, din perspectiva prizelor, serverul este chiar computerul de acasă. Dar, logic, m-am conectat la computerul meu de lucru. Acest ‘ este confuz.

Răspuns

Am desenat câteva schițe

Mașina, unde se tastează comanda tunelului ssh se numește »gazda dvs.« .

tunel ssh pornind de la local


tunel ssh pornind de la distanță

Introducere

  1. 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 înseamnă: conectați-vă cu ssh la connectToHost și redirecționați toate încercările de conectare la local sourcePort la portul onPort pe mașina numită forwardToHost, care poate fi accesat de la mașina connectToHost.

  2. la distanță: -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 înseamnă: conectați-vă cu ssh la connectToHost și redirecționați toate încercările de conectare la la distanță sourcePort la port onPort pe aparatul numit forwardToHost, care poate fi accesat de pe aparatul dvs. local.

Opțiuni suplimentare

  • -f spune ssh să se fundalizeze după ce se autentifică, deci nu trebuie să stați în jur rulând ceva pe serverul de la distanță pentru ca tunelul să rămâne în viață.
  • -N spune că doriți o conexiune SSH, dar de fapt nu doriți să rulați nicio comandă la distanță. Dacă tot ce creați este un tunel, atunci includerea acestei opțiuni economisește resurse.
  • -T dezactivează alocarea pseudo-tty, ceea ce este adecvat deoarece nu sunteți încercând să creați un shell interactiv.

Exemplul dvs.

A treia imagine reprezintă acest tunel. Dar computerul albastru numit »gazda ta« reprezintă computerul în care cineva începe tunelul ssh, în acest caz, mașina firewall.

Deci, cereți cuiva să înceapă o conexiune de tunel ssh la mașina dvs. Comanda ar trebui să arate în principiu ca

ssh -R 12345:localhost:22 YOURIP 

Acum tunelul este deschis.Acum vă puteți conecta prin ssh la mașina firewall prin tunel cu comanda

ssh -p 12345 localhost 

care se va conecta la propriul dvs. localhost (mașina dvs.) de pe portul 12345, dar portul 12345 este redirecționat prin tunel în portul 22 al localhost-ului firewall-ului computer (adică computerul firewall în sine).

Comentarii

  • @erik, Cum ați desenat aceste imagini?
  • I am folosit instrumentul de desen vectorial open source numit Inkscape și șoarecii mei (ei bine, de fapt este un trackball: Marble FX de la Logitech).
  • @ghoti: În mod implicit, soclul de ascultare de pe server (în imaginea mea -R, telecomanda galbenă) va fi legat numai de interfața de loopback. Acest lucru poate fi suprascris prin specificarea unei adrese bind. O adresă bind_ goală sau adresa „*” indică faptul că soclul la distanță ar trebui să asculte pe toate interfețele. – Deci, încercați: pe un computer albastru porniți ssh -R 1234:localhost:8000 yellowcomputer. Și, de asemenea, pe mașina albastră porniți python -m SimpleHTTPServer (un simplu server web pe portul 8000). Apoi, într-un browser web de pe mașina galbenă, deschideți adresa URL http://localhost:1234 și veți vedea că funcționează.
  • @erik, ah, partea confuză este pentru că ochii mei sunt rău – ‘ nu vedeam spațiul dinaintea remotehost în comenzile tale. La o inspecție mai atentă, văd că diagramele dvs. nu ‘ nu se adresează deloc adresei opționale bind_address. Ne pare rău pentru confuzie.
  • @briankip Da, desigur. Cel puțin dacă doriți să faceți o conexiune ssh la computerul din spatele firewall-ului (prin tunel sau direct, dacă firewall-ul permite acest lucru). Adică: comanda ssh pe care o scrieți pe computerul firewall deschide doar un tunel, dar nu pornește sau nu funcționează ca ssh-daemon / -server. Următoarea dvs. întrebare ar trebui să fie, cum să porniți un sshd fără privilegii de root (dacă aceasta este problema dvs.). 🙂

Răspuns

tunelarea ssh funcționează utilizând conexiunea ssh deja stabilită pentru trimiterea de trafic suplimentar.

Când vă conectați la un server la distanță, de obicei aveți doar 1 canal pentru interacțiunea normală a utilizatorului (sau 3 canale dacă considerați STDIN / STDOUT / STDERR separate). În orice moment, procesul ssh local sau la distanță poate deschide canale suplimentare pe conexiunea existentă. Aceste canale trimit apoi / primesc traficul tunelului. Când trimiteți sau primiți orice trafic, procesul ssh spune pur și simplu „acest trafic este pentru canalul foobar”.

În esență, funcționează astfel:

  1. Spuneți ssh să înceapă să asculte pe portul XXXX și că orice trafic primit trebuie tunelat, apoi setat la AAAA pe portul ZZZZ.
  2. Ssh-ul local începe să asculte pe portul XXXX (în general pe 127.0.0.1, dar poate fi modificat).
  3. Unele aplicații deschid o conexiune la portul XXXX de pe mașina locală.
  4. Ssh local deschide un canal către ssh la distanță și spune „orice trafic pe acest canal merge la AAAA: ZZZZ
  5. Ssh-ul la distanță se conectează la AAAA: ZZZZ și trimite înapoi „OK, canalul este deschis”
  6. Acum orice trafic trimis de-a lungul conexiunii la port XXXX pe mașina locală este reprezentată de ssh YYYY: ZZZZ.

Acest proces este exact același atât pentru tunelarea directă, cât și pentru cea inversă (schimbați doar cuvintele „local” și „la distanță” în procedura de mai sus). Oricare dintre părți poate porni tunelul nu trebuie să fie nici măcar atunci când pornești ssh. Puteți deschide tuneluri în timp ce ssh rulează deja (consultați ESCAPE CHARACTERS, în special ~C).

Pentru rolul de -R, -f, -L și -N, ar trebui să consultați pagina de manual, vă oferă cea mai bună explicație posibilă. Dar voi menționa -R și -L.
-R spune telecomanda ssh pentru a asculta conexiunile și că ssh-ul local ar trebui să se conecteze la destinația reală. -L spune ssh-ului local să asculte conexiunile și că ssh-ul la distanță ar trebui să se conecteze la destinația reală.

Notă, aceasta este o descriere foarte grosolană, dar ar trebui să vă ofere suficiente informații pentru a ști ce se întâmplă

Răspuns

Acest lucru este explicat în manualul SSH, în special diferențele dintre -L (local) și -R (la distanță).


-L

-L [bind_address:]port:host:hostport

Specifică faptul că portul dat pe gazda locală (client) trebuie să fie redirecționat către gazda dată și port pe partea de la distanță .

Acest lucru funcționează prin alocarea unui socket pentru a asculta portul pe partea locală, opțional legat de adresa bind_address specificată.

Ori de câte ori se face o conexiune la acest port, conexiunea este redirecționată pe canalul securizat și se face o conexiune către host port hostport de la aparatul de la distanță .

Următorul exemplu tunelează o sesiune IRC de la computerul 127.0.0.1 (localhost) utilizând portul 1234 către serverul la distanță server.example.com:

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

Notă: Opțiunea -f backgrounds ssh și comanda la distanță sleep 10 este specificată pentru a permite o perioadă de timp pentru a porni serviciul care urmează să fie tunelat.

Exemplu:

ssh `-N` -L 22000:localhost:11000 remote.server.com 
  • -N După conectare, stai acolo (nu vei primi un prompt de shell)

    Nu executați o comandă la distanță.

  • -L 22000 Conexiunea va proveni din portul 22000 al dvs. personal, L mașină ocală

  • localhost:11000remote.server.com se va asigura că celălalt capăt al tunelului este localhost, port 11000

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

Sursă: Un ghid ilustrat, tutorial, instrucțiuni, privind tunelarea ssh .


-R

-R [bind_address:]port:host:hostport

Specifică faptul că portul dat pe gazda la distanță (server) trebuie să fie redirecționat către g iven host și port pe partea locală .

Acest lucru funcționează prin alocarea unui socket pentru a asculta port pe partea de la distanță și ori de câte ori este realizată o conexiune la acest port, conexiunea este redirecționată pe canalul securizat și o conexiune este făcut în host port hostport de la mașina locală .

Exemplu:

ssh -N -R 22000:localhost:11000 remote.server.com 
  • -N După ce vă conectați, stați acolo (nu veți primi un mesaj shell)

    Nu executați o comandă la distanță.

  • -R 22000 Conexiunea va avea originea pe portul 22000 al computerului emote R (în acest caz, remote.server.com)

  • computerul dvs. personal, local, se va asigura că celălalt capăt al tunelului este localhost, port 11000

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

Sursă: Un ghid ilustrat, tutorial, instrucțiuni, privind tunelarea ssh .

Comentarii

  • urechea și gura fac clar ca cine ‘ vorbește și cine ‘ ascultă!
  • Îmi plac ilustrațiile!

Răspunde

Legarea la interfețele de rețea în timp ce stabiliți tuneluri SSH inverse este explicată în acest post . Iată un exemplu cu 4 computere care locuiesc în două rețele diferite:

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *