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, blacklist
sind die IPs/CIDRs in der Ausgabe durcheinander (kein sort
).
-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 restore
Befehl 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, save
um 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 -L
die Option (-s) nicht in-sorted
restore
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 ...