cómo agregar múltiples ips cidr con opciones de guardar y restaurar ipset

cómo agregar múltiples ips cidr con opciones de guardar y restaurar ipset

Tengo este bucle para bloquear IP y CIDR con ipset/iptables:

# 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

Bucle:


#!/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

Nota: Siempre he usado la ipset -Aopción, pero no sé exactamente qué significa esta opción, ya que no aparece en "hombre ipset", y en este punto, asumo que addes lo mismo que -A, ya que el resultado en ambos casos es el mismo.

#!/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

ambos casos:

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

"Funciona bien", perohe leídoque agregar las IP y CIDR ipset -Aes muy lento. ¿Cuál es más rápido usando?guardar y restaurar ipset. Pero no entiendo cómo funciona y mi intento falla:

Nota: No he encontrado una explicación de por qué es más rápido usar las opciones de guardar/restaurar, en lugar de addo-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 # ??

afuera:

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

Agradecería cualquier ayuda (con una respuesta completa, incluido el bucle propuesto o correcciones a mi bucle)

Respuesta1

Esto funcionó para mí:

# 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

Adapte las opciones en la declaración de creación según sus necesidades; dependiendo del tamaño del conjunto, estas opciones son bastante importantes. Esto supone además que el archivo blockcidr.txtcontiene sólo líneas como esta:

#comment
1.2.3.4/20

después, una restauración funciona bien.

actualizar
El cuello de botella de dicho bucle es siempre la creación de un subproceso, ipseten este caso. Si tiene más de 10000 entradas, el ipset ejecutable se está cargando en la memoria, se analizan las opciones para cada línea que desea agregar...

Mi bucle contiene solo comandos internos de bash, por lo que no se debe cargar/ejecutar ningún ejecutable; solo se escribe algo de texto en un archivo. Y, por supuesto, una sola llamada a ipset es mucho más rápida que más de 10000 llamadas a ipset...

información relacionada