IP dinámica en Traefik

Publicado en 2 octubre, 2024

Una vez conseguido que Docker obtenga la IP detrás del proxy, vamos a limitar el acceso a algunos servicios, en este caso al n8n.

DYNAMIC.YML

Traefik permite el uso de un archivo dynamic.yml que se lee sin tener que recargar traefik. Este archivo va a contener el middleware, pero necesitamos crear un script (update_dynamic.sh o el nombre que queramos, pero debe estar en la misma ruta donde queremos que nos cree el dynamic.yml) que actualice la dinámica:

#!/bin/bash 

# Nombres de los dominios 
DOMAIN1="f1.alsur.es" 
DOMAIN2="f2.alsur.es" 

# Obtener las IPs dinámicas usando dig 
IP1=$(dig +short $DOMAIN1 | tail -n1) 
IP2=$(dig +short $DOMAIN2 | tail -n1) 

# Verificar si se obtuvieron las IPs 
if [ -z "$IP1" ] || [ -z "$IP2" ]; then 
   echo "Error: No se pudo obtener la IP de uno o ambos dominios." 
   exit 1 
fi 

# Ruta al archivo dynamic.yml, que está en la misma carpeta que este script 
SCRIPT_DIR=$(dirname "$0") 
DYNAMIC_YML="$SCRIPT_DIR/dynamic.yml" 

# Crear un nuevo dynamic.yml con las IPs actualizadas 
cat <<EOL > $DYNAMIC_YML 
http: 
 middlewares: 
   alsur-whitelist: 
     ipWhitelist: 
       sourceRange: 
         - 127.0.0.1/32 
         - $IP1/32 
         - $IP2/32 
EOL 

echo "dynamic.yml actualizado con las IPs: $IP1, $IP2"

En caso de otras dinámicas pues habrá que adaptar el script. Lo mismo si hay más de dos. Le damos permiso de escritura y lo ejecutamos.

Esto dejará un archivo así:

http: 
 middlewares: 
   alsur-whitelist: 
     ipWhitelist: 
       sourceRange: 
         - 127.0.0.1/32 
         - 79.144.31.127/32 
         - 80.102.180.87/32

TRAEFIK

En traefik debemos hacer varios cambios:

traefik:
...
command:
...
# ARCHIVO DE IP DINAMICAS
- "--providers.file.filename=/dynamic.yml"
...
volumes:
...
- "${TRAEFIK_FILES_DIR}/dynamic.yml:/dynamic.yml" # Montaje del archivo dynamic.yml

Aquí se usa la variable TRAEFIK_FILES_DIR, pero debes cambiarlo a tu ruta correspondiente

 

MIDDLEWARE EN SERVICIO

Al estar el middleware a nivel global no hace falta crearlo en el servicio, simplemente declarar que quieres usarlo y en qué ruta

n8n:
...
labels:
- traefik.http.routers.${NAME}.middlewares=alsur-whitelist@file

Siendo $NAME la variable que esté usando para especificar la ruta única del servicio y alsur-whitelist el nombre del middleware. Hay que agregar @file porque es el sufijo que le añade traefik por venir de un archivo. Puedes revisar el nombre correcto en el panel del traefik


Sin respuestas to "IP dinámica en Traefik"


    ¿Algo que comentar?