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 -A
Option 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 add
dasselbe 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 -A
sehr 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 add
oder-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.txt
nur 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 …