Ich bin auf eine Situation gestoßen, in der ein Client einen Satz von knapp 1 Million einzelnen IP-Adressen (keine Subnetze) auf die schwarze Liste setzen muss und die Netzwerkleistung ein Problem darstellt. Ich würde zwar vermuten, dass IPTables-Regeln eine geringere Auswirkung auf die Leistung haben als Routen, aber das ist nur eine Vermutung.
Hat jemand einen soliden Beweis oder eine andere Rechtfertigung für die Bevorzugung von IPTables oder Null-Routing als Lösung für die Sperrung langer Listen von IP-Adressen? In diesem Fall ist alles automatisiert, so dass die Benutzerfreundlichkeit eigentlich kein Problem darstellt.
EDIT 26-Nov-11
Nach einigen Tests und Entwicklungen scheint keine dieser Optionen funktionsfähig zu sein. Es scheint, dass sowohl Routensuchen als auch Iptables den Regelsatz linear durchsuchen und einfach zu lange brauchen, um so viele Regeln zu verarbeiten. Auf moderner Hardware verlangsamt das Speichern von 1 Million Elementen in einer Iptables-Blacklist den Server auf etwa 2 Dutzend Pakete pro Sekunde. IPTables und Null-Routen sind also aus.
ipset
Wie von Jimmy Hedman empfohlen, wäre das großartig, außer dass Sie nicht mehr als 65536 Adressen in einem Set verfolgen können. Daher kann ich nicht einmal versuchen, es zu verwenden, es sei denn, jemand hat irgendwelche Ideen.
Anscheinend ist die einzige Lösung, um diese vielen IPs zu blockieren, eine indizierte Suche in der Anwendungsschicht. Ist das nicht so
Mehr Informationen:
In diesem Fall blockiert der Anwendungsfall den Zugriff einer Liste mit IP-Adressen, die als "bekannte Straftäter" eingestuft wurden, auf statische Inhalte auf einem Webserver. FWIW: Das Blockieren durch Apache Deny from
ist ebenso langsam (wenn nicht sogar langsamer) wie das Ausführen eines linearen Scans.
Zu Ihrer Information: Die endgültige Lösung bestand darin, Apaches mod_rewrite in Verbindung mit einer Berkeley-DB-Map zu verwenden, um Lookups für die Blacklist durchzuführen. Aufgrund der Indizierung der Berkeley-DBs konnte die Liste mit der Leistung O (log N) skaliert werden.
Antworten:
Versuchen Sie, iptables zu verwenden und einen mehrstufigen Baum zu erstellen, um die Anzahl der Suchvorgänge zu verringern.
und so weiter - Hinzufügen von Verschachtelungsebenen; Natürlich brauchen Sie eine automatische Methode zum Erstellen der Regeln und sollten Ketten nur für die Netzwerke haben, in denen Sie einen oder mehrere Täter haben. Auf diese Weise können Sie die Anzahl der Suchvorgänge erheblich reduzieren, und ich denke, das könnte der Fall sein eigentlich arbeiten.
quelle
Genau dafür
ipset
ist.Von seiner Website http://ipset.netfilter.org/ :
Wenn du möchtest
Dann ist ipset vielleicht das richtige Werkzeug für Sie.
Es wurde von Jozsef Kadlecsik, einem Mitglied des Netfilter-Kernteams, geschrieben (der auch das REJECT-Ziel geschrieben hat). Das ist also die beste Wahl, die ich mir vorstellen kann.
Es ist sogar in den aktuellen Kerneln enthalten.
quelle
H * 40byte + (N/4 + N%4) * 4 * element size
die aktuelle Formel für die IPSet-Hash-Größe für 2015 ungefähr 64 MB für 1 MB Adressen in einem Hash mit 1,5 Mio. Slots. Mit der Apache / Berkdb-Lösung werden die Daten auf der Festplatte gespeichert und nur die Seiten der aktiven Adressen geladen.Ich habe das selbst nicht getestet, aber als ich Ihre Problembeschreibung hörte, dachte ich sofort "
pf
" (wie von OpenBSD).pf
hat das Konzept von Adresstabellen, die genau das sind, wonach Sie suchen.Nach einigen sehr flüchtigen Nachforschungen, die ich angestellt habe, scheint dies das Potenzial zu haben, besser als zu skalieren
ipset
. Gemäß dem Kapitel zu Laufzeitoptionen in den häufig gestellten Fragen (FAQ) von PF werden standardmäßig 1.000 Tabellen mit insgesamt 200.000 Einträgen in allen Tabellen unterstützt. (100.000, wenn das System über einen physischen Speicher von <100 MB verfügt). Dies lässt mich glauben, dass es sich zumindest lohnt, zu versuchen, dies zu testen, um festzustellen, ob es auf einer nützlichen Ebene funktioniert.Natürlich gehe ich davon aus, dass Sie Ihre Server unter Linux betreiben, sodass Sie eine separate Firewall-Box benötigen, auf der ein Betriebssystem mit pf (wie OpenBSD oder FreeBSD) ausgeführt wird. Möglicherweise können Sie auch den Durchsatz verbessern, indem Sie auf jede Art von Stateful Packet Filtering verzichten.
quelle
Haben Sie mit einem FIB_TRIE anstelle von FIB_HASH untersucht.
FIB_TRIE sollte für Ihre Präfixzählungen viel besser skaliert werden. (/ 32s Null-Routen sind immer noch Präfixe, nur sehr spezifisch)
Möglicherweise müssen Sie Ihren eigenen Kernel kompilieren, um ihn zu verwenden, aber es hilft.
FIB_TRIE Hinweise
quelle
Für die Nachwelt: Laut
ipset
Dokumentation ist die Standardgröße eines Sets 65536, dies kann durch Optionen geändert werden.Ich habe dies hier eingestellt, da ich noch keinen Kommentar abgeben kann.
quelle
Einige hilfreiche Hinweise für alle, die in Zukunft auf dieses Problem stoßen:
Analysieren Sie zunächst keinen Verkehr, den Sie nicht benötigen. Wenn Sie beispielsweise den TCP-Verkehr blockieren, filtern Sie nur die SYN-Pakete. Auf diese Weise treffen Sie den Filter nur einmal pro Verbindung. Sie können verwenden,
-m state
wenn Sie möchten, aber die Verbindungsverfolgung hat ihren eigenen Overhead, den Sie möglicherweise vermeiden möchten, wenn die Leistung ein Problem darstellt.Zweitens dauert es lange, eine Million Regeln in iptables abzulegen: mehrere Minuten. Wenn Sie so viele Entitäten nachverfolgen müssen, sollten Sie sie wahrscheinlich außerhalb von Netfliter aufbewahren. Die schiere Größe des Regelsatzes macht einen Unterschied.
Drittens ist das Ziel, lineare Scans zu vermeiden; Leider sind sowohl iptables als auch iproute2 von Natur aus linear. Sie können Ihre Regeln im Binärbaumstil in eine große Anzahl von Ketten aufteilen, wodurch die Anzahl der Regeln, die Sie konsultieren müssen, begrenzt wird. Trotzdem ist iptables für diese Problemgröße nicht gut geeignet. Es wird funktionieren , aber es ist eine Verschwendung von wertvollen Ressourcen.
Viertens und vor allem ist es keine schlechte Idee, die Arbeitslast auf den Benutzerbereich zu verlagern. Auf diese Weise können Sie Ihren eigenen engen Code schreiben oder eine Standardlösung verwenden, die auf Ihre Problemstellung abgestimmt ist. Wie bereits erwähnt, bestand meine eigene Lösung darin, BDB-Lookups zu verwenden, die über das mod_rewrite-System von apache ausgelöst wurden. Dies hatte den zusätzlichen Vorteil, nur eine Suche pro Sitzung auszulösen, und zwar erst, nachdem eine gültige Anfrage eingereicht wurde. In diesem Fall war die Leistung extrem schnell und die Kosten für die Sperrliste waren nahezu vernachlässigbar.
Sie können ähnliche Benutzerbereichsmanipulationen mit iptables ausführen, indem Sie das
-j QUEUE
Ziel in Verbindung mit verwendenlibnetfilter_queue
. Dieses Tool ist leistungsstark, einfach und schlecht dokumentiert. Ich würde empfehlen, so viel wie möglich aus so vielen Quellen zu lesen, wie Sie finden können, da im Internet viele interessante Materialien verstreut sind, die nicht Teil einer offiziellen Dokumentation sind.quelle