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 blacklist
saída estão confusos (no sort
).
-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 restore
comando, 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 save
linha 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 -sorted
opçã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...