Кратко

  • SYN-флуд использует разрыв во времени: сервер резервирует конечное полуоткрытое состояние до завершения рукопожатия, поэтому дешёвые запросы способны заполнить очередь.
  • RFC 4987 сравнивает две защиты конечного узла: хранить малую запись в ограниченном SYN-кэше или не хранить её вовсе, восстановив состояние из SYN-cookie после действительного ACK.

Получив SYN, слушающий сервер принимает решение, которое кажется незначительным. Он запоминает попытку, отправляет SYN-ACK и ждёт. Для честного клиента это обычная работа TCP. Для атакующего — выданный аванс: сервер уже платит памятью и таймерами, хотя предполагаемый клиент ещё не показал, что способен услышать ответ.

RFC 4987 строит анализ вокруг этого аванса. Обычная реализация TCP сохраняет состояние SYN-RECEIVED, пока рукопожатие не завершено. Очередь полуоткрытых соединений конечна. Если запросы приходят быстрее, чем освобождаются записи, законные новые соединения перестают находить место. Документ рассматривает истощение состояния TCP на хосте и недоступность слушающего приложения. Он не обещает защиту от другого случая, когда поток пакетов прежде всего исчерпывает пропускную способность канала.

Подмена адреса источника удобно отправляет ответ в пустоту, но не является обязательным условием. Скомпрометированные машины могут передавать с действительных маршрутизируемых адресов и создавать то же давление. Нужны три более простых свойства: каждый SYN вызывает выделение, запас полуоткрытого состояния ограничен, а приход опережает освобождение. В механизме из RFC непосредственной целью становятся новые входящие соединения к атакуемому порту, а не уже установленные или исходящие соединения.

Интуитивные меры часто лишь двигают порог. Увеличенный backlog требует от защитника больше памяти и даёт атакующему большее число для заполнения. Сокращённый таймер SYN-RECEIVED быстрее освобождает записи, но отбрасывает законных клиентов с обычной сетевой задержкой; атакующий повышает частоту. Повторное использование старейшего полуоткрытого блока делает возраст критерием жертвы, не определяя подлинность. Входная фильтрация полезна против подмены, но её нельзя считать всемирной, и она не останавливает ботнеты с настоящими адресами.

Помнить меньше, но задать предел

SYN-кэш снижает цену первого сообщения. Вместо немедленного создания полного блока управления TCP сервер хранит меньшую запись, достаточную для последующего завершения рукопожатия. У кэша есть жёсткая граница. RFC также описывает распределение по корзинам хешем с секретом. Предсказуемая функция позволила бы сосредоточить запросы в одной корзине, даже если остальной кэш свободен. Секрет затрудняет такое прицельное переполнение, а граница ограничивает память и поисковую работу.

Кэш всё равно остаётся состоянием. Записи должны истекать, а потерянный SYN-ACK — передаваться повторно. Единственный ответ без обязанности повтора превратил бы обычную потерю пакета в отказ соединения. Смысл кэша не в удалении поведения TCP, а в отсрочке дорогого объекта при сохранении минимума, необходимого до финального ACK.

Поместить квитанцию в ответ

SYN-cookie доводит тот же принцип до пути без состояния. Сервер не сохраняет запись SYN-RECEIVED для попытки. Он строит начальный номер последовательности так, чтобы последний ACK вернул сведения для проверки обмена и восстановления соединения. Полный блок управления выделяется только после принятия действительного ACK.

Приложение A показывает конструкцию из номера последовательности инициатора, кодировки максимального размера сегмента, счётчика времени, адресов, портов и секретной функции. Когда ACK возвращается, сервер проверяет значение своим секретом и недавними значениями счётчика. Это компактная квитанция конкретного рукопожатия, а не аутентификация человека или приложения. В пределах устойчивости конструкции к угадыванию она показывает, что отправитель ACK располагает информацией из SYN-ACK; постоянной личности она не создаёт.

У отсутствия состояния есть семантическая цена. Между SYN и ACK TCP обычно помнит согласованные параметры. Место в cookie ограничено, поэтому распространённые конструкции могут ограничивать масштабирование окна, SACK или будущие параметры. RFC упоминает и данные в SYN. Если последний ACK потерян, а серверное приложение молчит до получения клиентских данных, может не оказаться состояния для обычной повторной передачи SYN-ACK. Выделение ресурса отложено, но вместе с ним отложена часть памяти протокола.

Методы можно объединить. Сервер использует SYN-кэш, пока есть ёмкость, и переключается на cookie при заполнении. Гибрид сохраняет более богатое согласование в нормальном режиме и оставляет квитанцию без состояния для перегрузки. Межсетевой экран или прокси тоже способен посредничать в рукопожатии, но он переносит бремя состояния и может менять сквозную семантику. Ресурсное решение не исчезает — у него меняется владелец.

RFC 4987 опубликован в августе 2007 года как Informational, а не обязательный документ Standards Track. Его анализ считал SYN-кэш и SYN-cookie жизнеспособными изменениями конечного узла и предпочитал кэш как обычный режим там, где это возможно. Это историческая оценка, а не доказательство современных настроек по умолчанию какой-либо ОС.

Долговечное правило шире: не брать дорогое, дефицитное и направляемое противником обязательство при первом непроверенном сообщении, если более дешёвое и обратимое представление позволяет продолжить обмен. Возврат информации из ответа даёт более веское свидетельство достижимости по обратному пути. Он не аутентифицирует сторону, а отсрочка способна потерять полезный контекст. Честная защита должна показывать и сбережённый ресурс, и ослабленную семантику.

Единственный источник — RFC 4987, «TCP SYN Flooding Attacks and Common Mitigations». Статья ограничена состоянием TCP конечного узла, рассмотренными в RFC защитами и их явными компромиссами; она не выводит современные настройки, распространённость или частоту атак.