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
- În legătură (cum): Cum pot configura o conexiune SSH inversă la computerul de conectare?
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).
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:
- Expune punctul final invers pe un non-localhost IP
- Sfaturi despre utilizarea
ControlMaster
pentru a vă întreține tunelul
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.« .
Introducere
-
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 laconnectToHost
și redirecționați toate încercările de conectare la localsourcePort
la portulonPort
pe mașina numităforwardToHost
, care poate fi accesat de la mașinaconnectToHost
. -
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 laconnectToHost
și redirecționați toate încercările de conectare la la distanțăsourcePort
la portonPort
pe aparatul numitforwardToHost
, 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țipython -m SimpleHTTPServer
(un simplu server web pe portul 8000). Apoi, într-un browser web de pe mașina galbenă, deschideți adresa URLhttp://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:
- Spuneți ssh să înceapă să asculte pe portul XXXX și că orice trafic primit trebuie tunelat, apoi setat la AAAA pe portul ZZZZ.
- Ssh-ul local începe să asculte pe portul XXXX (în general pe
127.0.0.1
, dar poate fi modificat). - Unele aplicații deschid o conexiune la portul XXXX de pe mașina locală.
- Ssh local deschide un canal către ssh la distanță și spune „orice trafic pe acest canal merge la AAAA: ZZZZ
- Ssh-ul la distanță se conectează la AAAA: ZZZZ și trimite înapoi „OK, canalul este deschis”
- 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
porthostport
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:11000
–remote.server.com
se va asigura că celălalt capăt al tunelului estelocalhost
, port11000
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 înhost
porthostport
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
, port11000
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!