SYN cookies
SYN cookie — техника противодействия SYN-флуд-атаке. Изобретатель техники Daniel J. Bernstein определил 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 и других протоколов. Однако в данной технике есть два ограничения[1]:
- возможность использовать только 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 нужно включать только для публично доступных портов.