A veces queremos restringir el acceso a una web o una carpeta sólo a ciertas ips, pero nos encontramos con el problema de que esas ips son de conexiones a internet con ips dinámicas como la típica que podemos tener en casa o en el móvil.

Lo primero que hay que hacer es asociar esas ips a un servicio de dns dinámico como el que da dyndns, noip, duckdns o freedns

Una vez que ya tenemos el servicio de dns dinámico instalado en el ordenador o conexión a internet que vamos a usar tenemos que crear un script en el servidor para sacar esa ip. algo así:

vim /scripts/ips_dinamicas_nginx.sh
#!/bin/bash
echo "Allow "$(dig +short rastreador.duckdns.org)";" > /etc/nginx/sites-available/ips_dynamicas.conf

De esta forma cada vez que se ejecute este scrip nos guardará en /etc/nginx/sites-available/ips_dynamicas.conf «Allow nuestra_ip;»

La asignamos permisos de ejecución:

chmod 755 /scripts/ips_dinamicas_nginx.sh

Añadimos este script al cron para que se ejecute cada 5 minutos

*/5 * * * * /scripts/ips_dinamicas_nginx.sh

Y sólo nos queda añadir el fichero donde damos acceso a nuestra ip al location correspondiente

location / {
        include /etc/nginx/sites-available/ips_dynamicas.conf; 
        deny all; #denegamos el acceso al resto de ips
}

Hace poco se dio el caso de que necesité tener bajo un mismo dominio 2 entornos: uno para el público en general y otro para que los programadores pudieran probar la nueva web sobre el mismo dominio.

La forma mas sencilla es tener las dos webs en dos rutas diferentes y asignar el root en función de una variable.

set $ruta_root  "/ruta_de/midominio.com/httpdocs";
 
if ($remote_addr ~* "xx.xx.xx.xx|yy.yy.yy.yy") {
  set $ruta_root  "/ruta_de/midominio.com/httpdocs_desarrollo";
}
root $ruta_root;

Esto mismo se puede hacer en otros muchos casos, por ejemplo si queremos que todas las visitas de un bot muestren otra web:

set $ruta_root  "/ruta_de/midominio.com/httpdocs";
if ($http_user_agent ~ "Indy Library") {
  set $ruta_root  "/ruta_de/midominio.com/httpdocs_desarrollo";
}
root $ruta_root;

O también mostrar otra web a los visitantes de un país o zona geográfica con el módulo de geopip.

set $ruta_root  "/ruta_de/midominio.com/httpdocs";
if ($geoip_city_country_code = "RU") {
  set $ruta_root  "/ruta_de/midominio.com/httpdocs_desarrollo";
}
root $ruta_root;