Die Festlegung einer Begrenzung der Anzahl von Besuchen einer bestimmten IP-Adresse in einem bestimmten Zeitraum kann Kopfschmerzen bereiten, insbesondere bei bösartigen DDOS-Angriffen. Unter ihnen ist der CC-Angriff (Challenge Collapsar) eine Art DDOS (Distributed Denial of Service) und auch eine gängige Angriffsmethode auf Websites. Der Angreifer sendet kontinuierlich eine große Anzahl von Datenpaketen über einen Proxyserver oder Zombieserver an den Host des Opfers, wodurch die Serverressourcen der anderen Partei erschöpft werden, bis sie abstürzen. CC-Angriffe verwenden normalerweise eine begrenzte Anzahl von IP-Adressen, um häufig Daten an den Server zu senden und so das Ziel des Angriffs zu erreichen. Nginx kann CC-Angriffe verhindern, indem es die Anzahl der Besuche einer IP-Adresse im gleichen Zeitraum durch die Konfigurationen HttpLimitReqModule und HttpLimitZoneModule begrenzt. HttpLimitReqModule ist ein Modul, das zur Begrenzung der Anzahl von Verbindungen pro Zeiteinheit verwendet wird. Es verwendet die Anweisungen limit_req_zone und limit_req zusammen, um das Limit zu erreichen. Sobald die Anzahl gleichzeitiger Verbindungen die angegebene Zahl überschreitet, wird ein 503-Fehler zurückgegeben. HttpLimitConnModule wird verwendet, um die Anzahl gleichzeitiger Verbindungen für eine einzelne IP-Adresse mithilfe der Anweisungen limit_zone und limit_conn zu begrenzen. Der Unterschied zwischen diesen beiden Modulen besteht darin, dass HttpLimitReqModule die Anzahl der Verbindungen innerhalb eines bestimmten Zeitraums begrenzt, während HttpLimitConnModule die Anzahl der Verbindungen gleichzeitig begrenzt. HttpLimitReqModul begrenzt die Anzahl der Besuche von derselben IP-Adresse innerhalb eines bestimmten Zeitraums http{ ... #Definieren Sie eine limit_req_zone namens allips zum Speichern von Sitzungen mit einer Größe von 10 MB Speicher. #Verwenden Sie $binary_remote_addr als Schlüssel und begrenzen Sie die durchschnittliche Anzahl der Anfragen pro Sekunde auf 20. #1M kann 16000 Zustände speichern, der Wert von rete muss eine Ganzzahl sein, #Wenn Sie eine Anfrage alle zwei Sekunden begrenzen, können Sie es auf 30r/m einstellen limit_req_zone $binary_remote_addr Zone=allips:10m Rate=20r/s; ... Server{ ... Standort { ... #Begrenzen Sie jede IP auf nicht mehr als 20 Anfragen pro Sekunde, und die Burst-Anzahl der undichten Buckets beträgt 5 #brust bedeutet, dass wenn die Anzahl der Anfragen in der 1., 2., 3. und 4. Sekunde 19 beträgt, #25 Anfragen sind in der 5. Sekunde erlaubt. #Wenn Sie jedoch in der ersten Sekunde 25 Anfragen und in der zweiten Sekunde mehr als 20 Anfragen stellen, wird ein 503-Fehler zurückgegeben. #nodelay, wenn diese Option nicht festgelegt ist, wird die Durchschnittsrate strikt verwendet, um die Anzahl der Anfragen zu begrenzen. #Wenn es in der ersten Sekunde 25 Anfragen gibt, werden in der zweiten Sekunde 5 Anfragen ausgeführt. #Nodelay festlegen, 25 Anfragen werden in der 1. Sekunde ausgeführt. limit_req Zone=Allips Burst=5 Knotenanzahl; ... } ... } ... } HttpLimitZoneModule begrenzt die Anzahl gleichzeitiger Verbindungen limit_zone kann nur im http-Bereich definiert werden, limit_conn kann im http-Server-Standortbereich definiert werden http{ ... #Definieren Sie eine Limit_Zone mit dem Namen „1“ und einer Speichergröße von 10 MB zum Speichern von Sitzungen. #Verwenden Sie $binary_remote_addr als Schlüssel #Nach nginx 1.18 wird limit_conn durch limit_conn_zone ersetzt #und kann nur im http-Bereich limit_conn_zone eins $binary_remote_addr 10m platziert werden; ... Server{ ... Standort { ... limit_conn one 20; #Verbindungslimit#Bandbreitenlimit, begrenzt die Anzahl der Einzelverbindungen. Wenn eine IP zwei Verbindungen hat, sind es 500x2k Grenzrate 500k; ... } ... } ... } Nginx-Whitelist-Einstellungen Die obige Konfiguration schränkt alle IPs ein. Manchmal möchten wir Suchmaschinen-Spider oder unsere eigenen Test-IPs nicht einschränken. 1. http{ geo$limited{ Standardwert 1; #Google 64.233.160.0/19 0; 65.52.0.0/14 0; 66.102.0.0/20 0; 66.249.64.0/19 0; 72.14.192.0/18 0; 74.125.0.0/16 0; 209.85.128.0/17 0; 216.239.32.0/19 0; #M$ 64.4.0.0/18 0; 157.60.0.0/16 0; 157.54.0.0/15 0; 157.56.0.0/14 0; 207.46.0.0/16 0; 207.68.192.0/20 0; 207.68.128.0/18 0; #yahoo 8.12.144.0/24 0; 66.196.64.0/18 0; 66.228.160.0/19 0; 67.195.0.0/16 0; 74.6.0.0/16 0; 68.142.192.0/18 0; 72.30.0.0/16 0; 209.191.64.0/18 0; #Meine IPs 127.0.0.1/32 0; 123.456.0.0/28 0; #Beispiel für Ihren Server-CIDR } Die Geo-Direktive definiert eine Whitelist-Variable „$limit“ mit einem Standardwert von 1. Wenn die Client-IP innerhalb des obigen Bereichs liegt, ist der Wert von „$limit“ 0. 2. Verwenden Sie den Map-Befehl, um die IP des Suchmaschinen-Clients einer leeren Zeichenfolge zuzuordnen. Wenn es sich nicht um eine Suchmaschine handelt, wird die echte IP angezeigt. Auf diese Weise kann die Suchmaschinen-IP nicht in der Speichersitzung limit_req_zone gespeichert werden, sodass der Zugriff auf die Suchmaschinen-IP nicht eingeschränkt wird.
3. Setzen Sie limit_req_zone und limit_req
Schließlich verwenden wir ab, um php-fpm zu komprimieren und die Wirkung der obigen Methode zu testen. Beispiel 1: Begrenzen Sie die Anzahl der Zugriffe auf eine Konfiguration auf 60 pro Minute, also durchschnittlich 1 pro Sekunde. Zuerst bereiten wir ein PHP-Skript vor und legen es im Stammverzeichnis $document_root ab test.php
Die Nginx-Konfiguration fügt limit_req_zone und limit_req hinzu http{ ... limit_req_zone $binary_remote_addr Zone=allips:10m Rate=60r/m; ... Server{ ... Standort { ... limit_req Zone=Allips; ... } ... } ... } # ab -n 5 -c 1 http://blog.rekfan.com/test.php 127.0.0.1- - [22. Dezember 2012:06:27:06 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22/Dez/2012:06:27:06 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22/Dez/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22/Dez/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22/Dez/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "Rekfan_Server/1.2.6" Ohne Brust- und Nodelay-Einstellungen können Sie sehen, dass diese Konfiguration nur einen Zugriff pro Sekunde zulässt und Anfragen, die diesen Grenzwert überschreiten, einen 503-Fehler zurückgeben. http{ ... limit_req_zone $binary_remote_addr Zone=allips:10m Rate=60r/m; ... Server{ ... Standort { ... limit_req Zone=Allips Burst=1 Knotenlay; ... } ... } ... } # ab -n 5 -c 1 http://blog.rekfan.com/test.php 127.0.0.1- - [22. Dezember 2012:07:01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22. Dezember 2012:07:01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22. Dezember 2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22. Dezember 2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "Rekfan_Server/1.2.6" 127.0.0.1 - - [22. Dezember 2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "Rekfan_Server/1.2.6" Durch die Einstellung von brust=1 und nodelay können in der ersten Sekunde zwei Anfragen verarbeitet werden. Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Langsame MySQL-Abfragen und Protokolleinstellungen und -tests
>>: Front-End-Statusverwaltung (Teil 1)
Anaconda ist die beliebteste Python-Plattform für...
Der vollständige Name von Blog sollte Weblog sein...
Inhaltsverzeichnis 1. Erstellen Sie eine Wasserze...
Aktuelle Nachfrage: Es gibt zwei Tabellen, Gruppe...
Bei der Installation von Nginx, MySQL, Tomcat und...
Verwendung von neuen Die Funktion von new besteht...
Wenn wir CSS schreiben, vergessen wir manchmal di...
Inhaltsverzeichnis Vorne geschrieben Anmeldeübers...
Vue-Busmechanismus (Bus) Zusätzlich zur Verwendun...
In diesem Artikelbeispiel wird der spezifische Co...
Inhaltsverzeichnis Grundlegende Datenbankvorgänge...
Als ich heute Tomcat für den Zugriff auf die Proj...
Um Node-red mit der Datenbank (mysql) zu verbinde...
In diesem Artikelbeispiel wird der spezifische Co...
01. Befehlsübersicht md5sum - MD5-Prüfcode berech...