SSH

Me encontraba en el siguiente escenario. Necesitaba conectarme por SSH a un servidor por el puerto 8666, pero a través de otro servidor que tenía acceso a la red del servidor destino. En otras palabras, necesitaba redireccionar el puerto 22 del servidor intermedio al puerto 8666 del servidor destino. De este modo, cuando me conectara al servidor A por el puerto 22, en realidad estaría conectándome al servidor B por el puerto 8666. Parece un caso extraño, pero es más común de lo que parece.

En realidad estamos redireccionado puertos, y en linux disponemos de varias herramientas. Personalmente prefiero usar socat.

Para resolver el problema, simplemente ejecutamos el siguiente comando en el servidor intermedio:

socat TCP-LISTEN:22,fork TCP:mi-servidor-destino.com:8666
  • TCP-LISTEN:22,fork escucha en el puerto 22 y crea un proceso hijo para cada conexión.
  • TCP:mi-servidor-destino.com:8666 redirige la conexión al servidor destino en el puerto 8666.

Para que el comando se inicie automáticamente al arrancar el servidor, podemos creamos un servicio systemd en /etc/systemd/system/socat-ssh-reverse-proxy.service con el siguiente contenido:

[Unit]
Description=Socat SSH Reverse Proxy
After=network.target

[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:22,fork TCP:mi-servidor-destino.com:8666
Restart=always
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target

A continuación, habilitamos el servicio y lo iniciamos:

systemctl daemon-reload
systemctl enable socat-ssh-reverse-proxy
systemctl start socat-ssh-reverse-proxy

Ahora cuando haga ssh yo@servidor-intermedio.com en realidad estaré conectándome a ssh yo@mi-servidor-destino.com:8666.

¡Fácil!