HTTPS y SSH por el mismo puerto

Los servicios de un servidor deben ocupar un puerto de este, el problema reside en que cada puerto que dejamos abierto es como dejar una puerta o una ventana de nuestra casa abierta. Si por ejemplo dejamos SSH abierto en el 22 tenemos la puerta abierta porque está en el puerto por defecto pero si lo ponemos en el 1000 esta la ventana del bajo abierta.

Así que una de las tareas a hacer con nuestro servidor es dejar el menor número de estos abierto y una de las formas es multiplexar varios servicios en un mismo puerto usando un multiplexador.

Requisitos

  • Saber usar la shell de linux.
  • Saber conectarte por ssh a una maquina.
  • Voy a suponer que usas una distribución basada en Debian, en cualquier otro caso debes usar tú gestor de paquetes o compilar el programa (no se explicará como compilarlo).

Antes de empezar

Esto no es para novatos, hay que tener unos conocimientos mínimos de como administrar un sistema linux.

Se usará como promp para la línea de comandos # para indicar que lo ejecuta el usuario root y $ para indicar que lo ejecuta un usuario normal.

Instalación y configuración

  • Lo primero es instalar el programa multiplexor, se llama sslh (de ssl + ssh):
# apt install sslh
  • Una vez tengamos el paquete instalado debemos configurar sslh, para ello editaremos el archivo /etc/default/sslh:
RUN=yes  
DAEMON=/usr/sbin/sslh  
DAEMON_OPTS="--user sslh --listen ip_publica:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"  

Hay que cambiar los siguientes valores:

  • RUN a yes, por defecto viene como no.
  • DAEMON_OPTS, por los valores que tengas. Es importante que en --listen pongas tu ip pública o pongas otro puerto para https en tú servidor web, ya que 0.0.0.0 escucha todas las ips (privadas y publicas) y no te dejará iniciar uno de los dos servicios (el último que intentes arrancar).
  • En último lugar debes cambiar las configuraciones del servicio ssh y https para que escuchen en local (por seguridad):
  • ssh con las opciones ListenPort y ListenAddress.
  • https con nginx la opción listen admite una ip listen ip:puerto opciones; yo me hice un snippet y el servidor por defecto lo configuré a mano, recuerdo que siempre hay que tener un servidor por defecto (default) para https.

Iniciando el servicio

Antes de inciarlo asegurate que funciona, simplemente en el SSH añade configuración sin quitar lo viejo. En mi caso ssh funcionaba en otro puerto distinto al 22 y probe sslh con ese puerto primero. Lo más importante es que ssh no falle para evitar tener que recuperar el servidor. Una vez hayas hecho la prueba entonces deja ssh escuchando solo la ip local (127.0.0.1).

Vamos allá:

# /etc/init.d/ssh restart
# /etc/init.d/nginx restart
# /etc/init.d/sslh restart

Conclusión

Esto mismo se puede hacer perfectamente con HAProxy. Si bien SSLH es más ligero que HAProxy puede resultar interesante usar HAProxy para prescindir de Nginx al usar contenedores Docker.