Когда ничего другого не остаётся
Вчера пришлось очень рано встать из-за SMS от монитора, наблюдающего за сервером: Apache лёг от DDoS-атаки. Как оказалось, DDoS был спровоцирован плагином Time Spent on Blog. Честно говоря, я никогда не понимал смысла в таких плагинах, тем более на очень посещаемых сайтах.
Плагин определяет, сколько времени пробыл пользователь на сайте (с двухсекундной точностью). Такая точность создаёт большие проблемы в тех случаях, когда средний посетитель открывает сразу три-пять страниц. Точность гарантируется конструкцией setTimeout("updateTime()", 2000)
, где updateTime()
— функция, отправляющая асинхронный запрос на сервер.
Обновление текущей информации осуществляется в два запроса: SELECT
для получения старых данных и INSERT
/UPDATE
для их обновления. Что характерно, в таблице нет никаких индексов, поэтому если у сайта обширная аудитория, а на сайте не настроена репликация, то MySQL очень быстро становится слабым звеном (что ни говори, а MyISAM не сильно хорошо работает с большим количеством параллельных записей). А IP-адрес посетителя (по нему делается выборка/обновление) хранится в базе строкой, что тоже далеко от идеала (экономнее хранить его числом).
Несколько сотен посетителей, открывшие по нескольку страниц, умудрились положить сервер.
Что характерно, удаление плагина не помогает, ибо запросы шлются JavaScript’ом из браузеров. А посетители уходить со страниц не торопились (наверное, видео смотрели; 6 человек до сих пор сидят). В результате, пока пользователь пьет чай/принимает душ и т.п., браузер делает чёрное дело и DoSит сервер.
Бороться приходится радикальными мерами: iptables
Если Apache пишет лог в формате vhost_combined
("%v:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
в Apache) в файл /var/log/apache2/other_vhosts_access.log
, то бороться с пользователями можно так:
egrep "synChro|getSum" | \
awk '{
print "iptables -A INPUT -s "$2" -j REJECT";
system("iptables -A INPUT -s "$2" -j REJECT");
}'
В другом окне запускается такой скрипт:
Такой вот крон для бедных В результате за несколько минут удалось снизить нагрузку во много раз.
Мораль сей истории: на очень посещаемые сайты плагины, собирающие статистику в реальном времени, ставить опасно.
Прочитав название плагина, подумал, что он считает, сколько времени сам автор потратил на свой блог вместо того, чтобы работать. Думаю, такой плагин был бы гораздо полезнее
>> очень рано встать из-за SMS от монитора, наблюдающего за сервером: Apache лёг от DDoS-атаки.
Вот это у тебя сервис. Уважаю.
===
У тебя снова капча? Что это так?
“Изящную” еще в октябре сломали, когда я в России был. А довести плагин до ума времени нет, поэтому поставил старую капчу.
Ну и дела
Очень забавная штука. Обычный пользователь в жизни бы не догадался. Я уже молчу о файрволе.