雑多なインフラエンジニア日記

技術ブログでっす~

facebookexternalhit/1.1 (facebookのクローラーが大量に来る件)

昨年の5月頃からwebサーバのロードアベレージ閾値超えアラートが大量に
飛んでくるようになりました。

その数値が尋常ではない。。
ロードアベレージ 1分間統計で、300~800)

月1ペースが11月頃には2日に1回のペースになっていき、ひどい時は1日で
数十件なんて日もありました。

何事かと思い、Apacheのアクセスログを解析したところ、UA
facebookexternalhit/1.1からの秒間大量アクセス(むしろアタック)が
原因であることを突き止めました。
これは、5月からわかっていたことだったのですが対策ができず、未だに解決
していません。(詳細は後述)

以下、アクセスログ例です。

・1分間にfacebookから何アクセス来ているか (grepはざっくり)

grep facebook access.log|grep "Day/Month/Year:15:44:"|wc -l

258


・503エラーの件数

grep facebook access.log|grep "Day/Month/Year:15:44:"|awk -F"\t" '$6 == 503 '{print $6}'|wc -l

53


・アクセスログの中身(実際のアクセス先URLはバラバラです)

grep facebook access.log|grep "Day/Month/Year:15:44:"

69.171.234.2 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 5293 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 712196
69.171.234.2 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 5718 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 916250
69.171.234.1 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 7450 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1095069
69.171.234.0 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 7158 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1196036
69.171.234.3 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 7166 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1568640
69.171.234.4 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 6390 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1420414
69.171.234.5 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 5421 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1318889
69.171.234.0 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 6887 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1573586
69.171.234.4 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 5460 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1378668
69.171.234.1 - - [Day/Month/Year:15:44:07 +0900] "GET /urlXXXX/ HTTP/1.1" 206 6790 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 1763933


これが永遠と記録されてました。。
ステータスコード 206 てなんすかw 初めて見ました。

ゴルァ!とググったところ、海外の方がFacebookデベロッパーサイトに報告しているページを発見しました。
とりあえず、デベロッパーサイトで報告すれば解決(善処?)してくれる模様です。
https://developers.facebook.com/bugs/207027582767029?browse=search_50bce9a5601179400241068
https://developers.facebook.com/bugs/409818929057013/

自分はデベロッパーサイトに英語で書くのがめんどくさい&事象発生が不定期
でかつ、いつの間にかクローラーアタックが止んだので放置しています。
ちなみに、robots.txtは読んでくれないみたいです。(試し済み)
以下に記載されている問い合わせ窓口にには一応メールをしたものの、事象は
変わらないは返信も無いはで怒り心頭。
https://www.facebook.com/externalhit_uatext.php

んで、何か策は無いかと頭を捻りましたが、結果無理でした。
iptablesやFWで弾くこと方法もありますが、アクセス元IPが多すぎる、
いいね、リンク、シェアを弾いてしまうので実際難しいです。
ApacheのDos対策モジュールで検証もしましたが、やはりアクセス元が
絞り切れない、アクセス先URLも不特定多数なので諦めました。。
サーバまでリクエストが到達している時点で何をやっても高負荷に
なりそうですね。。
http://c-brains.jp/blog/wsg/10/06/24-134947.php
http://ijo.cc/it/ja/server/apache_mod_evasive/

これって、UTMとかWAF(FW、URLフィルタなどを統合したNW機器)導入しかなくね!?
そんなコストはかけれないので、再発しないことを祈ろう。。

以上でっす!