DDoS durch den Google Bot

In fast 10 Jahren mit Travel-Dealz ist mir die folgende Situation schon mehrfach untergekommen: Man aktiviert irgendein neues Feature oder installiert ein neues Plugin und Tage, Wochen oder sogar Monate später stellt man ein Problem fest z.B. die ganze Seite wird nicht mehr oder nur sporadisch von Google indexiert oder die Auslastung des Servers steigt und steigt und steigt, obwohl nicht fiel mehr Traffic auf der Seite ist.

Seit einigen Wochen habe ich eine stetige Steigerung der Serverauslastung von Travel-Dealz beobachtet und immer mit kleinen Anpassungen reagiert. Zum Beispiel PHP max_children erhöht und auch Fehler gefunden, z.B. dass der Server von einer konsumierten API down war und kein timeout für den Request gesetzt war. WordPress hat dann so lange auf eine Antwort gewartet bis das PHP Timout erreicht war.

Das ging eine Zeit lang gut, es traten aber immer wieder neue Probleme auf. So fraß der Redis Object Cache auf einmal den gesamten Arbeitsspeicher auf. Selbst eine Limitierung der Datenbankgröße hatte nicht wirklich geholfen. Einzige Lösung war hier den Object Cache zu deaktivieren.

Für die Suche setzten wir das Plugin ElasticPress mit eigenen einem Elasticsearch Server ein. Normalerweise hat der Server kaum etwas zu tun aber auch dieser Server lief an seiner Belastungsgrenze. Abhilfe schaffte einige Tage die Kapazitäten auszubauen. Merkwürdig war hier allerdings, dass es eigentlich nicht mehr Suchen als üblich gab. Zumindest die, die in Matomo getrackt werden.

Und trotzdem kamen die Server schnell wieder an ihre Belastungsgrenze. Irgendwann kam ich dann mal auf die Idee in den access.log zu schauen (bzw. es erst einmal einzuschalten). Mittlerweile war ich schon von einem DDoS-Angriff überzeugt. Dort waren tatsächlich viel mehr Suchen verzeichnet als in Matomo getracked. Auffälliger, immer wieder von denselben, sehr ähnlichen IP-Adressen. Ich war schon kurz davor den IP-Rang zu blocken, da viel mir der Zusatz Googlebot auf.

66.249.64.72 - - [23/Apr/2020:14:57:31 +0000] "GET /search/Lufthansa/?s=Lufthansa&filter_period=march,december,august&filter_origins=amsterdam&filter_category=business-class&filter_post_tag=star-alliance,aegean-milesbonus&filter_destinations=asia,southeast-asia,singapore,chennai HTTP/1.1" 200 18837 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.72 - - [23/Apr/2020:14:57:31 +0000] "GET /search/Lufthansa/?s=Lufthansa&filter_destinations=dar-es-salaam,asia,japan,nur-sultan,bishkek,nanjing&filter_period=winter-holidays,september HTTP/1.1" 200 18483 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.90 - - [23/Apr/2020:14:57:31 +0000] "GET /search/Lufthansa/?s=Lufthansa&filter_origins=netherlands&filter_post_tag=lufthansa&filter_category=flights&filter_period=april,may,december HTTP/1.1" 200 19236 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.68 - - [23/Apr/2020:14:57:31 +0000] "GET /search/Lufthansa/?s=Lufthansa&filter_origins=netherlands,amsterdam&filter_post_tag=lufthansa,lot&filter_destinations=asia,almaty,osaka,bishkek HTTP/1.1" 200 18587 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.65 - - [23/Apr/2020:14:57:32 +0000] "GET /search/Lufthansa/?s=Lufthansa&filter_origins=netherlands&filter_period=august,september,june,february&filter_destinations=africa,asia,beijing,tokyo,bangkok,nairobi HTTP/1.1" 200 18926 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.70 - - [23/Apr/2020:14:57:32 +0000] "GET /search/alitalia/?s=alitalia&filter_post_tag=aegean-milesbonus,flying-blue,krisflyer,milesmore,milessmiles,skywards,skymiles,united-mileageplus HTTP/1.1" 200 18048 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.76 - - [23/Apr/2020:14:57:32 +0000] "GET /search/alitalia/?s=alitalia&filter_post_tag=executive-club,flying-blue,finnair-plus,milesmore,asiana-club,aadvantage,skywards,eurobonus&filter_category=milespoints HTTP/1.1" 200 18097 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.90 - - [23/Apr/2020:14:57:32 +0000] "GET /search/Lufthansa/?s=Lufthansa&filter_origins=netherlands&filter_category=flights&filter_post_tag=united-mileageplus&filter_period=may&filter_destinations=asia,malaysia,iran,singapore,delhi HTTP/1.1" 200 18774 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.64.80 - - [23/Apr/2020:14:57:32 +0000] "GET /search/Lufthansa/?s=Lufthansa&filter_origins=netherlands,london,rotterdam,london-gatwick-lgw&filter_destinations=usa,seattle,kauai-island,miami,orlando&filter_period=november&filter_post_tag=star-alliance,air-canada HTTP/1.1" 200 18395 "-" "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.92 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

Schnell war klar, der Google Bot crawled die Suchseite und dort habe ich vor einigen Wochen die Möglichkeit hinzugefügt, nach Kategorien, Schlagwörtern und weiteren Terms zu filtern. ElasticPress erzeugt dabei kein Formular, sondern benutzt URL-Parameter wie filter_post_tag=aegean-milesbonus. Die Optionen werden dabei als Link implementiert <a href="?s=agean&filter_post_tag=aegean-milesbonus">. Die Suchseite steht zwar auf noindex und wurde nicht von Google indexiert, trotzdem wurde jedem Link brav gefolgt.

Normalerweise trifft nur ein Bruchteil der Anfragen überhaupt WordPress bzw. PHP, die meisten Anfragen werden direkt vom Webserver aus dem Cache beantwortet. Bei der Suche ist das natürlich nicht oder nur sehr begrenzt möglich. Das führte zu der hohen Auslastung.

Durch die schier unzähligen Kombinationen hat der Google Bot über 200.000 Seiten pro Tag gecrawled:

Pro Tag 200.000-300.000 Seitenaufrufe nur vom Google Bot in den Crawling-Statistiken der Google Search Console

Die schnelle Lösung an dieser Stelle war das Verzeichnis /search/ in der robots.txt auszuschließen Disallow: /search/. Mit dem robots.txt-Tester in der Google Search Console kann man immerhin den Google Bot innerhalb von Minuten dazu bringen, den neuen Regeln zu folgen.

Die Auslastung des Server rauschte danach direkt in den Keller:

Abfall der CPU-Auslastung ab dem Zeitpunkt der Anpassung

Fazit

Leider rennt man immer wieder in solche Probleme und sucht häufig nicht direkt an der richtigen Stelle.

Leave a Reply

Your email address will not be published. Required fields are marked *