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

Vue3.0 verwendet das Plug-In vue-grid-layout, um Drag-Layout zu implementieren

Inhaltsverzeichnis 1. Plugins 2. Zwischenspiel 3....

Ausführliche Erläuterung der MySQL-Isolationsebene und des Sperrmechanismus

Inhaltsverzeichnis Kurzbeschreibung: 1. Vier Merk...

Anweisungen zur Verwendung der Option --rm von Docker Run

Wenn der Docker-Container beendet wird, bleibt da...

Beispielerklärung von MySQL-Fremdschlüsseleinschränkungen

Die Fremdschlüsseleinschränkung von MySQL dient z...

Tipps zum Anzeigen von Text in Linux (super praktisch!)

Vorwort Bei der täglichen Entwicklung müssen wir ...

Kurztipps für die Linux-Befehlszeile: So finden Sie eine Datei

Wir alle haben Dateien auf unseren Computern gesp...

Nginx-Konfiguration zum Erreichen eines Lastenausgleichs auf mehreren Servern

Nginx-Lastausgleichsserver: IP: 192.168.0.4 (Ngin...

Detaillierte Erläuterung des Mysql-Kommunikationsprotokolls

1.Mysql-Verbindungsmethode Um das MySQL-Kommunika...

JavaScript-Dokumentobjektmodell DOM

Inhaltsverzeichnis 1. JavaScript kann alle HTML-E...

Teilen Sie einige ungewöhnliche, aber nützliche JS-Techniken

Vorwort Programmiersprachen enthalten normalerwei...

Beispiel für den schnellen Aufbau eines Redis-Clusters mit Docker

Was ist Redis Cluster? Redis Cluster ist eine von...

Lösung zum Vergessen des MySQL-Root-Passworts in MACOS

MySQL ist ein relationales Datenbankverwaltungssy...

Detaillierte Erklärung der Javascript-Grundlagen

Inhaltsverzeichnis Variable Datentypen Erweiterun...