Tengo este bucle para bloquear IP y CIDR con 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
Bucle:
#!/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
Nota: Siempre he usado la ipset -A
opción, pero no sé exactamente qué significa esta opción, ya que no aparece en "hombre ipset", y en este punto, asumo que add
es lo mismo que -A
, ya que el resultado en ambos casos es el mismo.
#!/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 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 bien", perohe leídoque agregar las IP y CIDR ipset -A
es muy lento. ¿Cuál es más rápido usando?guardar y restaurar ipset. Pero no entiendo cómo funciona y mi intento falla:
Nota: No he encontrado una explicación de por qué es más rápido usar las opciones de guardar/restaurar, en lugar de add
o-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 # ??
afuera:
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
Agradecería cualquier ayuda (con una respuesta completa, incluido el bucle propuesto o correcciones a mi bucle)
Respuesta1
Esto funcionó para mí:
# 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 las opciones en la declaración de creación según sus necesidades; dependiendo del tamaño del conjunto, estas opciones son bastante importantes. Esto supone además que el archivo blockcidr.txt
contiene sólo líneas como esta:
#comment
1.2.3.4/20
después, una restauración funciona bien.
actualizar
El cuello de botella de dicho bucle es siempre la creación de un subproceso, ipset
en este caso. Si tiene más de 10000 entradas, el ipset ejecutable se está cargando en la memoria, se analizan las opciones para cada línea que desea agregar...
Mi bucle contiene solo comandos internos de bash, por lo que no se debe cargar/ejecutar ningún ejecutable; solo se escribe algo de texto en un archivo. Y, por supuesto, una sola llamada a ipset es mucho más rápida que más de 10000 llamadas a ipset...