Como posso organizar os IPs/CIDR ao executar o restore ipset?

Como posso organizar os IPs/CIDR ao executar o restore ipset?

Eu tenho este script bash do ipset v7.15 (executado no Ubuntu 22.04), cortesia deMartinho(que fiz algumas modificações para esta questão):

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

conteúdo 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

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

fora ipset -L(o 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 você pode ver, os IPs/CIDRs na blacklistsaída estão confusos (no sort).

Ipset tem essa opção:

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

Mas tentei com o seguinte comando e a saída é a mesma (sem sort. Talvez não esteja usando corretamente):

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

E se eu remover -!a opção do restorecomando, recebo o seguinte erro:

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

Então, acho que meu script está com um erro, pois adiciona uma linha que acho que não deveria estar lá:

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

então posso remover a savelinha para evitar o erro, deixando assim:

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

Mas a saída permanece a mesma, sem classificação, quando executo ipset -L, então a -sortedopção (-s) não está funcionando emrestore

Como posso corrigir isso para que a saída seja organizada?

Responder1

Algumas informações básicas sobre ipset: ​​Esta é uma ferramenta de linha de comando para manipular conjuntos de dados que são redimensionados na memória do kernel. Como tal, ipset é apenas um wrapper para chamar o código real, que reside dentro do kernel - incluindo o código para listar o conteúdo de um conjunto. Aqui vem a parte complicada:

Você passou uma opção que gostaria que a saída do conjunto fosse ordenada - mas o módulo do kernel responsável por isso não conhecia essa opção e simplesmente a ignorou. Todas as funções executadas no contexto do kernel devem ser rápidas e podem congelar o sistema se demorarem muito. É por isso que o desenvolvedor do kernel é bastante exigente quando o código não é estritamente necessário (a classificação é cara em termos de tempo de CPU e desnecessária - isso também pode ser feito no espaço do usuário).

Não sei qual versão do kernel é necessária para "habilitar" a saída ordenada de um conjunto, testei com a versão 6.0.9 do kernel, onde a opção de ordenar a saída fez o que deveria. É uma pena que eles tenham removido a dica de algumas páginas de manual,aquié uma versão da página de manual que ainda contém essa dica.

O conjunto estar nesta ordem não é um erro, na verdade é uma característica: em uma lista, você teria que passar por cada item para verificar se o IP de entrada faz parte dessa lista. Isso torna cada pesquisa dependente do tamanho da sua lista. Um hash é diferente: Afunçãoé usado para calcular um valor hash de seus dados (o IP neste caso). Este valor hash é usado como referência na posição dentro dos seus dados - se houver uma entrada lá, o IP está dentro dessa lista.

Esta forma de organizar o seu conjunto torna o tempo necessário para pesquisar um valor constante - independente do tamanho do seu conjunto! Um tempo de resposta rápido é sempre importante quando se trata de tráfego de rede.

Espero que isso ajude a entender melhor as coisas...

informação relacionada