Ipset con Iptables con gran lista de rangos de IP (CIDR)

Ipset con Iptables con gran lista de rangos de IP (CIDR)

He leído algunas respuestas aquí sobre el bloqueo de rangos de direcciones IP y ya las he usado iptablespara este propósito antes. Se sugiere utilizar ipseten combinación con iptables.

solo lo he instaladoipsetpero aún no lo he configurado.

encontré este sitioip2location.compara generar una lista de IP a prohibir por país. Seleccioné los 5 países a los que se dirigen nuestros sitios con regularidad, pero la lista es enorme.256000 filas.

  • ¿Esta lista masiva ralentizaría mi servidor cuando lo uso ipset? (antes de intentar esto usando solo IPtables, cuestioné que un archivo tan grande pudiera reducir el rendimiento).
  • Si ese es el caso, ¿cuál es la manera de hacerlo? Por el momento uso fail2ban pero no creo que la configuración para nginx esté correctamente configurada (supongo que es una expresión regular). En cualquier caso, necesito una forma más sólida.
  • Finalmente, no pretendo entender CIDR lo suficiente como para hacer esta lista más pequeña (agregue rangos de IP similares si es posible).

Por ejemplo, hay varias entradas /21:

185.179.152.0/22

Una herramienta en línea muestra que esto se resuelve en: 185.179.152.0 a 185.179.155.255

No creo que haya una manera fácil de reducir las entradas, por lo que cualquier consejo sobre problemas de implementación y rendimiento, por favor.

Respuesta1

Hay una utilidad de línea de comando llamada aggregate. Toma una lista de bloques de red CIDR y agrega bloques consecutivos en el bloque más grande correspondiente. También elimina bloques de red redundantes.

Por ejemplo:

$ aggregate -q << EOF
> 192.168.0.0/24
> 192.168.1.0/24
EOF
192.168.0.0/23

Aliméntelo con un archivo de texto que contenga solo sus bloques CIDR e intentará agregarlos, reduciendo el tamaño de la lista.

Desde la página de manual:

DESCRIPTION
       Takes  a list of prefixes in conventional format on stdin, and performs
       two optimisations to attempt to reduce the length of the prefix list.

       The first optimisation is to remove any supplied prefixes which are su‐
       perfluous because they are already included in another supplied prefix.
       For example, 203.97.2.0/24 would be removed if 203.97.0.0/17  was  also
       supplied.

       The  second  optimisation identifies adjacent prefixes that can be com‐
       bined under a single, shorter-length prefix. For example, 203.97.2.0/24
       and 203.97.3.0/24 can be combined into the single prefix 203.97.2.0/23.

aggregateestá empaquetado en la mayoría de las principales distribuciones de Linux, incluido Ubuntu.

(Tenga en cuenta que saqué una lista de ese sitio web e intenté agregarlos y no pasó nada, por lo que es posible que ya estén agregados. Sin duda, puede usar más de un ipset, que probablemente sea lo mejor que puede hacer aquí).

Respuesta2

Por lo general, la longitud máxima de una lista ipset es de 65536 elementos, por lo que es posible que tengas que usar una lista separada para cada país que desees bloquear.

Usando un conjunto hash:net puede agregar directamente los registros CIDR que desea prohibir. Quizás quieras comprobarhttps://www.ipdeny.com/ipblocks/para bloques a nivel de país

En cuanto a tus preguntas

  • ipset no debería ralentizar significativamente su sistema: utilizará algo de memoria para conservar los conjuntos, pero por lo demás la carga no debería notarse
  • Es bueno conservar fail2ban, ya que los atacantes pueden usar servidores en la nube/vps en cualquier país.

Finalmente, hay muchas preguntas similares sobre el uso de iptables con ipset para bloquear países específicos, por lo que no entraré en detalles de configuración de iptables, solo verifique https://askubuntu.com/questions/868334/block-china-with-iptableso similar

Respuesta3

¿Podrías usar elxt_geoip¿Complemento xtables en su lugar?

geoip vs ipset xt_geoip utiliza el formato (probablemente) más eficiente, un blob empaquetado (no comprimido). Cargar un país en el kernel cuesta tanto como el archivo en el disco.

Dado que ipset no admite rangos arbitrarios de IPaddr-IPaddr, sería necesario aproximar eso usando, por ejemplo, múltiples entradas de red/longitud de prefijo. Además, si se utiliza un tipo de conjunto de hash, puede asumir que, por la naturaleza de los hash y/o los árboles, algunos depósitos permanecen vacíos y/o se requieren metadatos adicionales. Por lo tanto, la huella de memoria con un geoip basado en ipset es naturalmente mayor. Informes de usuario1indican que puede llegar a ser dos órdenes de magnitud mayor en ciertos casos (iptreemap).

El tiempo de búsqueda de xt_geoip es O(log2(rangos)), por lo que para buscar una dirección dentro de 20.000 rangos, se requieren como máximo 15 iteraciones cada una con comparaciones de direcciones (como máximo 3). ipset usa Jenkins3 para el hash, lo que tiene un cierto costo de tiempo propio.

Hasta el momento no se han realizado pruebas empíricas de sincronización.

información relacionada