Estoy tratando de restringir el acceso a los recursos detrás de Nginx en función de la IP del cliente aprobada en encabezados X-reenviados. Nginx se ejecuta en un contenedor en un clúster de Kubernetes en Google Cloud Platform y los ips reales del cliente se pasan solo en el encabezado x-forward-for
Hasta ahora he logrado hacerlo para una sola IP con el siguiente código:
set $allow false;
if ($http_x_forwarded_for ~* 123.233.233.123) {
set $allow true;
}
if ($http_x_forward_for ~* 10.20.30.40) {
set $allow false;
}
if ($allow = false) {
return 403;
}
Pero, ¿cómo puedo hacer eso para rangos completos de IP? Especificar cientos de IP a mano no tiene mucho sentido.
Toda ayuda es apreciada

location / { real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/8; real_ip_recursive on; allow xxx.xxx.xxx.xxx;X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only)La entrada <IP del cliente inmediato> es el cliente que se conectó directamente al equilibrador de carga.<global forwarding rule external IP>e<proxies running in GCP>y añadirset_real_ip_fromdeclaraciones que cubren todos ellos.<global forwarding rule external IP>es la ip externa de mi servicio, no hay otros proxies en GCP, en mis registros nginx veo solicitudes en el siguiente formato[31/Jul/2017:20:05:46 +0000] "GET / HTTP/1.1" 403 169 "-" "curl/7.54.0" "aaa.aaa.aaa.aaa, bbb.bbb.bbb.bbb, ccc.ccc.ccc.ccc"donde ccc.ccc.ccc.ccc es la regla de reenvío global, bbb.bbb.bbb.bbb es un cliente inmediato ip: coincide con lo que veo en whatsmyip.org. ¿Alguna posibilidad de que pueda aconsejar cómo extraer esa parte?set_real_ip_fromtodas las direcciones a la derecha de la que desea permitir / denegar. Como se indica en lareal_ip_recursivesección.La respuesta de Richard ya contenía la información sobre cómo obtener la mejor dirección IP real para nginx.
Mientras tanto, en lo que respecta a la especificación de rangos de IP, puede usar http://nginx.org/en/docs/http/ngx_http_geo_module.html .
El
geomódulo funciona como elmapmódulo, es decir, una variable obtiene valores asignados según el valor de la dirección IP.Un ejemplo:
Aquí asignamos el
geomapa, donde el valor predeterminado$allowes 0. Si la dirección IP está en la subred192.168.168.0/24,$allowobtendrá el valor 1 y se permitirá la solicitud.Puede tener tantas líneas en el
geobloque como necesite para definir sus rangos de IP.fuente
real_ip_recursive on;continuación,set_real_ip_frompero no ha hecho ninguna diferenciaX-Forwarded-Forencabezado tiene tres direcciones separadas, es decir, la solicitud se realiza a través de múltiples servidores proxy? ¿Tiene algún otro encabezado que pueda usar, que contenga solo la IP del cliente?X-Forwarded-Forencabezado. Además de agregarreal_ip_recursive on, también debe agregarset_real_ip_fromdirectivas para cada dirección IP de servidor de confianza en su cadena de proxy. Nginx luego trabajará a través de cada una de estas directivas y devolverá la IP del cliente como el primer valor que alcanza en elX-Forwarded-Forencabezado que no coincide con ninguno de susset_real_ip_fromvalores especificadosTengo estos trabajando para mí.
Ref: http://nginx.org/en/docs/http/ngx_http_geo_module.html
fuente