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 -A
opçã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 add
ou-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.txt
conté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, ipset
neste 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...