Wenn eine Website böswillig angefragt wird, ist das Blacklisting von IP-Adressen eine wichtige Maßnahme. Wenn Sie nginx jedes Mal konfigurieren müssen, wenn Sie eine Anfrage auf die schwarze Liste setzen, ist das zu niedrig. Wir müssen die IP-Blacklist von nginx bequemer steuern. 1. Lösung Die Blacklist wird in MySQL gespeichert (die übliche Lösung ist Redis, aber es ist nicht förderlich für die Kontrolle, wie z. B.: unterschiedliche IP-Einstellungen mit unterschiedlichen Gültigkeitszeiträumen, IP-CRUD, Statistiken usw.); Über das Lua-Nginx-Modul wird in Nginx ein Speicherblock (lua_shared_dict) geöffnet und Lua aktualisiert die Blacklist regelmäßig von MySQL zu lua_shared_dict. Alle Anfragen müssen mit der IP in lua_shared_dict abgeglichen werden. 2. Installation 2.1 Installieren Sie luajit cd LuaJIT-2.0.5 machen make install PREFIX=/usr/local/luajit 2.2. Kompilieren Sie bei der Installation von nginx das Lua-Modul darin exportiere LUAJIT_LIB=/usr/local/luajit/lib exportiere LUAJIT_INC=/usr/local/luajit/include/luajit-2.1 ./configure --prefix=/nginx \ --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \ --add-module=/opt/ngx_devel_kit-0.3.1rc1 \ --add-module=/opt/lua-nginx-module-0.10.14rc3 mache -j2 installieren ln -s /nginx/sbin/nginx /usr/sbin/nginx 3. Konfiguration 3.1 Nginx-Konfiguration http { Server-Tokens aus; lua_package_path "/usr/local/lib/lua/?.lua;;"; lua_shared_dict ip_schwarze Liste 4m; } Server { setze $real_ip $remote_addr; wenn ( $http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)" ) { setze $real_ip $1; } # Verwaltungsinformationen. Besuchen Sie diese URL, um die IP-Blacklist-Informationen am Nginx-Speicherort /get-ipblacklist-info { anzuzeigen. Zugriff über Lua-Datei conf/lua/get_ipblacklist_info.lua; } # URL synchronisieren, URL über die geplante Aufgabe aufrufen und geplante Aktualisierung der IP-Blacklist von MySQL zum Nginx-Speicherort /sync-ipblacklist { implementieren. Zugriff über Lua-Datei conf/lua/sync_ipblacklist.lua; } # Produktionsdomänennamenkonfiguration, alle Standorte, die eine IP-Blacklist-Kontrolle benötigen, müssen die folgende Anweisung enthalten: Standort / { Zugriff über Lua-Datei conf/lua/check_realip.lua; } } Der Nginx-Server konfiguriert die folgende Cronta * * * * * /usr/bin/curl -o /dev/null -s http://127.0.0.1/sync-ipblacklist > /dev/null 2>&1 3.2 Lua-Skript sync_ipblacklist.lua lokaler mysql_host = "IP des MySQL-Servers" lokaler MySQL-Port = 3306 lokale Datenbank = "Datenbankname" lokaler Benutzername = "Benutzer" lokales Passwort = "Passwort" --update ip_blacklist von mysql einmal alle cache_ttl Sekunden lokaler cache_ttl = 1 lokales mysql_connection_timeout = 1000 lokale Client-IP = ngx.var.real_ip lokale ip_blacklist = ngx.shared.ip_blacklist lokale letzte_Aktualisierungszeit = ip_blacklist:get("letzte_Aktualisierungszeit"); wenn last_update_time == nil oder last_update_time < (ngx.now() - cache_ttl), dann lokales MySQL = erfordert „resty.mysql“; lokales Rot = mysql:neu(); rot: set_timeout(mysql_connect_timeout); lokales OK, Fehler, Fehlercode, SQLState = rot:Verbinden{ Host = MySQL-Host, Port = MySQL-Port, Datenbank = Datenbank, Benutzer = Benutzername, Passwort = Passwort, Zeichensatz = "utf8", max_paket_größe = 1024 * 1024, } wenn nicht ok dann ngx.log(ngx.ERR, "MySQL-Verbindungsfehler beim Abrufen der IP-Blacklist: " .. err); anders new_ip_blacklist, err, errcode, sqlstate = red:query("Wählen Sie IP-Adresse aus IP-Blacklist, wobei Status = 0 ist, sortiert nach Erstellungszeit, Beschreibungslimit 10000", 100) wenn nicht new_ip_blacklist dann ngx.log(ngx.ERR, "schlechtes Ergebnis. Fehlercode: " .. Fehlercode .. " sqlstate: " .. sqlstate .. " err: " .. err); zurückkehren Ende ip_blacklist:flush_all(); für k1, v1 in Paaren (new_ip_blacklist) machen für k2, v2 in Paaren (v1) machen ip_blacklist:setzen(v2,true); Ende Ende ip_blacklist:set("letzte_Aktualisierungszeit", ngx.now()); Ende Ende ngx.say("Synchronisierung erfolgreich"); get_ipblacklist_info.lua -- Rufen Sie die URL auf, um Informationen zur Blacklist anzuzeigen -- 10.000 IPs verbrauchen weniger als 1,5 MB ngx.shared-Speicher -- Das Abrufen aller Schlüssel blockiert den Zugriff anderer normaler Anfragen auf den ngx.shared-Speicher, sodass nur wenige Schlüssel angezeigt werden können, die „resty.core.shdict“ erfordern ngx.say("Gesamtspeicherplatz: " .. ngx.shared.ip_blacklist:capacity() .. "<br/>"); ngx.say("freier Speicherplatz: " .. ngx.shared.ip_blacklist:free_space() .. "<br/>"); ngx.say("letzte Aktualisierungszeit: " .. os.date("%Y%m%d_%H:%M:%S",ngx.shared.ip_blacklist:get("last_update_time")) .. "<br/>"); ngx.say("erste 100 Schlüssel: <br/>"); ngx.say("--------------------------<br/>"); ip_blacklist = ngx.shared.ip_blacklist:get_keys(100); für Schlüssel, Wert in Paaren (ip_blacklist) ngx.say(Schlüssel .. ": " .. Wert .. "<br/>"); Ende check_realip.lua wenn ngx.shared.ip_blacklist:get(ngx.var.real_ip) dann gibt ngx.exit(ngx.HTTP_FORBIDDEN) zurück; Ende 3.3 Datenbankdesign Tabelle „ip_blacklist“ erstellen ( `id` int(11) NICHT NULL AUTO_INCREMENT, `ip_addr` varchar(15) COLLATE utf8mb4_bin DEFAULT NULL, `status` int(11) DEFAULT '0' COMMENT '0: gültig, 1: ungültig', `effective_hour` decimal(11,2) DEFAULT '24' COMMENT 'Gültigkeitsdauer, Einheit: Stunden', `ip_source` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Blacklist-Quelle', `create_time` Datum/Uhrzeit STANDARD CURRENT_TIMESTAMP, `modify_time` Datum/Uhrzeit STANDARD CURRENT_TIMESTAMP BEI UPDATE CURRENT_TIMESTAMP, `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'Bemerkungen', PRIMÄRSCHLÜSSEL (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; PROZEDUR ERSTELLEN proc_ip_blacklist_status_update() -- Ändern Sie den abgelaufenen IP-Status in ungültig beginnen Aktualisieren Sie die IP-Blacklist setze Status=1 wobei date_add(Erstellungszeit,INTERVAL effektive_Stunde Stunde) < jetzt(); begehen; Ende; EREIGNIS ERSTELLEN job_ip_blacklist_status_update PER ZEITPLAN JEDE MINUTE BEI FERTIGSTELLUNG BEWAHREN AKTIVIEREN TUN rufen Sie proc_ip_blacklist_status_update() auf; 4 CRUD Schwarze Listen können manuell, automatisch oder beides generiert werden. Der automatische Weg besteht darin, das Elk-Protokoll mit Python zu analysieren und die bösartige IP automatisch in MySQL zu schreiben. Dies ist ein großes Thema und wird hier nicht behandelt. Die manuelle Methode besteht darin, das Elk-Anforderungsprotokoll manuell zu überprüfen, die bösartige IP zu finden und MySQL manuell auszufüllen. Hier ist ein Open-Source-CRUD-Tool mit einer angenehmen Benutzererfahrung (viel besser als Navicat direkt). Natürlich können Sie es auch selbst schreiben ... Projektadresse: https://github.com/jonseg/crud-admin-generator Die Stärke des Projekts liegt darin, dass alle Tabellen Ihnen bei der Generierung von Menüs helfen und das CRUD dieser Tabellen dann direkt verwendet werden kann. Informationen zu bestimmten Vorgängen finden Sie in den offiziellen Anweisungen. Ich werde nicht ins Detail gehen. Das obige Beispiel für eine dynamische Sperre der IP-Blacklist von Nginx ist der gesamte Inhalt, den der Editor mit Ihnen teilt. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Das könnte Sie auch interessieren:
|
<<: So implementieren Sie das parallele Herunterladen großer Dateien in JavaScript
>>: Installations-Tutorial zur dekomprimierten Version von MySQL 5.7.23 für WinX64
<style type="text/css"> Code kopie...
Designer müssen Psychologie verstehen, indem sie ...
Was <fieldset> und <legend> betrifft,...
Hintergrund: Vor langer Zeit (2017.6.5, der Artik...
Während des täglichen Optimierungsprozesses stell...
In diesem Artikelbeispiel wird der spezifische Co...
MySQL kann bei der Installation festgelegt werden...
Dies ist eine erweiterte Version. Die Fragen und ...
Inhaltsverzeichnis App.vue sub1.vue sub2.vue Zusa...
Im Falle einer vollständigen Trennung von Front-E...
Inhaltsverzeichnis Vorwort Problembeschreibung Ur...
1. Einleitung Dieser Artikel zeigt Ihnen, wie Sie...
Vorwort Um den Single Point of Failure zu beheben...
Vorwort: position:sticky ist ein neues Attribut d...
1. HTML-Teil <Col span="2">Datei ...