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
Ciclo:
#!/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 " Man Ipset ", e neste ponto, estou assumindo que add
é igual a -A
, já que a saída em ambos os casos é o mesmo.
#!/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
fora os dois 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", mas li que adicionar os IPs e CIDR com ipset -A
é muito lento. O que é mais rápido usando ipset save and restore . Mas não entendo como funciona, e minha tentativa falhou:
Observação: 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
Agradeço qualquer ajuda (com uma resposta completa, incluindo o loop proposto ou correções no meu loop)
Isso funcionou para mim:
Por favor, adapte as opções na declaração de criação 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:depois, uma restauração funciona muito bem.
atualizar
o gargalo de tal 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, as opções são analisadas para cada linha que você gostaria de adicionar...Meu loop contém apenas comandos bash-internos, 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 do que mais de 10.000 chamadas para ipset...