Ничего не бывает лучше, нежели послеобеденный сон, а вечером – интеллектуальные разминки. Как раз в прошлую пятницу камрад написал о том, что сервер внезапно перестал отзываться и его решили перезагрузить, но ситуация в нужную сторону не изменилась. Осмотр выявил необычно высокое количество активных соединений. Стало ясно, пришли незванные гости. И началось, как у Гроб: «Отчаянно вспотел Егор. Глобальные вещи тужились в мозгу. Пальцы лазили в бороде».
Поначалу начали фильтровать по количеству коннектов к сайту: у кого больше, тот идет в бан на н-цать мину. Пожалуй, в дальнейшем этот вариант использовать на старте не буду практически никогда, так как эффективность метода близится к нулевой позиции. Использовать его с самого начала не выгодно. Второй метод был чуть более эффективен – фильтры по странам у nginx. Приемлимый вариант, но со своими ограничениями. Когда было 2–4 тысячи активных соединений было неплохо, но когда количество соединений подошло к девяти с половинкой тысяч, стало понятно – пора брать в руки iptables + geoip. Оставили доступ только для адресов из RU/UA, остальные соединения уходили в дроп.
Количество соединений упало до 100–300 соединений, что в принципе нормально. Хотя и имелись подозрения, что часть трафика все равно паразитная. С утра в субботу у нападающих нашлись какие-то резервы на территории бывшего СССР, но их было не много. В пике не дотягивало и до трех тысяч активных соединений. Вот этих надоед фильтровали по количеству соединений и тихо начали скармливать им кэш (изначально его не было, скрипты не идеальны).
Исходя из того, что небольшая атака стоит приблизительно сто условных единиц. Очень надеюсь, что 150 из них где-то было потрачено если не с толком, то хотя бы с удовольствием. У нас так увлекательные выходные получились. А клиент, судя по всему, не увидел и особенно не заметил, что само по себе хорошо.