Ipset mit Iptables mit großer Liste von IP-Bereichen (CIDR)

Ipset mit Iptables mit großer Liste von IP-Bereichen (CIDR)

Ich habe hier einige Antworten zum Blockieren von IP-Adressbereichen gelesen und habe es bereits iptableszuvor für diesen Zweck verwendet. Es wird empfohlen, es ipsetin Kombination mit zu verwenden iptables.

Ich habe nur installiertipsetaber habe es noch nicht konfiguriert.

Ich habe diese Seite gefundenip2location.comum eine Liste der IPs zu erstellen, die nach Ländern gesperrt werden sollen. Ich habe die 5 Länder ausgewählt, die unsere Websites regelmäßig angreifen, aber die Liste ist riesig.256000 Zeilen.

  • Würde diese umfangreiche Liste meinen Server bei der Verwendung verlangsamen ipset(bevor ich dies nur mit IPtables versucht habe, habe ich mich gefragt, ob eine so große Datei die Leistung beeinträchtigen könnte.).
  • Wenn das der Fall ist, wie kann ich das tun? Im Moment verwende ich fail2ban, aber ich glaube nicht, dass die Konfiguration für nginx richtig eingerichtet ist (ich gehe von regulären Ausdrücken aus). Auf jeden Fall brauche ich eine robustere Methode.
  • Schließlich behaupte ich nicht, CIDR ausreichend zu verstehen, um diese Liste zu verkleinern (wenn möglich ähnliche IP-Bereiche aggregieren).

Beispielsweise gibt es mehrere /21-Einträge:

185.179.152.0/22

Ein Onlinetool zeigt, dass sich dies in 185.179 auflöst.152.0 bis 185.179.155.255

Ich glaube nicht, dass es eine einfache Möglichkeit gibt, die Einträge zu verringern. Ich bin daher um Ratschläge bezüglich der Implementierung und zu Leistungsproblemen dankbar.

Antwort1

Es gibt ein Befehlszeilenprogramm namens aggregate. Es nimmt eine Liste von CIDR-Netzblöcken und fasst aufeinanderfolgende Blöcke zu dem entsprechenden größeren Block zusammen. Es entfernt auch redundante Netzblöcke.

Zum Beispiel:

$ aggregate -q << EOF
> 192.168.0.0/24
> 192.168.1.0/24
EOF
192.168.0.0/23

Geben Sie ihm eine Textdatei ein, die nur Ihre CIDR-Blöcke enthält, und es wird versuchen, diese zu aggregieren, wodurch die Größe der Liste reduziert wird.

Aus der Manpage:

DESCRIPTION
       Takes  a list of prefixes in conventional format on stdin, and performs
       two optimisations to attempt to reduce the length of the prefix list.

       The first optimisation is to remove any supplied prefixes which are su‐
       perfluous because they are already included in another supplied prefix.
       For example, 203.97.2.0/24 would be removed if 203.97.0.0/17  was  also
       supplied.

       The  second  optimisation identifies adjacent prefixes that can be com‐
       bined under a single, shorter-length prefix. For example, 203.97.2.0/24
       and 203.97.3.0/24 can be combined into the single prefix 203.97.2.0/23.

aggregateist in den meisten großen Linux-Distributionen enthalten, einschließlich Ubuntu.

(Beachten Sie, dass ich eine Liste von dieser Website gezogen und versucht habe, sie zu aggregieren, und nichts passiert ist. Sie sind also möglicherweise bereits aggregiert. Sie können sicherlich mehr als ein IP-Set verwenden, was hier wahrscheinlich das Beste ist.)

Antwort2

Normalerweise beträgt die maximale Länge einer IPset-Liste 65.536 Elemente. Daher müssen Sie möglicherweise für jedes Land, das Sie blockieren möchten, eine separate Liste verwenden.

Mit einem hash:net-Set können Sie die CIDR-Einträge, die Sie sperren möchten, direkt hinzufügen. Sie sollten überprüfenhttps://www.ipdeny.com/ipblocks/für Blöcke auf Länderebene

Zu Ihren Fragen

  • ipset sollte Ihr System nicht wesentlich verlangsamen - es wird etwas Speicher zum Speichern der Sets verwenden, aber ansonsten sollte die Belastung nicht spürbar sein
  • fail2ban ist gut zu behalten, da die Angreifer Cloud-/VPS-Server in jedem Land verwenden können

Schließlich gibt es viele ähnliche Fragen zur Verwendung von iptables mit ipset, um bestimmte Länder zu blockieren, daher werde ich nicht auf die Details der Einrichtung von iptables eingehen - überprüfen Sie einfach https://askubuntu.com/questions/868334/block-china-with-iptableso.ä

Antwort3

Könnten Sie diext_geoipstattdessen xtables-Add-on?

GeoIP vs. IPSET xt_geoip verwendet das (wahrscheinlich) effizienteste Format, einen (nicht komprimierten) gepackten Blob. Das Laden eines Landes in den Kernel kostet so viel wie die Datei auf der Festplatte.

Da ipset keine beliebigen IPaddr–IPaddr-Bereiche unterstützt, müsste man dies beispielsweise durch mehrere Network/Prefixlength-Einträge approximieren. Wenn außerdem ein Hash-Set-Typ verwendet wird, kann man davon ausgehen, dass aufgrund der Art der Hashes und/oder Bäume einige Buckets leer bleiben und/oder zusätzliche Metadaten erforderlich sind. Der Speicherbedarf bei einem ipset-basierten GeoIP ist daher natürlich größer. Benutzerberichte1deuten darauf hin, dass es in bestimmten Fällen um zwei Größenordnungen höher sein kann (iptreemap).

Die Suchzeit von xt_geoip beträgt O(log2(Bereiche)), sodass zum Suchen einer Adresse innerhalb von 20.000 Bereichen höchstens 15 Iterationen mit jeweils Adressvergleichen (höchstens 3) erforderlich sind. ipset verwendet Jenkins3 zum Hashing, was wiederum einen gewissen Zeitaufwand mit sich bringt.

Bisher wurden keine empirischen Timingtests durchgeführt.

verwandte Informationen