¿Cómo utilizar una lista de permitidos de Nginx mediante DNS dinámico en lugar de dirección IP?

¿Cómo utilizar una lista de permitidos de Nginx mediante DNS dinámico en lugar de dirección IP?

Estoy ejecutando un servidor web Nginx en Ubuntu 20.04. En mi archivo de configuración de host virtual, configuré una directiva permitir/denegar para bloquear el acceso a una URL de todas las IP, excepto la IP especificada. La configuración de mi host virtual se ve así:

server {
    # Restrict access to LAN & Personal IP's
    allow 127.0.0.1; # LoopBack IP Address
    allow 192.168.1.0/24; # LAN IP Address
    allow 123.456.789.102/32; # Home Public IP Address
    allow 111.222.333.444/32; # Work Dynamic IP Address
    deny all;
    error_page 403 =444;
...

El problema con esto es que mis "Direcciones IP dinámicas de trabajo" son de hecho dinámicas y cambian con frecuencia. Entonces, durante unos días más o menos, podré acceder a la página web desde mi dirección IP del trabajo 111.222.333.444/32. Pero luego, cuando la dirección IP dinámica del trabajo cambia a 555.777.888.999/32, ya no puedo acceder a la página web desde el trabajo porque la dirección IP pública de mi trabajo ha cambiado.

A partir de ahora, configuré la dirección IP de mi trabajo con un proveedor de DNS dinámico. Entonces mi dirección DNS dinámica para el trabajo es dansworkip.ddnsfree.com. Me gustaría incorporar una dirección de host DNS dinámica en la lista de permitidos de Nginx para que cuando cambie la dirección IP pública de Mi trabajo, Nginx busque la nueva dirección IP del dominio dansworkip.ddnsfree.comy la coloque en la directiva de permiso.

He probado algo como esto:

server {
    # Restrict access to LAN & Personal IP's
    allow 127.0.0.1; # LoopBack IP Address
    allow 192.168.1.0/24; # LAN IP Address
    allow 123.456.789.102/32; # Home Public IP Address
    allow dansworkip.ddnsfree.com; # Work Dynamic IP Address
    deny all;
    error_page 403 =444;
...

Pero cuando intento esta configuración, Nginx no se inicia y aparecen los siguientes errores en mi registro de Nginx:

[emerg] 10269#10269: invalid parameter "dansworkip.ddnsfree.com" in /etc/nginx/conf.d/www.mysite.com

Mi pregunta es: ¿cómo puedo incorporar DNS dinámico en Nginx para que Nginx busque la dirección IP del dominio permitido y incluya en la lista blanca la dirección IP de mi nombre de host de DNS dinámico?

Respuesta1

El uso de una dirección IP como token de autenticación suele considerarse una mala práctica. Nginx no tiene la funcionalidad para lograr lo que pides. Si realmente tuviera que encontrar una solución al problema que planteaste, entonces elegiría la solución propuesta por Alexey en los comentarios; sin embargo, Nginx tiene una capacidad de autenticación/autorización muy útil que te permiteentregar la decisióna una página web de su elección/diseño.

Allí puede utilizar cualquier regla/mecanismo de autenticación que pueda codificar. Puede utilizar datos de sesión (si su elección de herramientas lo admite), pero considere si algún identificador de sesión podría entrar en conflicto con el implementado por la aplicación para la que está proporcionando una puerta de enlace.

por ejemplo, en PHP,

<?php
$ipdir="/var/www/access";
$TTL=600;

function deny_access() 
{
   header('HTTP/1.0 403 Forbidden');
   exit;
}

function permit_access()
{
   print "";
   exit;
}

function refresh_config()
{
   // replace files in "/allow", delete aged files from "/deny"
   // then update timestamp on control file.
   // Implementation left as an exercise for the reader
}

if (time() - filemtime($ipdir . "/control.file") > $TTL) {
    refresh_config();
} 
if (file_exists($ipdir . "/deny", $_SERVER['REMOTE_ADDR'])) {
    deny_access();
} else if (file_exists($ipdir . "/allow", $_SERVER['REMOTE_ADDR'])) {
    permit_access();
} else {

}

Un enfoque alternativo (que puede ser más eficiente en función de múltiples factores, pero restringido a direcciones IP) es mantenerla búsqueda en nginx mismo- con el mantenimiento de la lista externa.

información relacionada