Cómo bloquear más de 100 000 direcciones IP individuales

2 minutos de lectura

avatar de usuario
baba

Introducción

¿Cómo se bloquea una gran cantidad de IP address desde su aplicación/servidor web. Obviamente, eso se puede hacer fácilmente en PHP o cualquier lenguaje de programación

$ipList = []; // array list or from database
if (in_array(getIP(), $ipList)) {
    // Log IP & Access information
    header("https://www.google.com.ng/search?q=fool"); // redirect
    exit(); // exit
} 

o usando htaccess

order allow,deny
deny from 123.45.6.7
deny from 012.34.5.
# .... the list continues
allow from all

Los problemas

  • Estoy tratando de bloquear un todo 100k plus individual IPs no subnets
  • Estoy tratando de evitar que el usuario acceda a PHP antes de bloquear dicha IP
  • 100000+ es más de 1,5 MB y eso es mucho si la información se carga en htaccess todo el tiempo
  • La base de datos de IP sigue creciendo… y sería necesario agregar dinámicamente más valores
  • Para establecer prohibiciones en iptables para 100000+ es simplemente ridículo (podría estar equivocado)

Idea estúpida

order allow,deny
deny from database    <-------- Not sure if this is possible
allow from all

Pregunta

  • ¿Es posible para htaccess para obtener la lista de la base de datos (Redis, Crunchbase, Mongo, MySQL o incluso Sqlite) … cualquiera
  • ¿Existe una solución visible para gestionar este tipo de problema en producción?
  • Sé que la mejor solución es Block the IPs at the firewall level ¿Hay alguna forma pragmática de agregar/eliminar IP al firewall?

Por fin

Mi enfoque puede ser totalmente erróneo… todo lo que quiero es una solución visible, ya que los spammers y las botnets van en aumento…

por favor esto no tiene nada que ver DOS atacar es un simple… get lost response

Actualizar

  • cortafuegos: Cisco PIX 515UR

  • ¿Qué sucede si prohíbe una IP dinámica y bloquea a un visitante inocente?

    – Kermit

    22 de marzo de 2013 a las 20:51

  • si está bloqueando direcciones IP, debería hacerlo en el firewall, evitando que los paquetes lleguen a las entrañas de su servidor en primer lugar.

    – Marc B.

    22 de marzo de 2013 a las 20:51

  • si, estoy de acuerdo con marc. Esto debe hacerse a nivel del firewall, donde su único trabajo es bloquear el tráfico no deseado <_< usa PHP para llamar a cualquier comando del sistema que tenga que agregar y eliminar direcciones IP de la lista negra de firewalls.

    – Pópulo

    22 de marzo de 2013 a las 20:53

  • Con IPv6, el bloqueo de IP individuales ya no funcionará. Y todo el mundo se verá obligado a ofrecer IPv6 en el próximo año o dos. De lo contrario, muchos clientes solo de IPv6 aparecerán como una sola dirección IPv4; no se pueden bloquear. Y el espacio de direcciones IPv6 es tan grande que no puede simplemente bloquear un /64 porque los proveedores pueden asignar un /56 a sus usuarios, o incluso un /48. Aplicar diferentes medidas para combatir el spam.

    – Sven

    27 de marzo de 2013 a las 23:59

  • ¿De qué mejor manera estás sugiriendo a @Sven?

    – Babá

    28 de marzo de 2013 a las 7:42

avatar de usuario
jon lin

Algo que puede intentar es mantener una lista de las direcciones IP que desea bloquear en un Archivo de texto o convertirlo en un archivo hash dbmluego usa mod_rewrite RewriteMap. Tendría que configurar esto en la configuración de su servidor/vhost. No puede inicializar un mapa en un archivo htaccess.

RewriteEngine On
RewriteMap deny_ips txt:/path/to/deny_ips.txt

RewriteCond ${deny_ips:%{REMOTE_ADDR}|0} !=0
RewriteRule ^ - [L,F]

Él /ruta/a/deny_ips.txt archivo se vería algo como esto:

12.34.56.78 1
11.22.33.44 1
etc.

Esencialmente, una IP que desea denegar y un espacio luego un “1”. Cualquier IP en este archivo de texto hará que el servidor devuelva un 403 Prohibido. Para acelerar un poco las cosas, puede usar el httxt2dbm para generar un hash de dbm y luego definiría la asignación de la siguiente manera:

RewriteMap deny_ips dbm:/path/to/deny_ips.dbm

No estoy seguro de cuál es el impacto en el rendimiento al usar mod_rewrite como este con muchas direcciones IP, pero una prueba comparativa rápida en apache 2.2 que se ejecuta en un i686 de 3Ghz en Linux, la diferencia entre 5 direcciones IP en la lista versus 102418 es insignificante. De acuerdo a abdominalesde salida, son casi idénticos.


Abordar preguntas específicas:

¿Es posible que htaccess obtenga la lista de la base de datos (Redis, Crunchbase, Mongo, MySQL o incluso Sqlite) … cualquier

Usando un mapa de reescritura, puede usar el “prg” map type para ejecutar un programa externo para un tipo de mapeo. Luego puede escribir un script perl, php, etc. para comunicarse con una base de datos a fin de buscar una dirección IP. También tenga en cuenta las advertencias enumeradas en “Precaución”. entonces usaría este mapa como lo haría con cualquier otro mapa (RewriteCond ${deny_ips:%{REMOTE_ADDR}|0} !=0). Básicamente, esto crearía un cuello de botella para todas las solicitudes. No es la mejor solución para hablar con una base de datos.

Sin embargo, en apache 2.4, hay un dbd/fastdbd tipo de mapa, que le permite crear consultas a través de mod_dbd. Esta es una opción mucho mejor y el módulo mod_dbd administra las conexiones a la base de datos, agrupa las conexiones, etc. Entonces, la definición del mapa se vería así:

RewriteMap deny_ips "fastdbd:SELECT active FROM deny_ips WHERE source = %s"

Asumiendo que tienes una mesa “negar_ips“con 2 columnas”fuente” (la dirección IP) y “activo” (1 para activo, 0 para inactivo).

¿Existe una solución visible para gestionar este tipo de problema en producción?

Si está almacenando todas las IP bloqueadas en la base de datos, se trata de administrar el contenido de la tabla de su base de datos. Si está utilizando el tipo de mapa dbm, sé al menos perl tiene un DBI para administrar archivos dbm, por lo que puede usarlo para agregar/eliminar entradas de IP de la lista de denegación. Nunca lo he usado antes, así que realmente no puedo decir mucho al respecto. Administrar un archivo de texto sin formato será mucho más complicado, especialmente si planea eliminar entradas y no solo agregarlas. Aparte de usar una base de datos y apache 2.4’s mod_dbd, no creo que ninguna de estas soluciones esté lista para usar o lista para producción. Va a requerir trabajo personalizado.

Sé que la mejor solución es bloquear las direcciones IP en el nivel del cortafuegos. ¿Hay alguna forma de agregar/eliminar pragmáticamente IP al cortafuegos?

Para IPtables, hay un interfaz perl eso está marcado como Beta, pero nunca lo he usado antes. hay libiptc pero según preguntas frecuentes de netfilter:

¿Existe una API de C/C++ para agregar/eliminar reglas?

Desafortunadamente, la respuesta es no.

Ahora podrías pensar ‘pero ¿qué pasa con libiptc?’. Como se ha señalado numerosas veces en la(s) lista(s) de correo, libiptc fue NUNCA destinado a ser utilizado como una interfaz pública. No garantizamos una interfaz estable, y está previsto eliminarla en la próxima encarnación del filtrado de paquetes de Linux. libiptc es una capa demasiado baja para usarse razonablemente de todos modos.

Somos muy conscientes de que existe una falta fundamental para dicha API, y estamos trabajando para mejorar esa situación. Hasta entonces, se recomienda usar system() o abrir una tubería en la entrada estándar de iptables-restore. Este último le dará un rendimiento mucho mejor.

Entonces, no sé qué tan viable es una solución libiptc si no hay estabilidad de API.

  • +buen uno… nunca usado htaccess con el archivo .. .. ¿algún problema de rendimiento?

    – Babá

    22 de marzo de 2013 a las 22:49

  • @Baba El mapa debe definirse en la configuración de vhost/servidor, provocará un error en htaccess. Sin embargo, la regla en sí se puede colocar en un archivo htaccess y, obviamente, es un poco más lento que en la configuración de vhost/servidor, pero el archivo es corto (no contiene las IP de 100 000), por lo que no debería haber ningún rendimiento adicional. cuestiones.

    – Jon Lin

    22 de marzo de 2013 a las 22:56

  • @JonLin, sí, la regla podría moverse a un .htaccess archivo, pero como señala, el mapa debe definirse en la configuración de vhost/servidor, entonces, ¿cuál es el punto del impacto en el rendimiento de mover la regla a un .htaccess ¿expediente?

    – TerryE

    23 de marzo de 2013 a las 9:35

  • @JonLin, y ¿cómo manejar las actualizaciones? No veo un método conveniente para actualizar el archivo sin que se produzcan problemas de bloqueo/concurrencia/etc.

    – Alejandro

    23 de marzo de 2013 a las 21:14

  • @Baba Según el Documentos de RewriteMap: Las claves buscadas son almacenadas en caché por httpd hasta que cambia el mtime (hora modificada) del archivo de mapa, o se reinicia el servidor httpd. Esto garantiza un mejor rendimiento en los mapas que son llamados por muchas solicitudes. No necesitarás reiniciar.

    – Jon Lin

    14/04/2013 a las 17:50

  • Para administración: agregar/eliminar direcciones IP => Un script PHP backend será suficiente. Para verificar el script a: php de ip entrante, b: .htaccess invocando algo mágico (de nuevo, tal vez php) que no estoy familiarizado. En términos generales, implementar esto es un juego de niños, integrarlo a un firewall o htaccess es un misterio para mí. Puedo agregar ejemplos de php a mi respuesta si lo desea.

    – Volkan

    1 de abril de 2013 a las 10:03


  • Agregué un script de bloqueo para el modo de plano de bits 8K 8K.

    – Volkan

    1 de abril de 2013 a las 12:27

  • @Ihsan ¿Dónde diablos estás? ¿No hay más espacio PHP? hazme un ping para que elimine este comentario

    – Sr. Alien

    20 de julio de 2013 a las 8:31


  • Esta es una linda solución, pero estamos llegando al punto en que en algún lugar algunas personas pueden usar IPv6.

    – Camilo Martín

    26 de diciembre de 2013 a las 21:26

avatar de usuario
Libertad_Ben

Debe hacer esto con un firewall externo, no en PHP. yo recomiendo pfSense o FP. Lo he usado antes y es muy fácil de usar, muy intuitivo y extremadamente poderoso. Es la elección de los mejores administradores de sistemas. Lo ejecuto en FreeBSD, pero también funciona muy bien en OpenBSD. Soy un chico de Linux, así que me duele decir esto, pero no intenta ejecutarlo en Linux. BSD es fácil y puede resolverlo rápidamente.

Una característica asombrosa de pfSense es la capacidad de configurar mediante scripts y restringir el acceso de configuración a una sola interfaz de red (para que solo las cosas en la LAN puedan configurarlo). También tiene un par de funciones de nivel ID10T para evitar que corte su propio acceso accidentalmente.

También debe tener en cuenta que muchos spammers pueden cambiar de IP rápidamente usando cosas como Colina. Para solucionar esto, debe incluir en su lista de bloqueo las direcciones que se conocen para los nodos de salida (esta lista está disponible en varios lugares).

avatar de usuario
ConejitoEthr

Si desea una forma de agregar/eliminar mediante código, eche un vistazo a denegar hosts. Puede mantener la lista de IP a través del código o parchear la fuente para leer desde cualquier ubicación que desee.

Hay un proyecto con netfilter para eso llamado ipset para que pueda agregar o quitar ip a una lista y solo tiene que crear una regla contra esta lista

http://ipset.netfilter.org/

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad