¿Cómo puedo organizar las IP/CIDR al ejecutar la restauración de ipset?

¿Cómo puedo organizar las IP/CIDR al ejecutar la restauración de ipset?

Tengo este script bash de ipset v7.15 (ejecutado en ubuntu 22.04), cortesía deMartín(que he hecho algunas modificaciones para esta pregunta):

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

contenido de 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

afuera /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

fuera ipset -L(el problema):

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

Como puede ver, las IP/CIDR en la blacklistsalida están en mal estado (no sort).

Ipset tiene esta opción:

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

Pero lo probé con el siguiente comando y el resultado es el mismo (sin sort. Quizás no lo esté usando correctamente):

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

Y si elimino -!la opción del restorecomando, aparece el siguiente error:

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

Entonces, creo que mi script tiene un error, ya que agrega una línea que creo que no debería estar allí:

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

luego puedo eliminar la savelínea para evitar el error, dejándola así:

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

Pero el resultado sigue siendo el mismo, sin ordenar, cuando ejecuto ipset -L, por lo que la -sortedopción (-s) no funciona enrestore

¿Cómo puedo solucionar este problema para que la salida esté organizada?

Respuesta1

Alguna información general sobre ipset: ​​Esta es una herramienta de línea de comandos para manipular conjuntos de datos que cambian de tamaño dentro de la memoria del kernel. Como tal, ipset es solo un contenedor para llamar al código real, que reside dentro del kernel, incluido el código para enumerar el contenido de un conjunto. Aquí viene la parte difícil:

Usted pasó una opción que le gustaría tener la salida del conjunto ordenada, pero el módulo del núcleo responsable de esto no conocía esa opción y simplemente la ignoró. Todas las funciones que se ejecutan en el contexto del kernel deben ser rápidas y podrían congelar su sistema si tardan demasiado. Es por eso que los desarrolladores del kernel son bastante exigentes cuando el código no es estrictamente necesario (la clasificación es costosa en términos de tiempo de CPU y no es necesaria; esto también se podría hacer en el espacio de usuario).

No sé qué versión del kernel se requiere para "habilitar" la salida ordenada de un conjunto, lo probé con la versión 6.0.9 del kernel, donde la opción para ordenar la salida hizo lo que debería. Es una pena que hayan eliminado la pista en algunas páginas de manual,aquíes una versión de la página de manual que todavía tiene esa pista.

Que el conjunto esté en ese orden no es un error, en realidad es una característica: en una lista, tendría que revisar cada elemento para verificar si la IP entrante es parte de esa lista. Esto hace que cada búsqueda dependa del tamaño de su lista. Un hash es diferente: Afunciónse utiliza para calcular un valor hash a partir de sus datos (la IP en este caso). Este valor hash se utiliza como referencia en la posición dentro de sus datos; si hay una entrada allí, la IP está dentro de esa lista.

Esta forma de organizar su conjunto hace que el tiempo necesario para buscar un valor sea constante, ¡independientemente del tamaño de su conjunto! Un tiempo de respuesta rápido siempre es importante cuando se trata de tráfico de red.

Espero que esto ayude a entender mejor las cosas...

información relacionada