Hem > Guider, Linux, Mac > Reverse SSH tunnel kringgår NAT brandväggar på jobbet

Reverse SSH tunnel kringgår NAT brandväggar på jobbet

Guide: Ssh-server bakom NAT-brandvägg med autosshIbland behöver jag komma åt min arbetsdator på jobbet för att exempelvis hämta filer som jag behöver eller köra igång ett bash-script. Problemet är att min arbetsdator sitter bakom en NAT brandvägg som jag inte kommer åt för att göra port forwarding. Det går utmärkt att skapa SSH-uppkoppling och tunnel från jobbdatorn till min server hemma eller annan extern server utan problem. Den lösning som fungerade bäst för mig är att köra en så kallad ”reverse SSH tunnel”, och som namnet antyder är det en omvänd SSH-tunnel. I denna artikel tänker jag visa hur man skapar en sådan tunnel, hur man använder den och tips på hur man med autossh får den tunneln fungerande även om uppkopplingen förloras.

Innan du börjar…

Innan jag går in på hur man sätter upp en reverse ssh tunnel behöver vi gå igenom de termer som jag använder mig av i artikeln samt vad för förutsättningar som behövs för att sätta upp tunneln.

Klientdator

Den dator för att komma åt jobbdatorn. Enda kravet är ssh-klient finns installerad. Det är möjligt att använda sig av Putty för att koppla upp sig mot en reverse ssh tunnel om man sitter med Windows-operativsystem, dock är det inget som jag provat eller kommer att ta upp.

Jobbdator

Den dator du vill komma åt från klientdatorn och som sitter bakom en brandvägg eller motsvarande hinder. Det viktiga för att detta ska fungera är att det finns möjlighet till upprätta en ssh uppkoppling till relay-servern (förklaring nedan), samt att det finns en SSH-server installerad på datorn. För installation och hur man säkrar upp ssh-server kan läsa min guide om hur man installerar och säkra ssh-server.

Relay-server

Den server som ska fungera som en mellanhand och sköter trafiken mellan klient- och jobbdator. Det viktiga är att relay-servern kan komma åt både från klienten och jobbdatorn. Förutom ssh-server kräver den även tillgång till konfigurationsfiler samt möjlighet att öppna portar i eventuell brandvägg, vilket oftast innebär krav på root-access eller motsvarande.

En relay-server kan man både sätta upp loktalt på klientdatorn (om jobbdatorn kommer åt den), eller använda sig av en separat server. En billig Linuxbaserad VPS med exempelvis 128 mb ram fungerar utmärkt som relay-server, då kan den kan vara igång 24/7 för att båda hålla igång anslutningen till jobbdatorn samt göra den tillgänglig för andra klienter om så önskas.

1. Sätt upp relay-server

Logga in och installera ssh-server om det inte är redan gjort. Lägg till följande till ssh-server konfigurationsfilen (/etc/ssh/sshd_config):

AllowTcpForwarding yes
GatewayPorts yes

Om man ska förklara dessa inställningar kort och förenklat; AllowTcpForwarding tillåter att skapa tunnlar och GatewayPorts gör att andra datorer som är inloggade via ssh till datorn kan skicka sin egna trafik genom den uppkopplingen.

2. Koppla upp mot relay-server

Nu när relay-servern är uppe och rullar ska vi prova om det går att koppla upp den och upprätta en reverse ssh tunnel från jobbdatorn. Ett exempel på hur kommandot ska se ut:

ssh -R 4321:localhost:22 relay-användarnmn@din-relay-server.se -p 22

Vi bryter ned kommandot en aning:

  • -R 4321 – Skapa en reverse ssh tunnel med port 4321. Denna port används av klientdatorn för att koppla upp sig mot tunneln. Man kan om man vill välja ett annat portnummer om man vill. Det viktiga är att det är en port som har nummer 1025 eller högre samt att eventuell brandvägg på relay-servern släpper igenom trafiken.
  • localhost:22 – Kopplar upp sig mot jobbdatorn lokala ssh-server. Kör servern någon annan port än 22 så ska man ställa in det, annars låt den vara
  • relay-användarnmn@din-relay-server.se – Användarnamn och adress till relay-servern.
  • -p 22 – Om en annan port än 22 körs av relay-serverns ssh-server bör 22 bytas ut mot den relay-serverns port.

3. Koppla upp mot relay från klient

Nu när vi har en reverse ssh tunnel igång kan vi prova att koppla upp oss till den. Det gör vi med detta kommando:

ssh jobbdator-användarnman@din-relay-server.se -p 4321

Detta kan se lite förvirrande ut i första anblick, men det vi gör med detta kommando är att logga in direkt mot jobbdatorn. Men istället för att använda jobbdatorns ip-adress använder vi relay-serverns adress och port. Det viktiga är att porten (4321 i detta fall) matchar med den port som satts med hjälp av -R  ovan.

4. Tillförlitlig tunnel med autossh

Om ditt mål med en reverse ssh tunnel en kortvarig och tillfällig lösning på ett problem kan du sluta läsa då inga ytterligare åtgärder behövs. För den som vill sätta upp en långvarig tunnel finns det ett problem med metoden i steg 2. Så fort som kontakten mellan relay-servern och jobbdator bryts av någon anledning kommer tunneln sluta fungera. Det enda sättet att få igång den igen är att upprätta en ny anslutning. Sitter man på sin klientdator och inte har något annat sätt att koppla upp mot jobbdatorn än via reverse ssh tunnel så är man körd.

Detta är ett problem som autossh löser. Det den gör är att den bevakar en uppkoppling och se till att den fungerar. Blir det av någon anledning ett avbrott i uppkopplingen så kommer den automatiskt försöka ansluta sig på nytt till servern. I vårt fall så kommer den alltid se till att en reverse ssh tunnel alltid igång mellan jobbdatorn och relay-servern. Dock för detta ska vara möjlig måste jobbdatorn jobba med publika nycklar istället för lösenord. Läs mer hur man gör publika nycklar. Nycklarna ska skapas på jobbdatorn och den publika nyckeln ska kopieras till relay-servern.

När nycklarna är på plats kan vi börja installera autossh på jobbdatorn. Om den kör linux med apt-get som pakethanterare (ex. Ubuntu) kan man köra följande kommando:

sudo apt-get install autossh

Sitter man på Mac kan man antingen installera med Homebrew med hjälp av terminalen (Program -> Verktygsprogram -> Terminal):

sudo brew install autossh

Eller kompilera den själv med från källkod:

gunzip -c autossh-*.tgz | tar xvf -
cd autossh-*
./configure
make
sudo make install

5. Använda autossh med reverse ssh tunnel

Innan vi kör igång en ny tunnel bör du stänga av den ssh-tunnel som satts igång i steg 2. Detta kan göras genom att köra ”exit” eller stänga terminalfönstret. Nu till det kommando som ska ersätta steg 2:

autossh -M 20000 -NTf -R 4321:localhost:22 relay-användarnmn@din-relay-server.se -p 22

Ännu en gång bryter vi ned kommandot:

  • -M 20000 – Den port som används för att övervaka tunneln. Denna port kan sättas till ett annat nummer om man vill. Huvudsaken är att brandväggen släpper igenom trafiken på relay-servern.
  • -NTf – Kör ssh-tunneln i bakgrunden. Om man vill kan man ta bort dessa parametrar för att enkelt testa och stänga ned ssh-tunneln.

För klienten innebär det ingen skillnad, man använder precis samma kommando som i steg 3.

6. Starta tunnel vid uppstart

Nu när autossh är igång på jobbdatorn så kommer den se till att tunneln hålls upprättad så länge som det finns en internetuppkoppling. Dock om man nu startar om jobbdatorn kommer den anslutningen sluta fungera tills man kör kommandot i steg 5. För att den ska köras vid varje uppstart finns det olika sätt att gå tillväga.

Linux

Med @reboot i cronjob kan man snabbt och enkelt köra kommandon och skripts vid uppstart. Lägg till följande i cronjob (kör crontab -e):

@reboot /usr/bin/autossh -M 20000 -NTf -R 4321:localhost:22 relay-användarnmn@din-relay-server.se -p 22

Det jag har gjort är att ta kommandot från steg 5 och lagt till ”@reboot /usr/bin/” i början. Prova att starta om datorn och kontrollera att tunneln fungerar. Kör antingen kommandot i steg 3 eller kör följande kommando:

ps aux | grep autossh

Om det inte fungerar, kontrollera sökvägen till autossh med:

type autossh

Mac

OS X har crontab inbyggt och fungerar på liknade sätt som Linux. Öppna en terminal och prova köra följande:

crontab -e

Om det fungerar, följ instruktionerna för Linux.

Om det inte fungerar så kan man istället skapa ett program med Automator:

A. Öppna Automator och välj ”Program”

Automator program steg 1

B. Dubbelklicka ”Kör kommandotolkskript”

Automator program steg 2

Använd kommandot i steg 5 och mata in den. Det är viktigt att ange den absoluta sökvägen till autossh. Om installationen gjordes med Homebrew, lägg då till ”/usr/local/bin/” innan autossh.

Om du har kompilerat den själv eller om det är fel sökväg, prova köra ”type” för att hitta sökvägen:

type autossh

Resultatet bör se ut något i stil med följande:

autossh is /usr/bin/autossh

I detta fall, lägg till /usr/bin/.

Spara sedan programmet på valfri plats.

C. Gå in under Systeminställningar

Under Användare & grupper bör du hitta en flik som heter ”Startobjekt”. Välj den och tryck sedan på plus-knappen och välj  programmet som du skapade. Se till och bocka i programmet och stäng sedan inställningar.

D. Starta om

Nu ska det fungera. För att kontrollera om tunneln fungerar kan man göra ett test genom att använda kommandot som finns i steg 3. Ett annat sätt är att se i aktivitetskontrollen om autossh är igång.

Bonus: Utnyttja reverse ssh tunneln som proxy-server

Om man vill använda jobbdatorn som en proxyserver. För klientdatorn så behövs enbart lägga till D-parmetern på det kommando som vi använde i steg 2. Något i stil med följande:

ssh jobbdator-användarnman@din-relay-server.se -p 4321 -D 4444

Port 4444 kan man byta ut till vilken port som helst som är nummer 1025 eller högre. Detta portnummer använder du för att ställa in en SOCKS v5. proxy i den applikation du tänkt köra trafiken genom tunneln.

Frågor och feedback

Har du några frågor eller vill ge feedback skriv det helst som en kommentar nedan. Det går även bra att kontakta mig direkt via kontaktsidan.

Categories: Guider, Linux, Mac Taggar: , , , , , ,
  1. april 30th, 2014 i 09:35 | #1

    Härligt! Äntligen en begriplig beskrivning av reverse-SSH.

  1. Inga trackbacks än.