Yönlendirilen X üstbilgilerine dayalı olarak kaynaklara erişimi engelleme


13

X-iletilen-üstbilgileri geçirilen istemci IP dayalı Nginx arkasındaki kaynaklara erişimi kısıtlamaya çalışıyorum. Nginx, Google Cloud Platform'daki Kubernetes Kümesi üzerindeki bir kapta çalışıyor ve gerçek istemci ips yalnızca x iletilen-üstbilgisine aktarılıyor

Şimdiye kadar aşağıdaki kodla tek bir IP için yapmayı başardım:

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;
}

Ancak bunu tüm IP aralıkları için nasıl yapabilirim? Yüzlerce IP'yi elle belirtmek pek mantıklı değil.

Tüm yardımlar takdir edilir

Yanıtlar:


11

X-Forwarded-ForÜstbilginin değerini onaylamak için RealIP modülünü kullanın . Set set_real_ip_fromters vekil (mevcut değeri IP adresine $remote_addr).

Örneğin:

server {
    ...
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;
    ...
}

Artık istemcinin gerçek IP adresini $remote_addrve allow/ denydirektiflerini kullanabilmelisiniz . Daha fazla bilgi için bu belgeye bakın .


bu yüzden boşuna aşağıdakileri denedim, kafa karıştırıcı mı? 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;
p1hr

Google Yük Dengeleme belgelerine baktıktan sonra aşağıdakileri buldum: X-Forwarded-For: <unverified IP(s)>, <immediate client IP>, <global forwarding rule external IP>, <proxies running in GCP> (requests only) <Anında istemci IP> girişi, doğrudan yük dengeleyicisine bağlanan istemcidir.
p1hr

1
İşe Bunun için adres aralıklarını tespit etmek gerekir <global forwarding rule external IP>ve <proxies running in GCP>ekleyin set_real_ip_fromhepsini kapsayan ifadeleri.
Richard Smith

<global forwarding rule external IP>hizmetimin harici [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"ipi, GCP'de başka proxy yok, nginx günlüklerimde, aşağıdaki istemlerde ccc.ccc.ccc.ccc global yönlendirme kuralı olan bbb.bbb.bbb.bbb isteklerini görüyorum ip - whatsmyip.org'da gördüklerimle eşleşir. Bu parçayı nasıl çıkaracağınızı önermek için herhangi bir şansınız var mı?
p1hr

1
Tamam, şimdi kafam karışıyor. Sen gerek set_real_ip_fromizin vermek istediğiniz birine sağındaki adreslerinin tümü için / inkar. real_ip_recursiveBölümde belirtildiği gibi .
Richard Smith

5

Richard'ın cevabı, nginx'e gerçek IP adresinin en iyi şekilde nasıl alınacağına dair bilgileri içeriyordu.

Bu arada, IP aralıklarını belirtme sorusuna ne gelirse, http://nginx.org/en/docs/http/ngx_http_geo_module.html kullanabilirsiniz .

geoGibi modül çalışmaları mapmodülü olduğunu, değişken IP adresi değerine bağlı olarak değerleri atanır.

Bir örnek:

geo $allow {
    default 0;
    192.168.168.0/24 1;
}

server {
    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.2.3;

    if ($allow = 0) {
        return 403;
    }
}

Burada geoharitayı atarız , burada varsayılan değeri $allow0'dır. IP adresi alt ağdaysa 192.168.168.0/24, $allow1 değerini alır ve isteğe izin verilir.

geoBlokta IP aralıklarınızı tanımlamak için ihtiyaç duyduğunuz sayıda satır olabilir .


Teşekkür ederim! bu gerçekten iyi çalışıyor gibi görünüyor, karşı karşıya olduğum son bir şey X-forwarded-for gelen client_ip olmasıdır. Şu anda, geçen 3 ip adresinden sonuncusu kullanılır. real_ip_recursive on;Aşağıya ekledim set_real_ip_fromama bir fark
yaratmadı

Eğer anlamına mı X-Forwarded-For, istek birden yakınlık üzerinden gelir başlığını üç ayrı adresleri,? Orada yalnızca istemci IP'sini içeren başka bir başlığınız var mı?
Tero Kilkanen

Zincirdeki her proxy, IP adresini X-Forwarded-Forbaşlığa ekler . Eklemeye ek olarak , proxy zincirinizdeki her güvenilir sunucu IP adresi için real_ip_recursive onde set_real_ip_fromyönergeler eklemeniz gerekir . Nginx daha sonra bu direktiflerin her birini ele alacak ve istemcinin IP'sini X-Forwarded-Forbaşlıkta, belirttiğiniz set_real_ip_fromdeğerlerden
hiçbiriyle

FWIW, bu kombinasyon AWS ALB ile benim için çalışmadı. Ne işe yaradı, coğrafi blok içinde proxy yönergesini kullanmaktı, set_real_ip ile aynı ip ile - nginx.org/en/docs/http/ngx_http_geo_module.html
talonx 12:18

3

Bunları benim için çalıştırdı.

geo $remote_addr $giveaccess {
      proxy 172.0.0.0/8; <-- Private IP range here
      default 0;
      11.22.33.44 1; <-- Allowed IP here
    }


server{
##
    location ^~ /secure_url_here {
        if ($giveaccess = 0){
          return 403; 
        }
        try_files $uri $uri/ /index.php?$args; <-- Add this line specific for your CMS, if required.
    }

Ref: http://nginx.org/tr/docs/http/ngx_http_geo_module.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.