
Un generador de tráfico HTTP/S "orgánico" rápido y sucio.
Un generador de tráfico HTTP/S "orgánico" rápido y sucio.
Solo un script simple de Python (mal escrito) que "navega" sin rumbo por internet comenzando en ROOT_URLS predefinidas y haciendo "clic" aleatoriamente en los enlaces de las páginas hasta alcanzar el MAX_DEPTH predefinido.
Lo creé como generador de ruido para usar en una simulación de Respuesta a Incidentes / Defensa de Red. El único problema es que mi entorno de simulación utiliza múltiples dispositivos IDS/IPS/NGFW que no pasarán ni registrarán simples TCPreplays de tráfico predefinido. Necesitaba que el tráfico fuera lo más orgánico posible, imitando esencialmente a usuarios reales navegando por la web.
Probado en Ubuntu 14.04 y 16.04 mínimos, pero debería funcionar en cualquier sistema con Python instalado.
Tan simple como parece...
Primero, especifica algunos ajustes en la parte superior del script...
MAX_DEPTH = 10, MIN_DEPTH = 5 Comenzando desde cada URL raíz (por ejemplo: www.yahoo.com), nuestro generador hará clic hasta una profundidad seleccionada aleatoriamente entre MIN_DEPTH y MAX_DEPTH.El intervalo entre cada petición HTTP GET se elige al azar entre las siguientes dos variables...
MIN_WAIT = 5 Espera un mínimo de 5 segundos entre peticiones... Ten cuidado con hacer peticiones demasiado rápido, ya que suele enfadar a los servidores web.
MAX_WAIT = 10 Creo que te haces una idea.
DEBUG = False Un logger casero. Establécelo en True para obtener una impresión detallada en tiempo real en la consola para depurar o desarrollar. Incorporaré un registro (logging) adecuado más adelante (quizás).
ROOT_URLS = [url1,url2,url3] La lista de URLs raíz desde las que comenzar a navegar. Se seleccionan aleatoriamente.
blacklist = [".gif", "intent/tweet", "badlink", etc...] Una lista negra de cadenas que comprobamos en cada enlace. Si el enlace contiene alguna de las cadenas de esta lista, se descarta. Es útil para evitar cosas que no son amigables con el generador de tráfico, como los enlaces "Tweet this!" o los enlaces a archivos de imagen.
userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3).......' Lo has adivinado, el user-agent que nuestro navegador sin interfaz gráfica (headless) entrega al servidor web. Probablemente puedas dejarlo con el valor predeterminado, pero siéntete libre de cambiarlo. Recomiendo encarecidamente usar uno común/válido, o es probable que te limiten la frecuencia de peticiones rápidamente.
Lo único que necesitas y que puede que no tengas es requests. Consíguelo con
sudo pip install requests
Primero crea tu archivo de configuración:
cp config.py.template config.py
Ejecuta el generador:
python gen.py
Para obtener más detalles sobre lo que está sucediendo bajo el capó, cambia la variable Debug en config.py de False a True. Esto proporciona la siguiente salida...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Traffic generator started
Diving between 3 and 10 links deep into 489 different root URLs,
Waiting between 5 and 10 seconds between requests.
This script will run indefinitely. Ctrl+C to stop.
Randomly selecting one of 489 URLs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://arstechnica.com] ~~~ [depth = 7]
Requesting page...
Page size: 77.6KB
Data meter: 77.6KB
Good requests: 1
Bad reqeusts: 0
Scraping page for links
Found 171 valid links
Pausing for 7 seconds...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://arstechnica.com/author/jon-brodkin/] ~~~ [depth = 6]
Requesting page...
Page size: 75.7KB
Data meter: 153.3KB
Good requests: 2
Bad reqeusts: 0
Scraping page for links
Found 168 valid links
Pausing for 9 seconds...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://arstechnica.com/information-technology/2020/01/directv-races-to-decommission-broken-boeing-satellite-before-it-explodes/] ~~~ [depth = 5]
Requesting page...
Page size: 43.8KB
Data meter: 197.1KB
Good requests: 3
Bad reqeusts: 0
Scraping page for links
Found 32 valid links
Pausing for 8 seconds...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Recursively browsing [https://www.facebook.com/sharer.php?u=https%3A%2F%2Farstechnica.com%2F%3Fpost_type%3Dpost%26p%3D1647915] ~~~ [depth = 4]
Requesting page...
Page size: 64.2KB
Data meter: 261.2KB
Good requests: 4
Bad reqeusts: 0
Scraping page for links
Found 0 valid links
Stopping and blacklisting: no links
La última URL intentada proporciona un buen ejemplo de cuándo una URL en particular genera un error. Simplemente la añadimos a nuestra matriz config.blacklist en memoria y continuamos navegando. Esto evita que una URL conocida como mala vuelva a la cola.