Linux, crear redirección local de puertos

La interfaz de Fritz Box se abre en el reenvío de puertos.

<-más La siguiente situación: Nextcloud o un servidor web Apache se está ejecutando en mi servidor doméstico. El reenvío de puertos está configurado. El dominio externo apunta a la dirección del Fritzbox o del router con un CNAME.

El problema: Reenvío de puertos, Fritzbox informa

En el camino todo funciona. Puedo acceder externamente con “subdominio.dominio.de”. Sólo en la red doméstica aparece la interfaz de usuario de Fritzbox. Por supuesto que puedo utilizar la dirección IP en la red interna, pero es estúpido para el cliente Nextcloud en el portátil, por ejemplo, porque entonces tengo una dirección de servidor diferente internamente que externamente.

Una posibilidad es reconfigurar el servidor Apache para que no se ejecute en el mismo puerto que el Fritzbox. Pero yo no quería hacer eso, así que busqué una manera de redirigir un puerto local. Es decir, en el ejemplo libero el puerto 8443 a través del Fritzbox y lo redirijo al servidor. Sin embargo, el servidor trabaja en el puerto 443 (https).

Redirigir puerto local

La solución es “socat”, el software permite redirigir un puerto local a otro puerto local. Primero instalamos el software:

sudo apt update
sudo apt install socat

A continuación redirigimos el puerto 8443 al 443:

socat tcp-listen:8443,reuseaddr,fork tcp:localhost:443

Hasta aquí todo bien, sin embargo la redirección vuelve a desaparecer en cuanto termina el comando. Podemos notar un & al final, entonces se inicia un proceso, pero sólo mientras el ordenador no se reinicie.

Crear servicio systemd

Ahora para ejecutar el script para iniciar el sistema, creamos un script. Tiene el siguiente contenido, importante que & al final.

/bin/bash
socat tcp-listen:8443,reuseaddr,fork tcp:localhost:443 &

Podemos crear el script bajo /root/socat.sh, por ejemplo, y luego hacerlo ejecutable:

sudo vim /root/socat.sh
sudo chmod +x /root/socat.sh

Ahora creamos un servicio. Allí creamos un nuevo archivo de texto:

sudo vim /etc/sistema/sistema/socat.service

El contenido queda así, adaptar si es necesario:

[Unidad]
Descripción=socat script

[Servicio]
ExecStart=/root/socat.sh
Tipo=onehot
RemainAfterExit=sí

[Instalar]
WantedBy=multi-user.target

A continuación podemos activar el servicio:

sudo systemctl daemon-reload
sudo systemctl enable socat.service

Listo. Tras el reinicio, el servicio ya está disponible. Si no es así, podemos comprobarlo con el siguiente comando:

sudo systemctl status socat.service

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *