como adicionar múltiplos ips cidr com opções de salvar e restaurar ipset

como adicionar múltiplos ips cidr com opções de salvar e restaurar ipset

eu tenho esse loop para bloquear IPs e CIDR com 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

Laço:


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

Obs: Sempre usei a ipset -Aopção, mas não sei exatamente o que essa opção significa, pois ela não aparece em "Homem Ipset", e neste ponto, estou assumindo que addé o mesmo que -A, já que a saída em ambos os casos é a mesma.

#!/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 os 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 bem", maseu lique adicionar IPs e CIDR ipset -Aé muito lento. O que é mais rápido usandosalvar e restaurar ipset. Mas não entendo como funciona, e minha tentativa falhou:

Nota: não encontrei uma explicação de por que é mais rápido usar as opções salvar/restaurar, em vez de addou-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 # ??

fora:

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

Eu apreciaria qualquer ajuda (com uma resposta completa, incluindo o loop proposto ou correções no meu loop)

Responder1

Isso funcionou para mim:

# 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 as opções na instrução create de acordo com suas necessidades - dependendo do tamanho do conjunto, essas opções são muito importantes. Isso pressupõe ainda que o arquivo blockcidr.txtcontém apenas linhas como esta:

#comment
1.2.3.4/20

depois, uma restauração funciona perfeitamente.

atualizar
o gargalo desse loop é sempre a criação de um subprocesso, ipsetneste caso. Se você tiver mais de 10.000 entradas, o ipset executável está sendo carregado na memória, opções analisadas para cada linha que você gostaria de adicionar...

Meu loop contém apenas comandos internos do bash, portanto, nenhum executável deve ser carregado/executado - há apenas algum texto escrito em um arquivo. E claro - uma única chamada para ipset é muito mais rápida que mais de 10.000 chamadas para ipset...

informação relacionada