paint-brush
A los bots les encanta desperdiciar los recursos de su servidor: aquí le mostramos cómo contraatacarpor@wasteofserver
Nueva Historia

A los bots les encanta desperdiciar los recursos de su servidor: aquí le mostramos cómo contraatacar

por Frankie6m2025/02/20
Read on Terminal Reader

Demasiado Largo; Para Leer

Utilice HAProxy para limitar la cantidad de bots que siguen accediendo a su servidor en URL 404.
featured image - A los bots les encanta desperdiciar los recursos de su servidor: aquí le mostramos cómo contraatacar
Frankie HackerNoon profile picture
0-item

Si administra un servidor web público, habrá notado que los bots prueban suerte en una gran cantidad de páginas inexistentes. Aproveche HAProxy para detenerlos en la puerta.


Nota: Los enlaces de este artículo incluyen enlaces de afiliados a Amazon. No se te cobrará nada adicional por hacer clic en estos enlaces, pero me estarás apoyando si decides comprar algo a través de uno de ellos. ¡Gracias!


Sus registros están repletos de consultas 404 en /.DS_Store , /backup.sql , /.vscode/sftp.json y una multitud de otras URL. Si bien estas solicitudes son en su mayoría inofensivas, a menos que, por supuesto, su servidor realmente tenga algo que ofrecer en esas ubicaciones, debería apaciguar a los bots.


¿Por qué?


Acceder a un servidor es una tarea que consume muchos recursos y, dado que esos bots tienen una lista extensa de URL diferentes, no existe ningún mecanismo de almacenamiento en caché que pueda ayudarlo. Además, detener a los bots siempre es una medida de seguridad.


Anteriormente hemos utilizado HAProxy para mitigar ataques a la página de inicio de sesión de Wordpress , la idea es ampliar ese enfoque para cubrir también los errores 404.


Bots will try their best to create havoc in your server

Los bots harán todo lo posible para crear estragos en su servidor.

Me inspiré en Sasa Tekovic , concretamente en no bloquear los rastreadores de motores de búsqueda reales y permitir el error 404 en recursos estáticos para evitar que los recursos reales faltantes (un error de su parte) no bloqueen a los usuarios legítimos.


Antes de implementar, siempre es bueno crear un entorno de prueba local. Comencemos con HAProxy y Apache usando Docker . Necesitamos un servidor backend real que nos dé esos 404 .


 version : '3' services: haproxy: image: haproxy:3.1.3-alpine ports: - "8100:80" volumes: - "./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg" networks: - webnet apache: image: httpd:latest container_name: apache1 ports: - "8080:80" volumes: - ./html:/usr/local/apache2/htdocs/ networks: - webnet networks: webnet:


Luego, simplemente ejecute docker-compose up y podrá acceder a localhost:8100 en su navegador.


El archivo haproxy.cfg se explica por sí solo:


 global log stdout format raw daemon debug defaults log global mode http frontend main bind *:80 acl static_file path_end .css .js .jpg .jpeg .gif .ico .png .bmp .webp .csv .ttf .woff .svg .svgz acl excluded_user_agent hdr_reg(user-agent) -i (yahoo|yandex|kagi|(google|bing)bot) # tracks IPs but exclude hits on static files and search engine crawlers http-request track-sc0 src table mock_404_tracking if !static_file !excluded_user_agent # increment gpc0 if response code was 404 http-response sc-inc-gpc0(0) if { status 404 } # checks if the 404 error rate limit was exceeded http-request deny deny_status 403 content-type text/html lf-string "404 abuse" if { sc0_gpc0_rate(mock_404_tracking) ge 5 } # whatever backend you're using use_backend apache_servers backend apache_servers server apache1 apache1:80 maxconn 32 # mock backend to hold a stick table backend mock_404_tracking stick-table type ip size 100k expire 10m store gpc0,gpc0_rate(1m)


Si recibe más de 5 resultados en solicitudes 404 en un solo minuto, el bot será baneado por 10 minutos.




Tal como está, esta configuración limita eficazmente la cantidad de bots que generan errores 404 excesivos. Sin embargo, también queremos integrarla con nuestro ejemplo anterior, donde usamos HAProxy para bloquear ataques a WordPress .


 global log stdout format raw daemon debug defaults log global mode http frontend main bind *:80 # We may, or may not, be running this with Cloudflare acting as a CDN. # If Cloudflare is in front of our servers, user/bot IP will be in # 'CF-Connecting-IP', otherwise user IP with be in 'src'. So we make # sure to set a variable 'txn.actual_ip' that has the IP, no matter what http-request set-var(txn.actual_ip) hdr_ip(CF-Connecting-IP) if { hdr(CF-Connecting-IP) -m found } http-request set-var(txn.actual_ip) src if !{ hdr(CF-Connecting-IP) -m found } # gets the actual IP on logs log-format "%ci\ %hr\ %ft\ %b/%s\ %Tw/%Tc/%Tt\ %B\ %ts\ %r\ %ST\ %Tr IP:%{+Q}[var(txn.actual_ip)]" # common static files where we may get 404 errors and also common search engine # crawlers that we don't want blocked acl static_file path_end .css .js .jpg .jpeg .gif .ico .png .bmp .webp .csv .ttf .woff .svg .svgz acl excluded_user_agent hdr_reg(user-agent) -i (yahoo|yandex|kagi|google|bing) # paths where we will rate limit users to prevent Wordpress abuse acl is_wp_login path_end -i /wp-login.php /xmlrpc.php /xmrlpc.php acl is_post method POST # 404 abuse blocker # track IPs but exclude hits on static files and search engine crawlers # increment gpc0 counter if response status was 404 and deny if rate exceeded http-request track-sc0 var(txn.actual_ip) table mock_404_track if !static_file !excluded_user_agent http-response sc-inc-gpc0(0) if { status 404 } http-request deny deny_status 403 content-type text/html lf-string "404 abuse" if { sc0_gpc0_rate(mock_404_track) ge 5 } # wordpress abuse blocker # track IPs if the request hits one of the monitored paths with a POST request # increment gpc1 counter if path was hit and deny if rate exceeded http-request track-sc1 var(txn.actual_ip) table mock_wplogin_track if is_wp_login is_post http-request sc-inc-gpc1(1) if is_wp_login is_post http-request deny deny_status 403 content-type text/html lf-string "login abuse" if { sc1_gpc1_rate(mock_wplogin_track) ge 5 } # your backend, here using apache for demonstration purposes use_backend apache_servers backend apache_servers server apache1 apache1:80 maxconn 32 # mock backends for storing sticky tables backend mock_404_track stick-table type ip size 100k expire 10m store gpc0,gpc0_rate(1m) backend mock_wplogin_track stick-table type ip size 100k expire 10m store gpc1,gpc1_rate(1m)


Corriendo con dos stick tables , y deteniendo ambas amenazas.


Y ahí lo tienes. HAProxy una vez más se usa para mucho más que como un simple proxy inverso. ¡Es una pequeña navaja suiza!



Este faro ha sido un cambio radical a la hora de realizar reparaciones.


Tenía uno, pero cuando se rompió, dudé en reemplazarlo y recurrí a la linterna del teléfono. Y, claro, funciona, pero una vez que experimentas la comodidad de tener las dos manos libres nuevamente , no hay vuelta atrás. Si necesitas iluminación confiable y manos libres, ¡este es un artículo imprescindible!


Esta publicación se publicó originalmente en https://wasteofserver.com/stop-404-prying-bots-with-haproxy/ , puede encontrar revisiones más nuevas y comentarios adicionales allí.