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

¿Algo que comentar?
Lo siento, debes estar conectado para publicar un comentario.