So fügen Sie mehrere IPs CIDR mit IPset-Speicher- und Wiederherstellungsoptionen hinzu

So fügen Sie mehrere IPs CIDR mit IPset-Speicher- und Wiederherstellungsoptionen hinzu

ich habe diese Schleife, um IPs und CIDR mit ipset/iptables zu blockieren:

# this is just an example. the actual list IPs/CIDR is very large
cat blockip.txt
13.31.0.254
cat blockcidr.txt
13.32.0.0/15

Schleife:


#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset -A blacklist $ip
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

Hinweis: Ich habe die ipset -AOption immer verwendet, weiß aber nicht genau, was diese Option bedeutet, da sie nicht in "Mann Ipset", und an diesem Punkt gehe ich davon aus, dass dies adddasselbe ist wie -A, da die Ausgabe in beiden Fällen dieselbe ist.

#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset add blacklist $ip -q
done
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

aus beiden Fällen:

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xbc0136c8
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.31.0.254
13.32.0.0/15

"Es funktioniert gut", aberich habe gelesendass das Hinzufügen der IPs und CIDR ipset -Asehr langsam ist. Was ist schneller mitipset speichern und wiederherstellen. Aber ich verstehe nicht, wie es funktioniert, und mein Versuch ist fehlgeschlagen:

Hinweis: Ich habe keine Erklärung dafür gefunden, warum es schneller ist, die Optionen Speichern/Wiederherstellen zu verwenden, anstatt addoder-A

#!/bin/bash
ipset -F
ipset -N -! blacklist hash:net maxelem 1000000
for ip in $(cat blockip.txt blockcidr.txt); do
    ipset add blacklist $ip # ??
    ipset save blacklist -f newblacklist.txt # ???
done
ipset restore -! < newblacklist.txt # ??
iptables -A FORWARD -m set --match-set blacklist dst -j DROP # ??

aus:

sudo ipset -L
Name: blacklist
Type: hash:net
Revision: 7
Header: family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
Size in memory: 552
References: 0
Number of entries: 2
Members:
13.32.0.0/15
13.31.0.254

cat newblacklist.txt # out wrong
create blacklist hash:net family inet hashsize 1024 maxelem 1000000 bucketsize 12 initval 0xcb0e583b
add blacklist 13.32.0.0/15
add blacklist 13.31.0.254

Ich würde mich über jede Hilfe freuen (mit einer vollständigen Antwort, einschließlich der vorgeschlagenen Schleife oder Korrekturen an meiner Schleife)

Antwort1

Das hat bei mir funktioniert:

# remove any old reference to the ipset
iptables -D FORWARD -m set --match-set blacklist dst -j DROP
ipset destroy

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

cat blockip.txt blockcidr.txt | while read line; do
    if [ "${line:0:1}" = "#" ]; then
        continue
    fi
    echo "add blacklist $line" >> /tmp/ipset.txt
done

ipset restore < /tmp/ipset.txt
iptables -A FORWARD -m set --match-set blacklist dst -j DROP

Bitte passen Sie die Optionen in der create-Anweisung Ihren Bedürfnissen entsprechend an - je nach Größe des Sets sind diese Optionen recht wichtig. Dies setzt weiterhin voraus, dass die Datei blockcidr.txtnur Zeilen wie diese enthält:

#comment
1.2.3.4/20

Danach funktioniert eine Wiederherstellung problemlos.

aktualisieren
Der Engpass einer solchen Schleife ist in diesem Fall immer die Erstellung eines Unterprozesses ipset. Wenn Sie über 10.000 Einträge haben, wird das ausführbare IP-Set in den Speicher geladen und die Optionen für jede Zeile, die Sie hinzufügen möchten, analysiert ...

Meine Schleife enthält nur Bash-interne Befehle, daher muss keine ausführbare Datei geladen/ausgeführt werden – es wird nur Text in eine Datei geschrieben. Und natürlich ist ein einzelner Aufruf von ipset viel schneller als über 10.000 Aufrufe von ipset …

verwandte Informationen