Som jag förstår detta nekar brandväggar (förutsatt standardinställningar) all inkommande trafik som inte har motsvarande utgående trafik.
Baserat på Omvänd en ssh-anslutning och SSH-tunnling görs enkelt , omvänd SSH-tunnel kan användas för att få kring irriterande brandväggsbegränsningar.
Jag vill utföra skalkommandon på en fjärrmaskin. Fjärrmaskinen har sin egen brandvägg och ligger bakom en ytterligare brandvägg (router). Den har en IP-adress som 192.168.1.126 (eller något liknande). Jag står inte bakom en brandvägg och jag känner till fjärrmaskinens IP-adress sett från Internet (inte 192.168.1.126-adressen). Dessutom kan jag be någon att köra ssh (something)
som rot på fjärrmaskinen först.
Kan någon förklara mig, steg för steg, hur omvänd SSH-tunnling fungerar för att komma runt brandväggarna (lokala och avlägsna maskiners ”brandväggar och den extra brandväggen mellan dem)?
Vilken roll har omkopplarna (-R
, -f
, -L
, -N
)?
Kommentarer
- Relaterat (hur): Hur kan jag konfigurera en omvänd SSH-anslutning till den anslutande datorn?
Svar
Jag älskar att förklara den här typen av saker genom visualisering. 🙂
Tänk på dina SSH-anslutningar som rör. Stora rör. Normalt kommer du att sträcka dig genom dessa rör för att köra ett skal på en fjärrdator. Skalet körs i en virtuell terminal (tty). Men du känner till den här delen redan.
Tänk på din tunnel som ett rör i ett rör. Du har fortfarande den stora SSH-anslutningen, men med alternativet -L eller -R kan du ställa in ett mindre rör inuti det.
Varje rör har en början och ett slut. Det stora röret, din SSH-anslutning, startade med din SSH-klient och hamnar på SSH-servern du har anslutit till. Alla mindre rör har samma slutpunkter, förutom att rollen som ”start” eller ”end” bestäms av om du använde -L
eller -R
(respektive) för att skapa dem.
(Du har inte sagt, men jag antar att den ”avlägsna” maskin du har nämnt, den bakom brandväggen, kan komma åt Internet med hjälp av nätverksadressöversättning (NAT). Detta är ganska viktigt, så korrigera detta antagande om det är falskt.)
När du skapar en tunnel anger du en annons klädsel och port som den kommer att svara på, och en adress och port som den kommer att levereras till. Alternativet -L
säger till tunneln att svara på tunnelns lokala sida (värden som kör din klient). Alternativet -R
säger till tunneln att svara på fjärrsidan (SSH-servern).
Så … För att kunna SSH från Internet till en maskin bakom en brandvägg behöver du maskinen i fråga för att öppna en SSH-anslutning till omvärlden och inkludera en -R
tunnel vars” ingångspunkt ”är den” avlägsna ”sidan av hans anslutning.
Av de två modellerna som visas ovan vill du ha den till höger.
Från den brandväggade värden:
ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com
Detta berättar för din klient att skapa en tunnel med en -R
emote-post punkt. Allt som fästs vid port 22222 längst bort i tunneln når faktiskt ”localhost port 22”, där ”localhost” är ur perspektivet för tunnelns utgångspunkt (dvs. din ssh-klient).
De andra alternativen är:
-
-f
säger till ssh att bakgrunden själv efter att den har autentiserats, så du behöver inte sitta och köra något på fjärrserver för att tunneln ska förbli vid liv. -
-N
säger att du vill ha en SSH-anslutning, men du vill faktiskt inte köra några fjärrkommandon. Om allt du skapar är en tunnel sparar du resurser genom att inkludera detta alternativ. -
-T
inaktiverar pseudo-tty-allokering, vilket är lämpligt eftersom du inte är försöker skapa ett interaktivt skal.
Det kommer att bli en lösenordsutmaning om du inte har ställt in DSA- eller RSA-nycklar för en lösenordsfri inloggning.
Observera att den är STARKT rekommenderade att du använder ett bortkastningskonto (inte din egen inloggning) som du har ställt in för just denna tunnel / kund / server.
Nu från ditt skal på yourpublichost , upprätta en anslutning till den brandväggade värden genom tunneln:
ssh -p 22222 username@localhost
You ”ll få en värdnyckelutmaning, eftersom du förmodligen aldrig har träffat den här värden tidigare. Då får du en lösenordsutmaning för username
-kontot (om du inte har ställt in nycklar för inloggning utan lösenord).
Om du kommer åt den här värden regelbundet kan du också förenkla åtkomsten genom att lägga till några rader i din ~/.ssh/config
-fil:
host remotehostname User remoteusername Hostname localhost Port 22222
Justera remotehostname
och remoteusername
så att de passar. remoteusername
-fältet måste matcha ditt användarnamn på fjärrservern, men remotehostname
kan vara vilket värdnamn som helst som passar dig, det behöver inte matcha något som kan lösas.
Se även:
- Exponera den omvända slutpunkten på en icke-lokal värd IP
- Tips om hur du använder
ControlMaster
för att underhålla din tunnel
Kommentarer
- hur är det med ssh -D. Förklara med samma metod.
- SOCKS-proxyservrar är inte samma som tunnlar. Om du har en fråga om hur du använder dem, vänligen ställa den .
- Jag ’ jag har mycket svårt att följa den här förklaringen på grund av den lösa användningen av termer: server, klient, lokal maskin, fjärrmaskin, värd, dinpublichost, localhost, remotehostname. Med alla dessa lösa och odefinierade termer kan man anta att någon skulle behöva så mycket som åtta datorer för att ställa in detta. Jag säger detta eftersom det i alla andra aspekter verkar vara en mycket bra förklaring. Vänligen minska och definiera termer.
- @ Rucent88, jag ’ är inte säker på vilken minskning som skulle vara möjlig. En klient upprättar en anslutning till en server. Den ’ gemensamma terminologin över hela nätverksvärlden. Lokala och avlägsna maskiner verkar ganska självklara. Om du ’ är förvirrad över SSH eller allmän unix-terminologi efter att ha läst dokumentationen, är jag ’ säker på att du ’ Jag har inga problem med att hitta människor här som är mycket villiga att svara på alla frågor du har.
- @ghoti Det ’ är verkligen förvirrande, för lokalt och fjärrmaskiner är relativa. När jag sitter på arbetsplatsen är min hemdator fjärrkontrollen, när jag sitter hemma är arbetsplatsens dator fjärrkontroll. Server och klient är också förvirrande när man talar om tunnling. Till exempel om jag ansluter hem från jobbet med ssh -R. Jag ansluter till mitt arbete från hemdatorn genom att ansluta localhost. Så från sockelperspektiv är servern hemdator själv. Men logiskt sett anslöt jag mig till min arbetsdator. Det ’ är förvirrande.
Svar
Jag har ritat några skisser
Maskinen, där ssh-tunnelkommandot skrivs, heter »din värd« .
Introduktion
-
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
betyder: anslut med ssh tillconnectToHost
och vidarebefordra alla anslutningsförsök till lokaltsourcePort
till portonPort
på maskinen som heterforwardToHost
, som kan nås frånconnectToHost
-maskinen. -
fjärrkontroll:
-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
betyder: anslut med ssh tillconnectToHost
och vidarebefordra alla anslutningsförsök till fjärrkontrollsourcePort
till portonPort
på maskinen som heterforwardToHost
, som kan nås från din lokala maskin.
Ytterligare alternativ
-
-f
säger till ssh till bakgrunden efter att den har autentiserats, så du behöver inte sitta och köra något på fjärrservern för att tunneln ska förbli vid liv. -
-N
säger att du vill ha en SSH-anslutning, men du vill faktiskt inte köra några fjärrkommandon. Om allt du skapar är en tunnel sparar du resurser genom att inkludera detta alternativ. -
-T
inaktiverar pseudo-tty-allokering, vilket är lämpligt eftersom du inte är försöker skapa ett interaktivt skal.
Ditt exempel
Den tredje bilden representerar denna tunnel. Men den blå datorn som heter »din värd« representerar datorn där någon startar ssh-tunneln, i det här fallet den brandväggade maskinen.
Så be någon att starta en ssh-tunnelanslutning till din maskin. Kommandot ska i princip se ut
ssh -R 12345:localhost:22 YOURIP
Nu öppnas tunneln.Nu kan du ansluta via ssh till den brandväggade maskinen genom tunneln med kommandot
ssh -p 12345 localhost
som kommer att ansluta till din egen localhost
(din maskin) på port 12345
, men port 12345
vidarebefordras genom tunneln till port 22 på localhost för den brandväggade dator (dvs. den brandväggade datorn i sig).
Kommentarer
- @erik, hur ritade du dessa bilder?
- I använde vektorritningsverktyget med öppen källkod som heter Inkscape och mina möss (ja det är faktiskt en trackball: Marble FX från Logitech).
- @ghoti: Som standard kommer lyssningsuttaget på servern (i min -R-bild den gula fjärrvärden) endast att vara bunden till loopback gränssnittet . Detta kan åsidosättas genom att ange en bind_adress. En tom bindeadress eller adressen * indikerar att fjärrkontakten ska lyssna på alla gränssnitt. – Så prova bara: Starta
ssh -R 1234:localhost:8000 yellowcomputer
på en blå dator. Och även på den blå maskinen startarpython -m SimpleHTTPServer
(en enkel webserver på port 8000). Öppna sedan webbadressen i en webbläsare på den gula maskinenhttp://localhost:1234
så ser du att den fungerar. - @erik, ah, den förvirrande delen beror på att mina ögon är dåligt – jag såg ’ jag såg inte utrymmet före
remotehost
i dina kommandon. Vid en närmare granskning ser jag att dina diagram inte ’ faktiskt inte adresserar den valfria bindningsadressen alls. Ledsen för förvirringen. - @briankip Ja, naturligtvis. Åtminstone om du vill skapa en ssh-anslutning till datorn bakom brandväggen (genom tunneln eller direkt, om brandväggen tillåter det). Det vill säga: ssh-kommandot du skriver på den brandväggade datorn öppnar bara en tunnel, men startar inte eller fungerar som en ssh-daemon / -server. Din nästa fråga bör vara, hur man startar en sshd utan root-behörigheter (om det är ditt problem). 🙂
Svar
ssh-tunnling fungerar med den redan etablerade ssh-anslutningen för att skicka ytterligare trafik.
När du ansluter till en fjärrserver har du vanligtvis bara en kanal för normal användarinteraktion (eller 3 kanaler om du anser att STDIN / STDOUT / STDERR är separat). När som helst kan den lokala eller fjärrstyrda ssh-processen öppna ytterligare kanaler på den befintliga anslutningen. Dessa kanaler skickar / tar sedan emot tunneltrafiken. När du skickar eller tar emot trafik säger ssh-processen helt enkelt ”den här trafiken är för kanalfobar”.
Det fungerar i princip så här:
- Du säger till ssh att börja lyssna på port XXXX och att all mottagen trafik ska tunneleras och sedan ställas till YYYY på port ZZZZ.
- Den lokala ssh börjar lyssna på port XXXX (vanligtvis på
127.0.0.1
, men kan ändras). - Vissa program öppnar en anslutning till port XXXX på den lokala maskinen.
- Den lokala ssh öppnar en kanal till fjärr-ssh och säger ”all trafik på den här kanalen går till ÅÅÅÅ: ZZZZ
- Fjärrkontrollen ssh ansluter till ÅÅÅÅ: ZZZZ och skickar tillbaka ”OK, kanalen är öppen”
- Nu skickas all trafik längs anslutningen till port XXXX på den lokala maskinen proxies av ssh till YYYY: ZZZZ.
Denna process är exakt densamma för både framåt och bakåt tunnling (byt bara orden ”lokal” och ”fjärr” i ovanstående procedur). Båda sidor kan starta tunneln behöver inte ens vara när du börjar ssh. Du kan öppna tunnlar medan ssh redan körs (se ESCAPE CHARACTERS
, specifikt ~C
).
För rollen som -R
, -f
, -L
och -N
, du borde verkligen konsultera mansidan, det ger dig bästa möjliga förklaring. Men jag nämner -R
och -L
.
-R
berättar fjärrkontrollen ssh för att lyssna efter anslutningar och att den lokala ssh ska ansluta till den verkliga destinationen. -L
ber den lokala ssh att lyssna efter anslutningar, och att fjärr-ssh ska ansluta till den verkliga destinationen.
Obs, detta är en väldigt grov beskrivning, men den borde ge dig tillräckligt med information för att veta vad som händer
Svar
Detta förklaras i SSH-manualen, särskilt skillnaderna mellan -L
(lokal) och -R
(fjärrkontroll).
-L
-L [bind_address:]port:host:hostport
Anger att -porten på den lokala (klient) värden ska vidarebefordras till den givna värden och port på fjärrsidan .
Detta fungerar genom att tilldela ett uttag för att lyssna på port på den lokala sidan, eventuellt bunden till den angivna bindningsadressen.
När en anslutning görs till den här porten, anslutningen vidarebefordras över den säkra kanalen och en anslutning görs till
host
porthostport
från fjärrmaskinen .
Följande exempel tunnlar en IRC-session från klientdator 127.0.0.1
(localhost
) med port 1234 till fjärrserver server.example.com
:
$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10
Obs! Alternativet -f
bakgrunder ssh och fjärrkommandot sleep 10
är specificerat för att tillåta en tid att starta tjänsten som ska tunnlas.
Exempel:
ssh `-N` -L 22000:localhost:11000 remote.server.com
-
-N
När du har anslutit är det bara att hänga där (du får inte en shell-prompt)Kör inte ett fjärrkommando.
-
-L 22000
Anslutningen kommer från port 22000 i din personliga, L ocal machine -
localhost:11000
–remote.server.com
ser till att tunnelns andra ände ärlocalhost
, port11000
Källa: En illustrerad guide, handledning, hur man gör, om ssh-tunnling .
-R
-R [bind_address:]port:host:hostport
Anger att den -porten på fjärrvärden (server) som ska vidarebefordras till g iven värd och port på den lokala sidan .
Detta fungerar genom att tilldela ett uttag för att lyssna på
port
på fjärrsidan, och när en anslutning görs till den här porten, vidarebefordras anslutningen över den säkra kanalen och en anslutning görs tillhost
porthostport
från den lokala maskinen .
Exempel:
ssh -N -R 22000:localhost:11000 remote.server.com
-
-N
När du ansluter är det bara att hänga där (du får inte en shell-prompt)Kör inte ett fjärrkommando.
-
-R
22000 Anslutningen kommer på port 22000 på R emote-dator (i det här fallet remote.server.com) -
din personliga, lokala dator ser till att den andra änden av tunneln är
localhost
, port11000
Källa: En illustrerad guide, handledning, hur man gör, om ssh-tunnling .
Kommentarer
- örat och munnen gör det kristallklart vem ’ talar och som ’ lyssnar!
- Jag älskar dina illustrationer!
Svar
Bindning till nätverksgränssnitt vid upprättande av omvända SSH-tunnlar förklaras i detta inlägg . Här är ett exempel med fyra datorer som finns i två olika nätverk: