Bad Bots

tomcat8

Member
Hallo,

ich habe hier ein kleines Hobby-Projekt mit weniger als einer handvoll (ausschließlich mitteleuropäischen) Besuchern am Tag.
Dahinter verbirgt sich eine Datenbank-Anwendung, die an die 10000 Seiten zur Laufzeit generiert.
Da kann ein Anfrage hohe Last erzeugen, ist aber bei den wenigen (menschlichen!) Besuchern völlig unkritisch.

Nun überrascht es dann doch, wenn Mantomo heute morgen 800 Besucher in einer Stunde meldet?!
Das apache-badbots plugin ist dieser Welle nicht herr geworden, da es sich auch um 800 verschiedene IP-Adressen mit gelogenen User-Agent (Windows 10, Firefox) handelt.

Hier ein paar Adress-Bereiche:
2001:ee0:4328::/47
2001:ee0:4f30::/45
2001:ee0:49d3::/48

14.231.152.0/22
187.85.18.0/23
45.160.105.0/24
23.24.128.0/22
13.189.129.0/24
68.205.20.0/22
38.51.62.0/24
91.253.98.0/23
90.12.130.0/24
13.160.211.0/24
89.31.120.0/22
77.221.240.0/22
13.183.64.0/22

Die sind fast alle aus "Übersee" (Vietnam, Brasilien, USA, Dominikanische Rep., VAR).

Die gute Nachricht: Mein System hat diesen "Angriff" klaglos überstanden (er dauerte auch keine Stunde).
Die schlechte: Meine Matomo-Statistik ist nun für immer versaut.

Trotzdem bleiben Fragen:
War das ein (bad) Botnetz?
(Bad) KI auf der Suche nach Content?
Wie kann ich IP-Tables beibringen, alle Request aus "Übersee" abzuweisen?
Oder hat jemand eine bessere Idee?

Grüße!
 
Apaches mod_geoip zum Blockieren nutzen. Habe das aber schon länger nicht mehr getestet, ob das hilft.
 
Oder hat jemand eine bessere Idee?
Cloudflare und dann so in der Art:
Code:
(ip.src.country eq "VN") or (ip.src.country eq "BR") or (ip.src.country eq "ID") or (ip.src.country eq "EC") or (ip.src.country eq "BD") or (ip.src.country eq "IN") or (ip.src.country eq "UZ") or (ip.src.country eq "AR") or (ip.src.country eq "CN") or (ip.src.country eq "IN") or (ip.src.country eq "RU") or (ip.src.country eq "SG") or (ip.src.country eq "KZ") or (ip.src.country eq "PE") or (ip.src.country eq "IQ") or (ip.src.country eq "TN") or (ip.src.country eq "CL") or (ip.src.country eq "BW") or (ip.src.country eq "CO") or (ip.src.country eq "ZA")
Und zusätzlich kannst du Alibaba's komische Cloud auch gleich droppen:
Code:
NetRange:       47.74.0.0 - 47.87.255.255
CIDR:           47.80.0.0/13, 47.74.0.0/15, 47.76.0.0/14
NetName:        AL-3
NetHandle:      NET-47-74-0-0-1
Parent:         NET47 (NET-47-0-0-0-0)
NetType:        Direct Allocation
OriginAS:      
Organization:   Alibaba Cloud LLC (AL-3)
RegDate:        2016-03-17
Updated:        2017-04-26
Ref:            https://rdap.arin.net/registry/ip/47.74.0.0
Code:
ip.src in {47.80.0.0/13 47.74.0.0/15 47.76.0.0/14 146.174.176.0/20 146.174.160.0/20 202.76.160.0/20}
KI Crawler / Scraper filtert dir Cloudflare auf Wunsch ebenso raus.

Disclaimer: Ja, dass kann man alles auch ohne Hilfe von externen Diensten machen. Aus der Erfahrung der letzten Jahre, viel Erfolg dabei.
 
Hallo,

es geht schon wieder los: Diesmal kommen die Angriffe aus TT BD ZA PY CL EG IQ und AZ.
(Postgres meldet 370 Transaktionen pro Sekunde)
Das mit einer Blacklist für die unerwünschten Länder kann man wohl vergessen.
Ich werde wohl auch Basis von einem Geoip-Service mir eine Whitelist aus DACH und PL bauen...
Solange bleibt der Dienst abgeschaltet.

Offenbar wird für kleine Hobby-Projekte des Internet zunehmend unbenutzbar :mad:

Grüße!
 
Das lässt sich ja grundsätzlich mit wenigen Handgriffen umsetzen:
Code:
# In your Apache configuration file or an .htaccess file
SetEnvIf GEOIP_COUNTRY_CODE 'DE' AllowCountry # Example: allow Germany
SetEnvIf GEOIP_COUNTRY_CODE 'AT' AllowCountry # Example: allow Austria
# Add other countries/continents as needed

<Location "/restricted-area">
    # Deny all by default
    RequireAll
        RequireAll
            RequireAny
                Require env=AllowCountry # Only allow if the variable is set
            </RequireAny>
        </RequireAll>
    </RequireAll>
    Deny from all # Fallback to deny all
</Location>
Über die exponentielle Zunahme von KI/AI Crawlern musst du dir dennoch Gedanken machen. Diese kommen auch aus DACH und PL. Massig!
 
Dahinter verbirgt sich eine Datenbank-Anwendung, die an die 10000 Seiten zur Laufzeit generiert.
Da kann ein Anfrage hohe Last erzeugen, ist aber bei den wenigen (menschlichen!) Besuchern völlig unkritisch.
Ist es denn notwendig, diese 10.000 Seiten bei jeder Anfrage neu zu generieren?
Wenn nicht, könntest du ja einen Reverse Proxy davorsetzen. Dieser würde dann die einmal generierten Daten quasi statisch ausliefern.
 
Hallo,

So, diese Version scheint zu funktionieren:

SetEnvIf GEOIP_COUNTRY_CODE 'DE' AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE 'AT' AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE 'CH' AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE 'PL' AllowCountry

# Deny all by default
<RequireAll>
<RequireAll>
<RequireAny>
Require env AllowCountry # Only allow if the variable is set
</RequireAny>
</RequireAll>
</RequireAll>



Wenn man das im Apache konfiguriert, kann man das für https einfach weglassen; und da die bots nur über http aufschlagen... :)

Da ich mir für meine lokales Netz auch ein Zertifikat erschwindelt habe, klappt das auch dort.
Nur für localhost fehlt noch eine Lösung...

Und während ich noch überlegt habe, wie ich das mit auswärtigen Clients teste, haben das die Internet-Trolle gleich mit erledigt:
185.238.28.6 - - [02/Sep/2025:19:08:14 +0200] "GET /wh/glass.php HTTP/1.1" 403
(und weitere 600 Zeilen!)

Über die exponentielle Zunahme von KI/AI Crawlern musst du dir dennoch Gedanken machen. Diese kommen auch aus DACH und PL. Massig!
Hatte ich bisher noch nicht, kommt wohl noch.

Grüße!
 
Hallo,
So, diese Version scheint zu funktionieren:
Nein, tut sie nicht :(

Ich habe eine Weile mit dem GeoIP-Plugin gekämpft;
hier mein neuer Versuch:

<VirtualHost ...>

# GeoIp Blocking
MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /var/lib/GeoIP/GeoLite2-Country.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
...
SetEnvIf MM_COUNTRY_CODE DE AllowCountry
SetEnvIf MM_COUNTRY_CODE AT AllowCountry
SetEnvIf MM_COUNTRY_CODE CH AllowCountry
SetEnvIf MM_COUNTRY_CODE PL AllowCountry
...
<Location ...>

Deny from all
Allow from env=AllowCountry
Allow from 192.168.1.0/24
...
</Location>​

Funktioniert schon mal für DE und im lokalem Netz.

Anleitung:
 
Back
Top