- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
netwind, вот я вижу вы уже начали понимать на счёт лога, атака не на HTTP, а на TCP стек. При SYN флуде такой же эффект, в логах ничего не будет, так как tcp не прошёл все стадии завершения подключения, и тем не менее для nginx это ещё подключение. Всего то 2к ботов было, когда отфильтровал всех кто занял более 100 подключений, всё заработало, а через часик начали другой тип атаки, уже по HTTP на сайт клиента, ну ничего, сайт его всё равно открывался, хоть и через раз, а на сервер это не повлияло, там уже срабатывал другой тип защиты по анализу логов.
PS. хотя может я что-то путаю, ведь LAST_ACK это завершение подключения, после ESTABLISHED.
Но факт что в логах нет ничего и 80й порт в большой очереди.
фильтровать и банить, варианты зависят от ОС и инструментов и знаний.
Dimanych, ну как же не прошли все стадии подключения?
если nginx не хватало обработчиков, значит соединение полностью установлено и ngnix должен сделать об этом запись, но уже после завершения этого соединения. Видимо, вы nginx останавливали (убивали) тем самым препятствуя записи в логи.
может у вас запись логов так настроена чтобы не писать их или вы смотрите в логи от виртуального хоста, а не глобальные.
Чесно сказать не понимаю почему так, среди большого числа LAST_ACK, припоминаю, были также и ESTABLISHED около 10тыс.
Лог включен для всех вирт. хостов, есть один общий лог, лог отключается только когда идёт проксирование к апачу, и тогда в этот общий лог пишет сам апач.
Апач вообще не ощущал запросов, т.е. они до него и не доходили. Ситуация непонятная. Хотя в лог ведь пишется после завершения соединения, а они в состоянии LAST_ASK. Может поэтому?
Dimanych, трафик не захватил - сам себе злобный буратин. Теперь остается теоретизировать на пустом месте. В следующий раз используй tcpdump -w, скачивай файл и выкладывай - будет предметный разговор.
согласно этой картинке LAST_ACK это самое последнее состояние ожидания пакета от клиента ( ждем "recv ACK" как там подписано на стрелочке уходящей в CLOSED ). Так что
1. бот либо умышленно "забыл" про соединение,
2. либо твой сервер не получает финальное подтверждение от бота, поскольку бот забанен на уровне пакетного фильтра.
Ресурсов на соединение в LAST_ACK не так уж много расходуется. Второе мне кажется более вероятным.
Eсли понизить net.ipv4.tcp_fin_timeout, то таких состояний будет меньше. Но так ли важно сохранить их маленькими при небольших атаках? Были ли в dmesg ошибки "out of socket memory" ?
Помню случаи когда вроде бы верная "оптимизация стека для ddos" выливалась в страннейшие проблемы при нормальной работе сервера. сброс к настройкам по умолчанию все исправил. Я понимаю, что возможно было разобраться что именно от чего зависит, но мне это нерентабельно.
А я еще помню те времена, когда четвертая фря ложилась от подобной атаки - все забивал time_wait2.
Ещё одна атака, теперь более ясная, но от неё ещё хуже))
Атака идёт на сайт, он известен, на сервере mpm-itk с ограничением
MaxClientsVhost 10.
При атаке запросы проксируются апачу и он после рестарта за секунду набирает 256 клиентов которые висят в системе ничего не делая под пользователем root. Система не нагружена.
В error_log:
[Wed Jun 22 14:28:17 2011] [warn] MaxClientsVhost reached for website.ru, refusing client.
[Wed Jun 22 14:28:18 2011] [error] server reached MaxClients setting, consider raising the MaxClients setting
В статусе апача который всёже загружается через пару минут:
0-0 27322 0/113/113 R 0.00 4 0 0.0 0.42 0.42 ? ? ..reading..
1-0 27323 0/102/102 R 0.00 4 0 0.0 0.44 0.44 ? ? ..reading..
2-0 27324 0/145/145 R 0.00 17 0 0.0 0.42 0.42 ? ? ..reading..
3-0 27327 0/254/254 R 0.00 28 0 0.0 0.44 0.44 ? ? ..reading..
4-0 27328 0/281/281 R 0.01 13 13 0.0 0.47 0.47 ? ? ..reading..
5-0 27329 0/191/191 R 0.00 15 0 0.0 0.51 0.51 ? ? ..reading..
6-0 27332 0/107/107 R 0.00 16 0 0.0 0.42 0.42 ? ? ..reading..
7-0 27333 0/313/313 R 0.00 28 1 0.0 0.57 0.57 ? ? ..reading..
8-0 27335 0/129/129 R 0.00 16 0 0.0 0.46 0.46 ? ? ..reading..
9-0 27338 0/234/234 R 0.00 4 0 0.0 0.43 0.43 ? ? ..reading..
и т.д.
В нетстате как я подозреваю проблема в SYN, потому что nginx делает запрос апачу и много таких подключений:
tcp 0 1 127.0.0.1:52809 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:54524 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:46297 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:59454 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:60234 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:56519 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:44907 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:60265 127.0.0.1:8080 SYN_SENT
tcp 0 1 127.0.0.1:55100 127.0.0.1:8080 SYN_SENT
netstat -na|grep SYN_SENT|wc -l
4453
netstat -na|grep ESTAB|wc -l
16178
cat /proc/sys/net/ipv4/tcp_syncookies
1
syncookies включены
В конфиге апача
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 40
ServerLimit 200
MaxClients 200
MaxRequestsPerChild 1000
</IfModule>
Почему апач не блокирует новые подключения к сайту сразу, чего он ждёт, почему процессы висят, что за статус такой ..reading..
Кто-нибудь в курсе подобной проблемы?
Кто-нибудь в курсе подобной проблемы?
напоминает то, о чем я писал тут .
Я успокоился на мысли, что это просто следствие высокой нагрузки от ddos, а не отдельный феномен. Либо какой-нибудь очередной прикол тухлого Centos.
На этот раз у тебя есть шанс не забыть захватить трафик и тогда мы подробно рассмотрим, что именно там происходит.
Новая информация,
после перезапуска апача через несколько секунд работы в логи ничего не пишет указанное время, Timeout 30, после видимо происходит сброс подключений и в логи начинает писать, опять же всего несколько секунд, а потом опять таймаут.
И так я попробовал Timeout 5, и действительно, апач начал обрабатывать запросы и писать в лог, но на сколько мне ихвесно 5 секунд очень маленький таймаут и многие нормальные подключения будут недорабатываться.
Так как состояние reading, а для этой дерективы и данного случая это время приёма GET запроса, я делаю вывод что nginx отправляет не полный заголовок запроса GET и апач продолжает ждать.
В чём фокус? nginx отправляет часть заголовка GET до того как он его сам полностью получит? Почему то думал что именно nginx должен защищать от подобного рода проблемы.
В чём фокус? nginx отправляет часть заголовка GET до того как он его сам полностью получит? Почему то думал что именно nginx должен защищать от подобного рода проблемы.
Я тоже так считал, но мне уже поздно ловить эту проблему.
Можешь сделать tcpdump -i any port <какой там у тебя для апача> -s 65000 -w file.cap ? через пару минут создастся файл, его можно изучать с помощью wireshark и найти ответы на многие вопросы.