Короткий ответ
Three-way handshake состоит из трёх шагов: клиент отправляет SYN, сервер отвечает SYN-ACK и переводит соединение в состояние полуоткрытого (в очереди SYN backlog), клиент подтверждает ACK, после чего соединение переходит в ESTABLISHED; при SYN flood атакующий отправляет множество SYN-пакетов без завершения рукопожатия, переполняя очередь полуоткрытых соединений и мешая легитимным клиентам подключиться.
Как это работает подробнее
После получения SYN сервер выделяет ресурсы для хранения состояния полуоткрытого соединения (SYN backlog queue) и ждёт финальный ACK; при SYN flood эта очередь заполняется поддельными или незавершёнными запросами, и ядро либо начинает отбрасывать новые легитимные SYN, либо (без защиты) исчерпывает память на хранение состояния — защитный механизм SYN cookies позволяет серверу не хранить состояние для полуоткрытых соединений, кодируя необходимую информацию прямо в самом SYN-ACK.
Пример кода
ss -n state syn-recv | wc -l
sysctl net.ipv4.tcp_syncookiesЧто использовать на практике
- Практика. защититься помогает включение SYN cookies (net.ipv4.tcp_syncookies=1, обычно включено по умолчанию в современных дистрибутивах), увеличение размера backlog-очереди, а также использование внешней защиты от DDoS (anti-DDoS на уровне провайдера или CDN), поскольку чисто серверные настройки защищают от умеренного SYN flood, но не от крупной распределённой атаки.
Подводные камни
- Риск. Частая ошибка — пытаться отличить SYN flood от обычного всплеска легитимного трафика только по числу новых соединений в секунду, не глядя на долю соединений, которые так и не переходят в ESTABLISHED.