paint-brush
Boților le place să risipească resursele serverului dvs. — Iată cum să ripostațide@wasteofserver
Noua istorie

Boților le place să risipească resursele serverului dvs. — Iată cum să ripostați

de Frankie6m2025/02/20
Read on Terminal Reader

Prea lung; A citi

Utilizați HAProxy pentru a evalua roboții limită care continuă să lovească serverul dvs. pe 404 URL-uri.
featured image - Boților le place să risipească resursele serverului dvs. — Iată cum să ripostați
Frankie HackerNoon profile picture
0-item

Dacă gestionați un server web public, veți fi observat că roboții își încearcă norocul pe o multitudine de pagini inexistente. Folosiți HAProxy pentru a-i opri la ușă.


Notă: linkurile din acest articol includ linkuri afiliate către Amazon. Nu veți fi taxat cu nimic suplimentar pentru a face clic pe aceste linkuri, dar mă veți sprijini dacă alegeți să cumpărați ceva prin intermediul unuia dintre aceste link-uri. Mulţumesc!


Jurnalele dvs. sunt pline cu 404 accesări pe /.DS_Store , /backup.sql , /.vscode/sftp.json și o multitudine de alte adrese URL. În timp ce aceste solicitări sunt în mare parte inofensive, cu excepția cazului în care, desigur, serverul dvs. are de fapt ceva de oferit în acele locații, ar trebui să calmați roboții.


De ce?


Lovirea unui server este o sarcină care necesită mult resurse și, având în vedere că acești roboți au o listă extinsă de adrese URL diferite, nu există niciun mecanism de stocare în cache care să vă poată ajuta. În plus, oprirea roboților este întotdeauna o măsură de siguranță.


Am folosit anterior HAProxy pentru a atenua atacurile pe pagina de conectare Wordpress , ideea este să extindem această abordare pentru a acoperi și erorile 404.


Bots will try their best to create havoc in your server

Boții vor face tot posibilul pentru a face ravagii în serverul dvs

M-am inspirat de la Sasa Tekovic , și anume de a nu bloca crawlerele reale ale motoarelor de căutare și de a permite 404 pe resurse statice pentru a preveni lipsa resurselor efective - o eroare din partea dvs. - să nu blocheze utilizatorii legitimi.


Înainte de implementare, este întotdeauna bine să creați un mediu de testare local. Să începem HAProxy și Apache folosind Docker . Avem nevoie de un server backend real care să ne ofere acele 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:


Apoi, pur și simplu rulați docker-compose up și puteți accesa localhost:8100 în browser.


Fișierul haproxy.cfg este destul de explicit:


 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)


Dacă obțineți mai mult de 5 accesări la 404 solicitări într-un singur minut, bot-ul va fi interzis timp de 10 minute.




Așa cum stau lucrurile, această configurare limitează efectiv rata de utilizare a roboților care generează 404 în exces. Cu toate acestea, dorim să-l integrăm și cu exemplul nostru anterior, în care am folosit HAProxy pentru a bloca atacurile asupra 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)


Alergați cu două stick tables și opriți ambele amenințări.


Și iată-l. HAProxy folosit din nou pentru mult mai mult decât ca un simplu proxy invers. Este un mic cuțit elvețian!



Acest far a schimbat jocul atunci când lucrați la reparații.


Am avut unul, dar când s-a stricat, am ezitat să îl înlocuiesc, apelând la lanterna telefonului. Și sigur, funcționează - dar odată ce experimentați confortul de a avea din nou mâinile libere - nu mai există întoarcere. Dacă aveți nevoie de iluminare fiabilă, fără mâini, aceasta este o necesitate!


Această postare a fost postată inițial pe https://wasteofserver.com/stop-404-prying-bots-with-haproxy/ , este posibil să găsiți revizuiri mai noi și comentarii suplimentare acolo.