sshttpd: SSH y HTTP/SMTP en el mismo puerto

¿Tienes un servidor en la DMZ o red interna al que sólo se puede acceder externamente por HTTP? ¿Necesitas acceder también por SSH para administrar el servidor (o pivotar a través de él) pero el firewall sólo permite el acceso a un único puerto? No hay problema, con sshttpd es posible multiplexar dos protocolos para acceder a ambos por el mismo puerto:

- SSH/HTTP
- SSH/HTTPS
- SSH/SMTP (sin banners SMTP multilínea)
- HTTPS SNI multiplexing
- SSH/HTTPS con SNI multiplexing

El multiplexado se realiza en la misma dirección IP/IP6 a la que se conectan desde el exterior, así que básicamente sólo cambian los puertos según el servicio detectado.
Podríamos decir que sshttpd es un demonio de conmutación o switching que trabaja en la capa 5 OSI. En el ejemplo más común, se ejecuta de forma transparente en HTTP(S) (opción -L, por defecto 80) y decide si las conexiones entrantes son tráfico SSH o HTTP(S). Si es tráfico HTTP (S) lo redirecciona al puerto definido en HTTP_PORT (-H, por dec 8080) y si el tráfico es SSH a SSH_PORT (-S, por defecto 22), respectivamente.

Instalación y uso

Primero hay que asegurarse de tener la última versión disponible del kernel de Linux y tener instalado nf-conntrack así como libcap y libcap-devel (función capability).

$ git clone https://github.com/stealth/sshttp.git
$ cd sshttp
$ make

Luego hay que editar el script nf-setup indicando el interfaz de red y los puertos (22 y 8080 van bien para el caso de SSH/HTTP) y ejecutarlo para instalar las reglas de proxy (iptables y rutas).
Ni que decir tiene que sshd debe ejecutarse en $SSH_PORT y el servidor web en $HTTP_PORT indicados, y luego ejecutar sshttpd (como root):

# ./nf-setup
Using network device eth0
Setting up port 22 ...
Setting up port 8080 ...
# ./sshttpd -S 22 -L 80 -H 8080 -U nobody -R /var/empty
sshttpd: Using HTTP_PORT=8080 SSH_PORT=22 and local port=80. Going background. Using caps/chroot.
#

Si lo que se quiere es multiplexar SMTP con sshttpd, hay que indicar el puerto 25 con el parámetro -L, 2525 con el parámetro -H y configurar el demonio SMTP para escuchar en 2525. A continuación, editar el script ns-setup para que coincida con estos puertos. En el Makefile, cambiar también SMTP_DOMAIN y SSH_BANNER según necesidades (SSH_BANNER debe coincidir exactamente con el que ejecuta sshd). El multiplexado de SMTP/SSH se ha probado con el cliente OpenSSH y el cliente y el servidor Postfix.

Cuando se multiplexan conexiones IPv6, la configuración es básicamente la misma, sólo hay que usar nf6-setup e invocar sshttpd con -6.

Configuración de proxy transparente

Se puede ejecutar sshttpd en la puerta de enlace como si fuera un proxy transparente y que multiplexe todo el tráfico HTTP(S)/SSH hacia la LAN interna. Para ello, sólo hay que ejecutar sshttpd -T y usar nf-tproxy en lugar de nf-setup como plantilla de instalación FW. Tener en cuenta que hay que configurar con cuidado nf-tproxy para no perder la conexión, y todos los dispositivos de red y las direcciones IP deben corresponder con las opciones correspondientes.

SNI Mux

Con sshttpd también se puede hacer multiplexado basado en el SNI HTTPS. Sólo hay que configurar el nf-setup para contener los puertos SNI (ya hay ejemplos) e invocar sshttpd con el parámetro -N name:port.

Por ejemplo el comando "sshttpd -S 22 -H 4433 -L 443 -N drops.v2:7350" se oculta un servicio sshd en el puerto 22 y un drops en el puerto 7350 detrás del puerto 443, y al mismo tiempo sirve también a su servidor web desde el puerto 4433 para ser visible al exterior en el puerto 443. Esto funciona porque drops establece el SNI de drops.v2 en conexiones salientes.

Con el parámetro -N se permite multiplexar una gran cantidad de servicios a través de SNI. Los puertos/servicios deben ejecutarse todos en la misma máquina a la que la solicitud original fue dirigida. Si lo que desea es un mux basado en SNI, se puede establecer el puerto SSH a través -S 0 0.

Miscelánea

Para que funcione sshttpd no es necesario parchear el software de servidor ssh/web/cliente SMTP. Funciona como es. Sshttpd sólo se ejecuta en Linux y necesita soportar IP_TRANSPARENT. Funcionaría sin ello, pero mediante el uso de IP_TRANSPARENT es posible incluso tener logs de sistema (syslog) sin modificar, por ejemplo, la IP/puerto origen real de las conexiones entrantes se pasa tal cual a los servidores SSH/HTTP/SMTP.

Hay que asegurarse de que se cargan los módulos nf_conntrack y nf_conntrack_ipv4 o nf_conntrack_ipv6. Sshttpd también puede proteger contra posibles 0-days y una medida contra escaneos y ataques de fuerza bruta. Sshttpd ocupa poco espacio y se ha optimizado para la velocidad por lo que también se ejecuta en servidores web muy cargados.

Desde la versión 0.24, sshttpd también soporta múltiples núcleos de CPU. Al menos que se utilice el parámetro -n 1, sshttpd usa un thread por núcleo de la CPU para explotar mejor el hardware.

sshttpd se ejecuta con el usuario nobody dentro de un chroot () (configurable a través -U y -R) si se compila con USE_CAPS. También puede distinguir entre sesiones SSH y SSL, sólo hay utilizar un LOCAL_PORT (-L) de 443.

Github: https://github.com/stealth/sshttp

Comentarios