Beispiel für eine dynamische Sperre der IP-Blacklist von Nginx

Beispiel für eine dynamische Sperre der IP-Blacklist von Nginx

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 kompilieren Sie Nginx neu und fügen Module hinzu
  • Nginx leitet dynamisch an Upstream weiter, entsprechend dem Pfad in der URL
  • Nginx verwendet Lua+Redis, um IP dynamisch zu blockieren
  • Detaillierte Erläuterung mehrerer Möglichkeiten zum Schreiben eines dynamischen DNS-Reverse-Proxys für Nginx
  • So fügen Sie Nginx dynamisch Module hinzu

<<:  So implementieren Sie das parallele Herunterladen großer Dateien in JavaScript

>>:  Installations-Tutorial zur dekomprimierten Version von MySQL 5.7.23 für WinX64

Artikel empfehlen

18 erstaunliche Verbindungen zwischen Interaktionsdesign und Psychologie

Designer müssen Psychologie verstehen, indem sie ...

Detaillierte grafische Erläuterung der MySql5.7.18-Zeichensatzkonfiguration

Hintergrund: Vor langer Zeit (2017.6.5, der Artik...

Der Prozess der schnellen Konvertierung eines MySQL-Left-Joins in einen Inner-Join

Während des täglichen Optimierungsprozesses stell...

Vue.js implementiert eine einfache Timerfunktion

In diesem Artikelbeispiel wird der spezifische Co...

So legen Sie ein Kennwort für MySQL Version 5.6 auf dem Mac fest

MySQL kann bei der Installation festgelegt werden...

MySQL-Datenbank muss SQL-Anweisungen kennen (erweiterte Version)

Dies ist eine erweiterte Version. Die Fragen und ...

Vue implementiert Benutzeranmeldung und Token-Verifizierung

Im Falle einer vollständigen Trennung von Front-E...

Ursachen und Lösungen für MySQL-Datenverlust

Inhaltsverzeichnis Vorwort Problembeschreibung Ur...

Detaillierte Schritte zur Verwendung von Redis in Docker

1. Einleitung Dieser Artikel zeigt Ihnen, wie Sie...