SYN cookies

SYN cookie — техника противодействия SYN-флуд-атаке. Изобретатель техники  определил SYN cookie как «особый выбор начальной TCP-последовательности со стороны сервера». Использование SYN cookie позволяет серверу избегать сброса новых соединений, когда очередь TCP-соединений переполнена. Сервер отправляет обратно клиенту правильную последовательность SYN+ACK, но не сохраняет новое соединение в очереди. Если сервер затем получит ACK ответ от клиента, то он сможет восстановить своё значение SYN последовательности по принятому от клиента значению.

Реализация 
Для создания TCP-соединения клиент отправляет серверу TCP-пакет с флагом SYN и своим номером последовательности. В ответ сервер отправляет пакет с флагами SYN+ACK, номером последовательности клиента и своим собственным номером последовательности. По этим номерам собирается весь TCP-поток. Спецификация TCP определяет, что начальные значение этих номеров последовательности определяются самими клиентом и сервером. SYN cookies — это как раз такой номер последовательности, который аккуратно собирается сервером по следующим правилам:
 пусть t будет медленно увеличивающаяся метка времени (обычно результат функции time(), логически сдвинутый на 6 позиций вправо, что даёт новые значение каждые 64 секунды)
 пусть m будет максимальным размером сегмента (MSS), которое сервер будет хранить в номере последовательности SYN
 пусть s будет результатом криптографической хеш-функции длиной 24 бита над адресами и портами сервера и клиента и значения t
Тогда SYN cookie вычисляется как:
 старшие 5 бит: t mod 32
 средние 3 бита: кодированное m (всего будет 8 типов всех возможных MSS)
 младшие 24 бита: s
Когда клиент отправляет на сервер завершающий рукопожатие пакет с флагом ACK, он отправляет первоначальный номер последовательности сервера увеличенный на единицу. Для проверки корректности SYN cookie, сервер отнимает от неё единицу и выполняет следующие проверки:
 проверяет значение t, чтобы проверить, что сессия не просрочилась;
 восстанавливает s для проверки действительности SYN cookie;
 раскодирует значение m для дальнейшего построения элементов очереди.
С этого момента соединение работает как обычно.

Недостатки 
Использование SYN cookie не нарушает работу TCP и других протоколов. Однако в данной технике есть два ограничения:
 возможность использовать только 8 различных значений для MSS;
 серверу придётся игнорировать все TCP-опции (увеличенный размер окна, метки времени и др.), так как они отправляются в первоначальном SYN-запросе.

В то время как эти ограничения ведут к неоптимальному использованию протокола TCP, негативные последствия редко отражаются на клиентах, так как SYN cookie должны использоваться только при атаках на сервер. Игнорирование некоторых возможностей протокола TCP в угоду доступности сервера является разумным компромиссом.

Однако проблема возрастает когда теряется финальный ACK-пакет от клиента, а протокол прикладного уровня требует, чтобы сервер был инициатором дальнейшего взаимодействия (например, протоколы SMTP и SSH). В этом случае клиент предполагает, что соединение установлено успешно и ждёт от сервера пригласительный баннер или повторную пересылку SYN+ACK пакета. Однако сервер не будет отправлять такой пакет, так как забракует сессию. В конечном итоге клиент тоже сбросит сессию, но для этого может потребоваться много времени.

В ядро Линукс 2.6.26 добавлена ограниченная поддержка некоторых опций TCP, которые кодируются в метку времени.

Более новый стандарт TCP Cookie Transactions (TCPCT) спроектирован для избежания подобных проблем и улучшает ещё некоторые аспекты. Но это надстройка над TCP и поэтому должна поддерживаться обеими сторонами.

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

Примечания

Ссылки 
 D. J. Bernstein’s own explanation of SYN cookies

Сетевая безопасность
TCP/IP
Компьютерные сети