23 votos

El uso de IPtables o nulo de ruta para el establecimiento de listas negras alrededor de 1 millón de direcciones IP?

Me he encontrado con una situación en la que una de las necesidades del cliente a la lista negra de un conjunto de sólo menos de 1 millón de direcciones IP individuales (no subredes), y el rendimiento de la red es una preocupación. Mientras yo conjetura de que las reglas IPTables tendría menos de un impacto en el rendimiento de las rutas, eso es sólo una conjetura.

¿Alguien tiene alguna evidencia sólida o de otra justificación para favorecer a cualquiera de las IPTables o nulo de enrutamiento como solución para el establecimiento de listas negras largas listas de direcciones IP? En este caso todo está automatizado, por lo que la facilidad de uso no es realmente una preocupación.

EDICIÓN 26-Nov-11

Después de algunas pruebas y el desarrollo, parece que ninguna de estas opciones son viables. Parece que tanto la ruta de las búsquedas y de iptables lineal hacer búsquedas a través de los juegos de reglas, y simplemente tomar demasiado tiempo para este proceso que muchas de las normas. En hardware moderno, poniendo 1M de elementos en una iptables lista negra ralentiza el servidor hasta aproximadamente 2 docenas de paquetes por segundo. Así IPTables y nulo de las rutas de salida.

ipset, según lo recomendado por Jimmy Hedman, sería genial, excepto que no permiten el seguimiento de más de 65536 direcciones en un conjunto, por lo que ni siquiera puedo intentar usarlo a menos que alguien tenga alguna idea.

Al parecer la única solución para el bloqueo de este muchas IPs está haciendo en un índice de búsqueda en la capa de aplicación. Es que no es así?


Más Información:

El uso del caso en este ejemplo es el bloqueo de un "delincuentes conocidos" lista de direcciones IP de acceso a contenido estático en un servidor web. FWIW, haciendo de bloqueo a través de Apache Deny from es igual de lento (si no más) como también se hace una exploración lineal.


FYI: trabajo Final la solución fue usar apache mod_rewrite en conjunto con una base de datos berkeley DB mapa para hacer búsquedas en contra de la lista negra. El indexado de la naturaleza de berkeley DBs permitido la lista a escala con O(log N) el rendimiento.

15voto

Steve Mould Puntos 141

trate de usar iptables y la construcción de multi-nivel de árbol para disminuir el número de búsquedas.

iptables -N rules_0_0_0_0_2
iptables -N rules_64_0_0_0_2
iptables -N rules_128_0_0_0_2
iptables -N rules_192_0_0_0_2
iptables -N rules_0_0_0_0_4
iptables -N rules_16_0_0_0_4

iptables -A INPUT -p tcp --dport 80 -s 0.0.0.0/2 -j rules_0_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 64.0.0.0/2 -j rules_64_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 128.0.0.0/4 -j rules_128_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 192.0.0.0/4 -j rules_192_0_0_0_2

iptables -A rules_0_0_0_0_2 -s 0.0.0.0/4 -j rules_0_0_0_0_4
iptables -A rules_0_0_0_0_2 -s 16.0.0.0/4 -j rules_16_0_0_0_4

y así sucesivamente - la adición de los niveles de anidamiento; obviamente se necesita de una forma automática de la construcción de las reglas y usted debe tener cadenas sólo para las redes donde usted tiene uno o más de los delincuentes - de esta manera usted puede reducir el número de búsquedas que se han realizado de forma bastante considerable y creo que podría funcionar.

11voto

gimel Puntos 30150

Esto es exactamente lo ipset .

Desde su sitio web http://ipset.netfilter.org/:

Si quieres

  • almacenar múltiples direcciones IP o números de puerto y el partido contra la colección de iptables en un solo golpe;
  • actualizar dinámicamente reglas iptables en contra de direcciones IP o puertos sin la penalización de rendimiento;
  • expresar complejos dirección IP y los puertos de la base de reglas con una sola regla iptables y se benefician de la velocidad de la IP fija

luego ipset puede ser la herramienta adecuada para usted.

Está escrito por un netfilter miembro fundamental del equipo Jozsef Kadlecsik (quien también escribió el objetivo REJECT) así que esta es la mejor opción que se me ocurre.

Incluso es incluido en los núcleos recientes.

5voto

Per von Zweigbergk Puntos 1220

No he probado a mí mismo, pero cuando oí su descripción del problema al instante me pensaba "pf" (como de OpenBSD).

pf tiene el concepto de tablas de direcciones que puede ser lo que estás buscando.

Según algunos muy superficial de la investigación que hice, parece que esto tiene el potencial de escala mejor que ipset. Según la PF FAQ del capítulo de Opciones en tiempo de ejecución, fuera de la caja sin sintonizar, pf admite un total de 1.000 mesas, con un total de 200.000 entradas a través de todas las tablas por defecto. (100.000 euros si el sistema tiene <100 mb de memoria física). Esto me lleva a creer que es por lo menos vale la pena considerar tratando de poner a prueba este a ver si funciona en cualquier tipo de nivel útil.

Por supuesto, estoy asumiendo que usted está ejecutando sus servidores en Linux, así que vas a tener una nueva firewall cuadro de la ejecución de algunos OS con pf (como OpenBSD o FreeBSD). También podría ser capaz de mejorar el rendimiento por acabar con cualquier tipo de filtrado de paquetes con estado.

1voto

tylerl Puntos 8195

Algunas notas de utilidad para cualquier persona que se tropieza a través de este problema en el futuro:

Primero de todo, no analizar todo el tráfico que usted no necesita. Si usted está bloqueando el tráfico TCP, por ejemplo, sólo filtrar los paquetes SYN, de esa manera usted sólo golpear el filtro una vez por conexión. Usted puede utilizar -m state si usted quiere que, pero el rastreo de conexión tiene su propia sobrecarga de que usted lo desea, puede evitar si el rendimiento es un problema.

Segundo, poner un millón de reglas en iptables lleva mucho tiempo: varios minutos. Si usted necesita para realizar un seguimiento de que muchas entidades, probablemente mejor mantenerlo fuera de netfliter. El tamaño del conjunto de reglas hace una diferencia.

Tercero, el objetivo es evitar escaneos lineales; pero, por desgracia, tanto iptables y iproute2 son inherentemente lineal. Se puede dividir a sus reglas binarios estilo de árbol en un gran número de cadenas que limita el número de reglas que se tienen que consultar, pero aún así, iptables no es muy adecuado para esta dimensión del problema. Se va a trabajar, pero es un desperdicio de recursos valiosos.

Cuarto, y más importante, empujando a su carga de trabajo al espacio de usuario no es una mala idea. Esto le permite escribir sus propios apretado código o utilizar un off-the-shelf solución ajustada a su conjunto de problemas. Mi propia solución a este problema, como se mencionó, fue el uso de BDB búsquedas activa a través de apache mod_rewrite sistema. Esto tenía la ventaja añadida de disparo sólo una búsqueda por sesión, y sólo después de una solicitud válida de que se hubiera presentado. En este caso, el rendimiento fue muy rápido y el coste de la lista de bloques fue casi insignificante.

Usted puede hacer similar del espacio de usuario de manipulación con iptables mediante el uso de la -j QUEUE de destino en conjunto con libnetfilter_queue. Esta herramienta es potente, sencillo y poco documentada. Recomiendo leer tanto como sea posible de la mayor cantidad de fuentes que se pueden encontrar, ya que hay un montón de material interesante dispersas a través de la web, que no es parte de la documentación oficial.

0voto

Joel K Puntos 3367

Ha investigado el uso de un FIB_TRIE en lugar de FIB_HASH.

FIB_TRIE debe escala mucho mejor para su prefijo cuenta. (/32s null rutas siguen prefijos, muy específicos)

Usted puede ser que necesite para compilar su propio kernel a usar, sino que ayuda.

FIB_TRIE Notas

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: