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_from
declaraciones 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_from
todas las direcciones a la derecha de la que desea permitir / denegar. Como se indica en lareal_ip_recursive
secció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
geo
módulo funciona como elmap
módulo, es decir, una variable obtiene valores asignados según el valor de la dirección IP.Un ejemplo:
Aquí asignamos el
geo
mapa, donde el valor predeterminado$allow
es 0. Si la dirección IP está en la subred192.168.168.0/24
,$allow
obtendrá el valor 1 y se permitirá la solicitud.Puede tener tantas líneas en el
geo
bloque como necesite para definir sus rangos de IP.fuente
real_ip_recursive on;
continuación,set_real_ip_from
pero no ha hecho ninguna diferenciaX-Forwarded-For
encabezado 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-For
encabezado. Además de agregarreal_ip_recursive on
, también debe agregarset_real_ip_from
directivas 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-For
encabezado que no coincide con ninguno de susset_real_ip_from
valores especificadosTengo estos trabajando para mí.
Ref: http://nginx.org/en/docs/http/ngx_http_geo_module.html
fuente