Nighthawk.dk

Reverse tunneling med SSH

Skrevet d. 19. Aug. 2020 af Claus Nielsen.

Der er ikke altid muligt at forbinde til en remote host med SSH, hvis det f.eks. er en remote host, som er gemt bag en NAT router. I sådan et tilfælde kan man bruge en reverse SSH tunnel.

Lad os antage et scenarie med følgende maskiner forbundet til et netværk (f.eks. Internettet):

  • local - Den computer, man sidder ved.
  • remote1 - En remote host man gerne vil tilgå med SSH.
  • remote2 - En remote host man gerne vil tilgå med SSH.
  • public - En remote host som kan tilgås via SSH fra alle de andre maskiner.

Maskinerne public, remote1 og remote2 skal have en SSH-server installeret for at kunne acceptere SSH-connections, og dette kan (afhængigt af din Linux-distribution) evt. gøres vha.:

sudo apt-get install openssh-server

Desuden skal du også sikre dig at SSH-serveren kører, f.eks. med:

sudo systemctl start sshd

Derefter kan følgende script lægges på remote1 og remote2:

#!/bin/bash
PORT="42000"
PUBLIC="username@46.101.227.210"
ssh -R $PORT:localhost:22 $PUBLIC

Sørg for at sætte to forskellige portnumre for remote1 og remote2, lad os sige port 42001 for remote1 og 42002 for remote2. Ret også "PUBLIC" så den peger på public-maskinen med korrekt SSH-login.

Når du kører scriptet på remote1 og remote2 skulle de oprette reverse SSH tunnels til public, så hvis du logger ind på public med SSH skulle du kunne se to aktive sockets med LISTEN status når du kører følgende kommando:

sudo netstat -tnpa | grep ssh

Du kan nu forbinde til remote1 eller remote2 fra public således:

# Connect to remote1
ssh localhost -p 42001

# Or connect to remote2 instead
ssh localhost -p 42002