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
ayes
, por defecto viene comono
.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 que0.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
yhttps
para que escuchen en local (por seguridad): ssh
con las opcionesListenPort
yListenAddress
.https
con nginx la opción listen admite una iplisten 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) parahttps
.
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.