Ograniczanie prędkości nginx za pomocą nagłówka X-Forwarded-For

23

Zajmuję się ograniczaniem prędkości za pomocą HttpLimitReqModule firmy nginx . Jednak wszystkie żądania pochodzą z tego samego adresu IP (moduł równoważenia obciążenia), z prawdziwym adresem IP w nagłówkach.

Czy istnieje sposób na ograniczenie prędkości nginx na podstawie adresu IP w X-Forwarded-Fornagłówku zamiast adresu IP źródła?

John Brodie
źródło

Odpowiedzi:

28

Tak, typowy ciąg definicji konfiguracji ograniczającej szybkość wygląda następująco:

 limit_req_zone  $binary_remote_addr zone=zone:16m rate=1r/s;

gdzie $binary_remote_addrjest unikalny klucz ogranicznika. Powinieneś spróbować zmienić go na $http_x_forwarded_forzmienną, która pobiera wartość X-Forwarded-Fornagłówka. Chociaż zwiększy to zużycie pamięci, ponieważ $binary_remote_addrużywa skompresowanego formatu binarnego do przechowywania adresów IP i $http_x_forwarded_fortak nie jest.

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;
Andriej Michałow
źródło
Właśnie doszedłem do tego samego wniosku iw szybkim teście działa dobrze. Dziękujemy za zwrócenie uwagi na zwiększone zużycie pamięci.
John Brodie
2
Uwaga: mogą wystąpić poważne obawy dotyczące bezpieczeństwa: blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell
Pamiętaj, że informacje w tym blogu dotyczące symfony zawierały następujące adresy: symfony.com/doc/current/components/http_foundation/…
calumbrodie
5
Jeśli użyjesz modułu Realip, $binary_remote_addrzmienna zostanie ustawiona poprawnie.
Cenk Alti
5

limit_req_zoneDyrektywa definiuje zmienną ma być używany jako klucz do żądania ugrupowania.
Zwykle $binary_remote_addrużywa się go raczej niż $remote_addrdlatego, że jest mniejszy i oszczędza miejsce.

Może alternatywnie chcesz użyć RealipModule .
Spowoduje to przepisanie zmiennych adresu zdalnego na adres podany w niestandardowym nagłówku, a także ułatwi rejestrowanie i użycie innych zmiennych.

Lukas
źródło
1
+1 dla modułu RealIP. Podczas korzystania z tego modułu $binary_remote_addri $remote_addrzwykle są one ustawione na wartość skonfigurowanego nagłówka, X-Forwarded-Forwięc standardowe zmienne są teraz „rzeczywistym adresem IP klienta”. Uruchom, nginx -Vaby sprawdzić, czy NGINX został zbudowany --with-http_realip. Następnie konfiguracja jest tak prosta, jak: set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; gdzie zakres CIDR jest zakresem twojego równoważenia obciążenia, który ustawia X-Forwarder-Fornagłówek.
markdsievers