Атака на tcp LAST_ACK

123 4
D
На сайте с 05.06.2007
Offline
155
#11

netwind, вот я вижу вы уже начали понимать на счёт лога, атака не на HTTP, а на TCP стек. При SYN флуде такой же эффект, в логах ничего не будет, так как tcp не прошёл все стадии завершения подключения, и тем не менее для nginx это ещё подключение. Всего то 2к ботов было, когда отфильтровал всех кто занял более 100 подключений, всё заработало, а через часик начали другой тип атаки, уже по HTTP на сайт клиента, ну ничего, сайт его всё равно открывался, хоть и через раз, а на сервер это не повлияло, там уже срабатывал другой тип защиты по анализу логов.

PS. хотя может я что-то путаю, ведь LAST_ACK это завершение подключения, после ESTABLISHED.

Но факт что в логах нет ничего и 80й порт в большой очереди.

Написал не мало шедевров ;)
RAS
На сайте с 27.11.2005
Offline
126
RAS
#12

фильтровать и банить, варианты зависят от ОС и инструментов и знаний.

Администрируем сервера, впс, вдс. Ускоряем загрузку сайтов - DLE, Word Press, Joomla, Modx... Настраиваем безопасность. Ручная чистка rootkit/malware/вирусов. (/ru/forum/867860) Разработка - shell/bash/sh/python/perl.
N
На сайте с 06.05.2007
Offline
419
#13

Dimanych, ну как же не прошли все стадии подключения?

если nginx не хватало обработчиков, значит соединение полностью установлено и ngnix должен сделать об этом запись, но уже после завершения этого соединения. Видимо, вы nginx останавливали (убивали) тем самым препятствуя записи в логи.

может у вас запись логов так настроена чтобы не писать их или вы смотрите в логи от виртуального хоста, а не глобальные.

Кнопка вызова админа ()
D
На сайте с 05.06.2007
Offline
155
#14

Чесно сказать не понимаю почему так, среди большого числа LAST_ACK, припоминаю, были также и ESTABLISHED около 10тыс.

Лог включен для всех вирт. хостов, есть один общий лог, лог отключается только когда идёт проксирование к апачу, и тогда в этот общий лог пишет сам апач.

Апач вообще не ощущал запросов, т.е. они до него и не доходили. Ситуация непонятная. Хотя в лог ведь пишется после завершения соединения, а они в состоянии LAST_ASK. Может поэтому?

N
На сайте с 06.05.2007
Offline
419
#15

Dimanych, трафик не захватил - сам себе злобный буратин. Теперь остается теоретизировать на пустом месте. В следующий раз используй tcpdump -w, скачивай файл и выкладывай - будет предметный разговор.

согласно этой картинке LAST_ACK это самое последнее состояние ожидания пакета от клиента ( ждем "recv ACK" как там подписано на стрелочке уходящей в CLOSED ). Так что

1. бот либо умышленно "забыл" про соединение,

2. либо твой сервер не получает финальное подтверждение от бота, поскольку бот забанен на уровне пакетного фильтра.

Ресурсов на соединение в LAST_ACK не так уж много расходуется. Второе мне кажется более вероятным.

Eсли понизить net.ipv4.tcp_fin_timeout, то таких состояний будет меньше. Но так ли важно сохранить их маленькими при небольших атаках? Были ли в dmesg ошибки "out of socket memory" ?

Помню случаи когда вроде бы верная "оптимизация стека для ddos" выливалась в страннейшие проблемы при нормальной работе сервера. сброс к настройкам по умолчанию все исправил. Я понимаю, что возможно было разобраться что именно от чего зависит, но мне это нерентабельно.

Andreyka
На сайте с 19.02.2005
Offline
822
#16

А я еще помню те времена, когда четвертая фря ложилась от подобной атаки - все забивал time_wait2.

Не стоит плодить сущности без необходимости
D
На сайте с 05.06.2007
Offline
155
#17

Ещё одна атака, теперь более ясная, но от неё ещё хуже))

Атака идёт на сайт, он известен, на сервере 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

В статусе апача который всёже загружается через пару минут:

Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request
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:50108 127.0.0.1:8080 SYN_SENT
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 включены

В конфиге апача

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 40
ServerLimit 200
MaxClients 200
MaxRequestsPerChild 1000
</IfModule>

Почему апач не блокирует новые подключения к сайту сразу, чего он ждёт, почему процессы висят, что за статус такой ..reading..

Кто-нибудь в курсе подобной проблемы?

N
На сайте с 06.05.2007
Offline
419
#18
Почему апач не блокирует новые подключения к сайту сразу, чего он ждёт, почему процессы висят, что за статус такой ..reading..
Кто-нибудь в курсе подобной проблемы?

напоминает то, о чем я писал тут .

Я успокоился на мысли, что это просто следствие высокой нагрузки от ddos, а не отдельный феномен. Либо какой-нибудь очередной прикол тухлого Centos.

На этот раз у тебя есть шанс не забыть захватить трафик и тогда мы подробно рассмотрим, что именно там происходит.

D
На сайте с 05.06.2007
Offline
155
#19

Новая информация,

после перезапуска апача через несколько секунд работы в логи ничего не пишет указанное время, Timeout 30, после видимо происходит сброс подключений и в логи начинает писать, опять же всего несколько секунд, а потом опять таймаут.

И так я попробовал Timeout 5, и действительно, апач начал обрабатывать запросы и писать в лог, но на сколько мне ихвесно 5 секунд очень маленький таймаут и многие нормальные подключения будут недорабатываться.

Так как состояние reading, а для этой дерективы и данного случая это время приёма GET запроса, я делаю вывод что nginx отправляет не полный заголовок запроса GET и апач продолжает ждать.

В чём фокус? nginx отправляет часть заголовка GET до того как он его сам полностью получит? Почему то думал что именно nginx должен защищать от подобного рода проблемы.

N
На сайте с 06.05.2007
Offline
419
#20
Dimanych:
В чём фокус? nginx отправляет часть заголовка GET до того как он его сам полностью получит? Почему то думал что именно nginx должен защищать от подобного рода проблемы.

Я тоже так считал, но мне уже поздно ловить эту проблему.

Можешь сделать tcpdump -i any port <какой там у тебя для апача> -s 65000 -w file.cap ? через пару минут создастся файл, его можно изучать с помощью wireshark и найти ответы на многие вопросы.

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий