Wie kann ich die IPs/CIDR beim Ausführen der Wiederherstellung von IPset organisieren?

Wie kann ich die IPs/CIDR beim Ausführen der Wiederherstellung von IPset organisieren?

Ich habe dieses Bash-Skript von ipset v7.15 (läuft unter Ubuntu 22.04), mit freundlicher Genehmigung vonMartin(dass ich für diese Frage einige Änderungen vorgenommen habe):

ipset create -! blacklist hash:net family inet hashsize 1024
ipset save -! > /tmp/ipset.txt

cat list.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n | while read line; do
    echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset restore -! < /tmp/ipset.txt

Inhalt von list.txt:

125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17

aus /tmp/ipset.txt:

create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
add blacklist 1.0.132.249
add blacklist 125.73.0.0/16
add blacklist 125.74.0.0/15
add blacklist 125.76.0.0/17
add blacklist 130.255.128.0/20

raus ipset -L(das Problem):

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6
Size in memory: 696
References: 0
Number of entries: 5
Members:
125.74.0.0/15
1.0.132.249
125.73.0.0/16
130.255.128.0/20
125.76.0.0/17

Wie Sie sehen, blacklistsind die IPs/CIDRs in der Ausgabe durcheinander (kein sort).

Ipset hat diese Option:

-s, -sorted
Sorted output. When listing or saving sets, the entries are listed sorted.

Aber ich habe es mit dem folgenden Befehl versucht und die Ausgabe ist die gleiche (ohne sort. Vielleicht verwende ich es nicht richtig):

ipset restore -! -s < /tmp/ipset.txt

Und wenn ich -!die Option aus dem restoreBefehl entferne, erhalte ich die folgende Fehlermeldung:

ipset v7.15: Error in line 1: Set cannot be created: set with the same name already exists

Ich denke also, dass mein Skript einen Fehler aufweist, da es eine Zeile hinzufügt, die meiner Meinung nach nicht da sein sollte:

create blacklist hash:net family inet hashsize 1024 maxelem 65536 bucketsize 12 initval 0xf164f1c6

dann kann ich die Zeile entfernen, saveum den Fehler zu vermeiden, und sie folgendermaßen belassen:

ipset -! create blacklist hash:net family inet hashsize 1024
cat list.txt | while read line; do
    echo "add blacklist $line" >> /tmp/ipset.txt
done
ipset -s restore -f /tmp/ipset.txt

Aber die Ausgabe bleibt die gleiche, no-sort, wenn ich ausführe , also funktioniert ipset -Ldie Option (-s) nicht in-sortedrestore

Wie kann ich das beheben, damit die Ausgabe geordnet ist?

Antwort1

Einige Hintergrundinformationen zu ipset: Dies ist ein Befehlszeilentool zum Bearbeiten von Datensätzen, deren Größe sich im Kernelspeicher ändert. Daher ist ipset nur ein Wrapper zum Aufrufen des eigentlichen Codes, der sich im Kernel befindet – einschließlich des Codes zum Auflisten des Inhalts eines Satzes. Jetzt kommt der schwierige Teil:

Sie haben eine Option angegeben, dass Sie die Ausgabe des Sets sortiert haben möchten - aber das dafür zuständige Kernelmodul kannte diese Option nicht und hat sie einfach ignoriert. Alle Funktionen, die im Kernelkontext ausgeführt werden, müssen schnell sein und könnten Ihr System einfrieren, wenn sie zu lange dauern. Deshalb sind Kernelentwickler ziemlich wählerisch, wenn Code nicht unbedingt erforderlich ist (Sortieren kostet CPU-Zeit und ist nicht erforderlich - dies könnte auch im Benutzerbereich erfolgen).

Ich weiß nicht, welche Kernel-Version erforderlich ist, um die sortierte Ausgabe eines Sets zu "aktivieren". Ich habe es mit der Kernel-Version 6.0.9 getestet, wo die Option zum Sortieren der Ausgabe das tat, was sie sollte. Es ist schade, dass sie den Hinweis auf einigen Manpages entfernt haben.Hierist eine Version der Manpage, die diesen Hinweis noch enthält.

Dass die Menge in dieser Reihenfolge vorliegt, ist kein Fehler, sondern tatsächlich eine Funktion: In einer Liste müssten Sie jedes Element durchgehen, um zu prüfen, ob die eingehende IP Teil dieser Liste ist. Dadurch ist jede Suche von der Größe Ihrer Liste abhängig. Bei einem Hash ist das anders: EinFunktionwird verwendet, um einen Hashwert aus Ihren Daten (in diesem Fall die IP) zu berechnen. Dieser Hashwert wird als Referenz für die Position in Ihren Daten verwendet - wenn dort ein Eintrag vorhanden ist, befindet sich die IP in dieser Liste.

Durch diese Art der Organisation Ihres Sets bleibt die zum Nachschlagen eines Werts erforderliche Zeit konstant - unabhängig von der Größe Ihres Sets! Eine schnelle Reaktionszeit ist bei Netzwerkverkehr immer wichtig.

Ich hoffe, das trägt zum besseren Verständnis bei ...

verwandte Informationen