Begrenzung der Nginx-Rate mit X-Forwarded-For-Header

23

Ich untersuche die Geschwindigkeitsbegrenzung mit dem HttpLimitReqModule von Nginx . Anforderungen kommen jedoch alle von derselben IP (einem Loadbalancer) mit der tatsächlichen IP-Adresse in den Headern.

Gibt es eine Möglichkeit, das Nginx-Ratenlimit basierend auf der IP-Adresse im X-Forwarded-ForHeader anstelle der IP-Adresse der Quelle festzulegen?

John Brodie
quelle

Antworten:

28

Ja, eine typische Konfigurationsdefinitionszeichenfolge mit begrenzter Geschwindigkeit sieht wie folgt aus:

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

wo $binary_remote_addrist der eindeutige Schlüssel für Limiter. Sie sollten versuchen, es in eine $http_x_forwarded_forVariable zu ändern, die den Wert von X-Forwarded-Forheader erhält . Dies erhöht zwar den Speicherverbrauch, da $binary_remote_addrzum Speichern von IP-Adressen das komprimierte Binärformat verwendet wird und $http_x_forwarded_fornicht.

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;
Andrei Mikhaltsov
quelle
Ich bin zu dem gleichen Schluss gekommen, und in einem kurzen Test funktioniert es einwandfrei. Vielen Dank für den Hinweis auf die erhöhte Speichernutzung.
John Brodie
2
Hüten Sie sich vor es kann ernsthafte Sicherheitsbedenken dies: blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell
Beachten Sie, dass die Informationen in diesem Blogbeitrag zu Symfony die folgenden Adressen
enthielten
5
Wenn Sie das Realip-Modul verwenden, wird die $binary_remote_addrVariable korrekt gesetzt.
Cenk Alti
5

Die limit_req_zoneDirektive definiert die Variable, die als Schlüssel für die Anforderungsgruppierung verwendet werden soll.
In der Regel wird der $binary_remote_addrverwendet, anstatt $remote_addrdass er kleiner ist und Platz spart.

Vielleicht möchten Sie alternativ das RealipModule verwenden .
Dadurch werden die Remote-Adressvariablen in die in einem benutzerdefinierten Header angegebene Adresse umgeschrieben und die Protokollierung sowie die Verwendung anderer Variablen vereinfacht.

Lukas
quelle
1
+1 für das RealIP-Modul. Wenn Sie dieses Modul verwenden $binary_remote_addrund $remote_addrnormalerweise auf den Wert Ihres konfigurierten Headers eingestellt sind, X-Forwarded-Forsind Ihre Standardvariablen jetzt die "echte Client-IP-Adresse". Führen nginx -VSie den Befehl aus, um festzustellen, ob NGINX mit erstellt wurde --with-http_realip. Dann ist config so einfach wie set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; :, wobei der CIDR-Bereich der Ihres Upstream-Load-Balancers ist, der den X-Forwarder-ForHeader setzt.
Markdsievers