Me he encontrado con una situación en la que un cliente necesita incluir en la lista negra un conjunto de poco menos de 1 millón de direcciones IP individuales (sin subredes), y el rendimiento de la red es una preocupación. Si bien conjeturaría que las reglas de IPTables tendrían un menor impacto en el rendimiento que las rutas, eso es solo una conjetura.
¿Alguien tiene alguna evidencia sólida u otra justificación para favorecer las tablas IP o el enrutamiento nulo como solución para poner en una lista negra largas listas de direcciones IP? En este caso, todo está automatizado, por lo que la facilidad de uso no es realmente una preocupación.
EDITAR 26-nov-11
Después de algunas pruebas y desarrollo, parece que ninguna de estas opciones es viable. Parece que tanto las búsquedas de ruta como las iptables realizan búsquedas lineales a través del conjunto de reglas y tardan demasiado tiempo en procesar tantas reglas. En el hardware moderno, poner elementos de 1M en una lista negra de iptables ralentiza el servidor a aproximadamente 2 docenas de paquetes por segundo. Entonces, las tablas IP y las rutas nulas están fuera.
ipset
, según lo recomendado por Jimmy Hedman, sería genial, excepto que no le permite rastrear más de 65536 direcciones en un conjunto, por lo que ni siquiera puedo tratar de usarlo a menos que alguien tenga alguna idea.
Aparentemente, la única solución para bloquear esta cantidad de IP es realizar una búsqueda indexada en la capa de aplicación. ¿No es así?
Más información:
El caso de uso en este caso es bloquear una lista de "delincuentes conocidos" de direcciones IP para que no accedan al contenido estático en un servidor web. FWIW, hacer el bloqueo a través de Apache Deny from
es igualmente lento (si no más) ya que también hace un escaneo lineal.
FYI: La solución de trabajo final fue usar mod_rewrite de apache junto con un mapa de Berkeley DB para realizar búsquedas en la lista negra. La naturaleza indexada de las bases de datos de Berkeley permitió que la lista escalara con el rendimiento O (log N).
Respuestas:
intente usar iptables y construir un árbol de niveles múltiples para disminuir el número de búsquedas.
y así sucesivamente - agregando niveles de anidamiento; obviamente necesitará una forma automática de construir las reglas y debería tener cadenas solo para las redes donde tiene uno o más delincuentes; de esta manera puede reducir la cantidad de búsquedas que deben realizarse de manera bastante significativa y creo que podría En realidad funciona.
fuente
Esto es exactamente para lo que
ipset
sirve.Desde su sitio web http://ipset.netfilter.org/ :
Si quieres
entonces ipset puede ser la herramienta adecuada para usted.
Está escrito por un miembro del equipo central de netfilter, Jozsef Kadlecsik (quien también escribió el objetivo RECHAZAR), así que esta es la mejor opción que se me ocurre.
Incluso se incluye en los núcleos recientes.
fuente
H * 40byte + (N/4 + N%4) * 4 * element size
de aproximadamente 64 MB para direcciones 1M en un hash de ranura de 1,5 m. El uso de la solución apache / berkdb almacena los datos en el disco y solo carga las páginas de las direcciones activas.No lo he probado yo mismo, pero cuando escuché la descripción de su problema, pensé instantáneamente "
pf
" (a partir de OpenBSD).pf
tiene el concepto de tablas de direcciones que pueden ser lo que estás buscando.Según una investigación muy superficial que hice, parece que esto tiene el potencial de escalar mejor que
ipset
. De acuerdo con el capítulo de preguntas frecuentes de PF sobre Opciones de tiempo de ejecución , listo para usar sin ajustar, pf admite un total de 1,000 tablas, con un total de 200,000 entradas en todas las tablas de forma predeterminada. (100.000 si el sistema tiene <100 MB de memoria física). Esto me lleva a creer que al menos vale la pena considerar probar esto para ver si funciona en algún tipo de nivel útil.Por supuesto, supongo que está ejecutando sus servidores en Linux, por lo que debería tener una caja de firewall separada que ejecute algunos sistemas operativos con pf (como OpenBSD o FreeBSD). También podría mejorar el rendimiento eliminando cualquier tipo de filtrado de paquetes con estado.
fuente
¿Has investigado usando un FIB_TRIE en lugar de FIB_HASH.
FIB_TRIE debería escalar mucho mejor para sus recuentos de prefijos. (Las rutas nulas / 32s siguen siendo prefijos, solo que muy específicas)
Es posible que necesite compilar su propio núcleo para usarlo, pero ayuda.
Notas FIB_TRIE
fuente
Para la posteridad: según los
ipset
documentos, el tamaño predeterminado de un conjunto es 65536, esto se puede cambiar por opciones.Puse esto aquí ya que no puedo comentar todavía.
fuente
Algunas notas útiles para cualquier persona que se encuentre con este problema en el futuro:
En primer lugar, no analice el tráfico que no necesita. Si está bloqueando el tráfico TCP, por ejemplo, solo filtre los paquetes SYN, de esa manera solo golpeará el filtro una vez por conexión. Puede usarlo
-m state
si lo desea, pero el seguimiento de la conexión tiene su propia sobrecarga que puede evitar si el rendimiento es un problema.En segundo lugar, poner un millón de reglas en iptables lleva mucho tiempo: varios minutos. Si necesita rastrear tantas entidades, probablemente sea mejor mantenerlo fuera de netfliter. El gran tamaño del conjunto de reglas hace la diferencia.
Tercero, el objetivo es evitar exploraciones lineales; pero desafortunadamente, tanto iptables como iproute2 son inherentemente lineales. Puede dividir sus reglas al estilo de árbol binario en una gran cantidad de cadenas, lo que limita la cantidad de reglas que debe consultar, pero aun así, iptables no es adecuado para este tamaño de problema. Se trabajará , pero es un desperdicio de recursos valiosos.
Cuarto, y lo más importante, empujar su carga de trabajo al espacio de usuario no es una mala idea. Esto le permite escribir su propio código apretado o usar una solución estándar que esté ajustada a su conjunto de problemas. Mi propia solución a este problema, como se mencionó, fue usar búsquedas de BDB activadas a través del sistema mod_rewrite de apache. Esto tenía el beneficio adicional de activar solo una búsqueda por sesión, y solo después de que se hubiera enviado una solicitud válida. En este caso, el rendimiento fue extremadamente rápido y el costo de la lista de bloqueo fue casi insignificante.
Puede hacer una manipulación similar del espacio de usuario con iptables utilizando el
-j QUEUE
objetivo junto conlibnetfilter_queue
. Esta herramienta es poderosa, simple y poco documentada. Recomendaría leer tanto como sea posible de tantas fuentes como pueda encontrar, ya que hay una gran cantidad de material interesante disperso en la web que no forma parte de ninguna documentación oficial.fuente