Защита Linux-сервера от SYN flood: основы и методы. Разбор атак на части: SYN-flood Если ничего не помогает

11.11.2012

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

Существует несколько типов DDoS-атак с применением флуда, основные из них перечислены ниже:

  • SYN-ACK-флуд
  • HTTP-флуд
  • ICMP-флуд
  • UDP-флуд

SYN-ACK-флуд

SYN-ACK-флуд – один из типов сетевых атак , который основан на отправке огромного количества SYN-запросов в единицу времени. Результатом станет выведение из строя сервиса, работа которого была основана на TCP протоколе. Сначала клиент оправляет на сервер пакет, содержащий SYN-флаг, наличие которого говорит о желании клиент установить соединение. Сервер, в свою очередь, посылает пакет-ответ. В нем кроме SYN-флага имеется и ACK-флаг, который обращает внимание клиента на то, что запрос принят и ожидается подтверждение установления соединения со стороны клиента. Тот отвечает пакетом с ACK-флагом о успешном соединения. Все запросы на «коннект» от клиентов сервер хранит в очереди определенного размера. Запросы хранятся в очереди до возвращения от клиента ACK-флага. SYN-атака основана на отправке серверу пакетов с несуществующего источника, количеством превышающим размер очереди. Сервер, попросту не сможет ответить на пакет по вымышленному адресу. Очередь не будет уменьшаться и сервис перестанет функционировать.

HTTP-flood

HTTP-flood - применяется в случае работы сервиса с базой данных . Атака нацелена либо на web-сервер , либо на скрипт работающий с базой. Отправляется огромное количество запросов GET на 80 порт, дабы web-сервер не смог уделять должное внимание запросам другого типа. Log-файлы увеличиваются, а работа с базой данных становиться невозможной.

ICMP-флуд

ICMP-флуд – простой способ уменьшения пропускной способности и увеличения нагрузок на стек по средствам отправки однотипных запросов ICMP PING. Опасен в случае малого уделения внимания сетевым экранам, так как сервер, отвечающий на бесконечные запросы ECHO, обречен. Так что в случае одинакового количества входящего и исходящего трафика просто пропишите правила в iptables .

UDP-флуд

UDP-флуд – очередной способ захламления пропускной полосы , основанный на работе с протоколом, который не требует синхронизации перед отправкой данных. Атака сводится к обычной посылке пакета на UDP порт сервера. После получения пакета, сервер начинает его усиленно обрабатывать. Затем клиент отправляет Udp-пакеты некорректного содержания один за одним. В результате порты перестанут функционировать и система даст сбой.

В принципе, на определение типа DDoS-атаки зачастую не обязательно тратить много времени. Достаточно знать несколько признаков. Если значительно увеличился размер logфайлов – Вы имеете дело с HTTP-флудом . Если ограничен доступ к сервису в результате превышения количества допустимых соединений – это SYN-ACK-флуд . В случае, если исходящий и входящий трафик приблизительно равны – Вы имеете дело с ICMP-флудом . Главное, не забывать о поддержании безопасности своего сервера от ДДоС и уделять ей должное внимание. Самое лучшее – позаботиться о

Неужели ты думаешь, что знаешь все о DoS? Тогда читай!

Denial-of-service (DoS), атаки отказа от обслуживания, стали опаснее и легче. DoS это разновидность
сетевых атак (от червей до SYN flooding), цель которых сделать сервер недоступным для пользователей. ‘Distributed Reflection’ это новый вид DoS атак с использованием SYN flood"а. Его особенность в том, что на атакуемый сервер не посылаются миллионы SYN пакетов, они посылаются на router"ы или сервера и ответ приходит целевому серверу. А
роутеров существует миллионы!

Чтобы понять как все это работает и почему это так важно
давайте кое-что вспомним... Подтверждение TCP соединения происходит посредствам обмена тремя пакетами между двумя
компьютерами, так называемое рукопожатие. Вот примерная схема:

  • SYN клиент (web браузер, ftp клиент, etc.) входит в связь с сервером, посылая ему SYN пакет.
  • SYN/ACK: Когда запрос о соединении(SYN пакет) получен на открытом порту сервера, тот подтверждает соединение посылая клиенту SYN/ACK пакет.
  • ACK: Когда клиент получает подтверждение сервера SYN/ACK пакет для ожидаемой связи, то отвечает ACK пакетом.

Что происходит?

Традиционные "SYN flooding DoS" атаки работают по двум принципам:

  • "one-on-one" одна машина отсылает достаточное количество SYN пакетов чтобы заблокировать доступ к серверу.
  • "many-on-one" множество программ зомби,
    установленых на разных серверах, атакуют целевую машину SYN пакетами.

С использованием "reflection SYN flooding" посылаются пакеты,
но с исходным IP адресом, указывающим на целевую машину. TCP соединение с использованием этих трех пакетов требует, чтобы любая TCP служба, которая получает SYN пакет, ответила SYN/ACK пакетом. Сервер или router, которые получают эти поддельные SYN пакеты, посылают SYN/ACK ответы на машину, указанную SYN пакетами с исходным адресом
IP. Основной протокол Интернета и инфраструктура
сети используются сами против себя!

В деталях

Любая TCP связь с сервером общего назначения может использоваться, чтобы "отразить" SYN пакеты. Вот
короткий список наиболее популярных TCP портов:
22 (Secure Shell), 23 (Telnet), 53 (DNS) и 80 (HTTP/web). И фактически router"ы всего Интернета подтвердят TCP связь на
179 порту. Давайте оценим потенциал этой атаки:

  • Она использует фундаментальный Интернет протокол коммуникаций;
  • Машин, которые используют этот протокол, существует миллионы;
  • чрезвычайно просто организовать атаку ‘SYN packet
    reflectors’.

Довольно легко может быть построен список,
в котором будут перечислены router’ы и
сервера, отвечающие на SYN пакеты. Имея
большой список SYN "отражателей", каждый
хакер может распределить поддельные SYN
пакеты равномерно через весь набор
роутеров/серверов в списке. Ни один из невинных "отражателей" не испытает
существенной сетевой нагрузки. Роутеры вообще не сохраняют отчеты про пакеты с запросами на
предварительное соединение, это делает
отслеживание нападения чрезвычайно трудным.

"Отражатели"(роутеры и сервера) отправят в три или четыре раза большее количество SYN/ACK пакетов, чем число SYN пакетов которые они
получат. TCP соединение, которое получает команду
SYN, ожидает ACK ответ от машины на которую послало
SYN/ACK пакет, поэтому компьютер посылается еще несколько SYN/ACK ответов через несколько минут. Эта особенность TCP протокола по существу умножает число злонамеренных SYN/ACK пакетов, посылаемых целевой машине на три или четыре. Это также означает, что flood SYN/ACK
пакеты продолжат атаковать целевой сервер в течение минуты или
двух даже после того, как нападавший отозвал нападение.

A SYN flood is a form of denial-of-service attack in which an attacker sends a progression of SYN requests to an objective’s framework trying to consume enough server assets to make the framework inert to authentic activity.

TCP three-way handshake

Typically, when a customer begins a TCP connection with a server, the customer and server trade a progression of messages which regularly runs this way:

1) The customer asks for a connection by sending a SYN (synchronize) message to the server.

2) The server recognizes this request by sending SYN-ACK back to the customer.

3) The customer reacts with an ACK, and the connection is built up.

This is known as the TCP three-way handshake, and is the establishment for each connection set up utilizing the TCP protocol.

Working of SYN flood attack

A SYN flood attack works by not reacting to the server with the normal ACK code. The pernicious customer can either basically not send the normal ACK, or by satirizing the source IP address in the SYN, bringing about the server to send the SYN-ACK to a distorted IP address – which won’t send an ACK on the grounds that it “knows” that it never sent a SYN.

The server will sit tight for the affirmation for quite a while, as straightforward system clog could likewise be the reason for the missing ACK. In any case, in an attack, the half-open connections made by the pernicious customer tie resources on the server and may in the long run surpass the resources accessible on the server. By then, the server can’t be access by any customers.

Security against SYN Flood Attacks

There are various surely understood countermeasures including:

1) Filtering

2) Increasing Backlog

3) TCP half-open: The term half-open alludes to TCP associations whose state is out of synchronization between the two potentially because of an accident on one side. A connection which is being set up is otherwise called a embryonic connection. The absence of synchronization could be because of malignant purpose. A TCP connection is alluded to as half-open when the host toward one side of that TCP association has slammed, or has generally evacuated the attachment without informing the flip side. In the event that the rest of the end is inert, the association may stay in the half-open state for unbounded time frames. These days, the term half-open association is regularly used to portray an embryonic connection, i.e. a TCP connection which is being set up.

The TCP convention has a three state framework for opening a connection. To begin with, the beginning endpoint (A) sends a SYN bundle to the destination (B). A is currently in an embryonic state (particularly, SYN_SENT), and anticipating a reaction. B now redesigns its portion data to demonstrate the approaching connection from A, and conveys a request to open a channel back (the SYN/ACK bundle). Now, B is additionally in an embryonic state (particularly, SYN_RCVD). Note that B was put into this state by another machine, outside of B’s control.

Under typical conditions (see foreswearing of-administration attack for conscious disappointment cases), A will get the SYN/ACK from B, overhaul its tables (which now have enough data for A to both send and get), and send a last ACK back to B. When B gets this last ACK, it additionally has adequate data for two-way correspondence, and the connection is completely open. Both endpoints are currently in an established state.

4) Firewalls and Proxies

5) Reducing SYN-RECEIVED Timer

6) SYN Cache

7) Recycling the Oldest Half-Open TCP

8) Hybrid Approaches

9) SYN cookies: SYN cookie is a strategy used to oppose SYN surge assaults. Daniel J. Bernstein, the procedure’s essential creator, characterizes SYN treats as “specific decisions of beginning TCP arrangement numbers by TCP servers”. The utilization of SYN treats permits a server to abstain from dropping associations when the SYN line tops off. Rather, the server carries on as though the SYN line had been amplified. The server sends back the suitable SYN+ACK reaction to the customer yet disposes of the SYN line section. In the event that the server then gets a resulting ACK reaction from the customer, the server can reproduce the SYN line section utilizing data encoded as a part of the TCP succession number.

If you need any further assistance please contact our support department.

DoS/DDoS-атаки направлены на нарушение базовой услуги доступности. Основная цель DoS/DDoS-атак вывести атакуемый объект из рабочего состояния и сделать его ресурсы недоступными для легальных пользователей. Атаку, направленную на отказ в обслуживании, можно провести двумя способами: используя уязвимости в программном обеспечении атакуемой системы и при помощи отсылки большого количества определенно составленных сетевых пакетов (flood).

Первый способ сложнее и требует более высокой квалификации атакующего. Второй способ основан на применении "грубой силы". Идея заключается в том, чтобы загрузить вычислительные ресурсы сервера обработкой огромного количества посланных злоумышленником пакетов. Такая загрузка сервера в лучшем случае может привести к тому, что сервер будет неспособен принять на обработку запросы от легальных пользователей, а в худшем случае может привести к зависанию и отключению сервера.

Здесь стоит отметить, что можно выделить два типа атак, направленных на загрузку ресурсов системы: в первом случае загружаются вычислительные ресурсы сервера, а в другом - пропускная способность канала связи. Разрабатываемая методика ориентирована на защиту от атак первого типа, поэтому дальше будем считать, что пропускной способности достаточно, чтобы сервер получил весь адресованный ему трафик.

Для многих DoS/DDoS атак результаты обработки сервером пакетов, отправленных злоумышленником, последнего не интересуют. Это значит, что атакующий может отправлять поток ложных заявок с ложных IP адресов (это понятие называется spoofing), что препятствует его обнаружению и эффективному противодействию такого рода атакам.

Для проведения успешной DoS-атаки необходима довольно высокая пропускная способность канала. Поэтому атака на отказ в обслуживании в большинстве случаев проводится сразу с нескольких машин. Атака, в проведении которой участвует большое количество машин, получила название DDoS. Стоит отметить, что для распределенной атаки могут использоваться инфицированные специальным ПО машины не принадлежащие атакующему. Такие зараженные машины называются "зомби". Одним из способов получения "зомби" является массовое внедрение "трояна" на компьютеры мирных пользователей. Получив определенную извне команду такой "троян" превращает "мирный" компьютер с доступом в Internet в источник ложных запросов, направленных на перегрузку ресурсов сервера.

Наиболее распространенными DoS атаками являются:

· TCP SYN Flood или просто TCP SYN

· Ping of Death

Рассмотрим подробнее TCP SYN (tcp syn flood) атаку, которая направлена на прикладные сервисы, использующие протокол транспортного уровня TCP. Этот протокол получил широкое распространение в информационных системах за счет того, что он гарантирует 100% доставку всех передаваемых данных. Взаимодействующие узлы сети, использующие в качестве транспорта этот протокол, устанавливают между собой TCP соединения, в рамках которых ведется контроль над тем, что получатель получит все посланные отправителем пакеты. Это достигается за счет того, что получатель извещает отправителя о том, какие пакеты он получил. Если до получателя дошли не все предназначенные ему пакеты, то отправитель повторно их отправит. Как видно достоинством этого протокола является возможность установления соединения. Для хранения информации о текущем состоянии соединения в частности используется поле битовых флагов в пакетах, используемых протоколом. Под это поле отведено 8 бит, однако 2 из них являются зарезервированными и в настоящее время используются только 6 флагов: URG (флаг срочности), ACK (флаг подтверждения), PSH (флаг push функции), RST (флаг сброса), SYN (флаг синхронизации) и FIN (флаг окончания). К сожалению, установленный стандартом механизм установления соединения не является совершенным, и рассматриваемая атака, как раз использует его недостатки.

Основная цель этой TCP SYN атаки - превысить ограничение на количество TCP соединений, которые находятся в состоянии установки. Рассмотрим процедуру установки TCP соединения. Сначала клиент, инициализирующий соединение отправляет серверу TCP-SYN запрос. Получив такой запрос, сервер выделяет память для параметров соединения в специально предназначенном для этого буфере. Затем отправляет клиенту TCP пакет с флагами SYN+ACK. Получив пакет SYN+ACK, клиент должен отправить серверу пакет с подтверждением, т.е. пакет с установленным флагом ACK. Когда сервер получит и обработает этот пакет, соединение является установленным. Описанная выше

процедура изображена на рис. 1.1

Рис. 1.1

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

Отсутствие обратной связи с атакующим делает обнаружение и отражение TCP-SYN атаки довольно сложной задачей.

Постановка задач по защите от угроз

В настоящее время в открытой литературе не известны эффективные методы обнаружения TCP SYN атак. В современных ОС присутствуют механизмы защиты атакуемого сервера, например SYN cookies. Операционная система автоматически включает защиту, когда обнаруживает превышение значений некоторых параметров. Например, ОС Windows 2000 следит за значениями трех параметров: TcpMaxHalfOpen, TcpMaxHalfOpenRetried, TcpMaxPortsExhausted . Пороговые значения для этих параметров имеют значения по умолчанию и могут меняться администратором. Если исходные значения не подходят для конкретного сервера, то перед администратором стоит непростая задача эффективно настроить защиту. Кроме того, этот метод требует внесения соответствующих изменений в реализацию стека TCP/IP, которые некоторые специалисты в области сетевых технологий считают "серьезным нарушением" протокола TCP.

Другим недостатком средств обнаружения TCP атаки интегрированных в ОС является то, что при перегрузке (имеется в виду нехватка ресурсов процессора и памяти) или зависании самой системы средства противодействия так же становятся неработоспособными.

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

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

Собственно, речь пойдет о защите от SYN flood атак:

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

Определить SYN атаку просто - команда netstat выдает огромный список полуоткрытых подключений:

Netstat -n --tcp | grep SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:1084 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:1228 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:2652 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:3446 SYN_RECV

Netstat -n --tcp | grep SYN_RECV | wc -l 238

Для начала - проверяем параметр tcp_syncookies - он должен быть равен 1:

Cat /proc/sys/net/ipv4/tcp_syncookies 1

Так и оставляем. По умолчанию в новых дистрибутивах этот параметр всегда включен.

Если параметр tcp_syncookies установлен (доступен только когда ядро собрано с CONFIG_SYNCOOKIES), тогда ядро обрабатывает SYN пакеты TCP в обычном режиме до тех пор, пока очередь не заполнится. После заполнения очереди включается механизм SYN cookies.

SYN cookies вообще не использует очередь SYN. Вместо этого ядро отвечает на каждый SYN пакет, как обычно SYN|ACK, но туда будет включено специально сгенерированное число на основе IP адресов и портов источника и получателя, а также времени посылки пакета. Атакующий никогда не получит эти пакеты, а поэтому и не ответит на них. При нормальном соединении, будет послан третий пакет, содержащий число, а сервер проверит был ли это ответ на SYN cookie и, если да, то разрешит соединение даже в том случае, если в очереди SYN нет соответствующей записи.

Включение механизма SYN cookies является очень простым способом борьбы против атаки SYN флудом. При этом немного больше загружается процессор из-за необходимости создавать и сверять cookie. Так как альтернативным решением является отклонять все запросы на соединение, SYN cookies являются хорошим выбором.

Также нужно увеличить очередь полуоткрытых соединений - tcp_max_syn_backlog (в Debian Lenny по-умолчанию 1024 соединения):

Cat /proc/sys/net/ipv4/tcp_max_syn_backlog 1024

Увеличиваем:

Echo "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog

Кроме того, можем уменьшить время ожидания соединения tcp_synack_retries :

Целочисленное значение (1 байт) tcp_synack_retries определяет число попыток повтора передачи пакетов SYNACK для пассивных соединений TCP. Число попыток не должно превышать 255. Используемое по умолчанию значение 5 соответствует приблизительно 180 секундам на выполнение попыток организации соединения.

cat /proc/sys/net/ipv4/tcp_synack_retries 5

Уменьшаем до 1 (это примерно 9 секунд):

Echo "1" > /proc/sys/net/ipv4/tcp_synack_retries

tcp_fin_timeout

Целое число в файле tcp_fin_timeout определяет время сохранения сокета в состоянии FIN-WAIT-2 после его закрытия локальной стороной. Партнер может не закрыть это соединение никогда, поэтому следует закрыть его по своей инициативе по истечении тайм-аута. По умолчанию тайм-аут составляет 60 секунд. В ядрах серии 2.2 обычно использовалось значение 180 секунд и вы можете сохранить это значение, но не следует забывать, что на загруженных WEB-серверах вы рискуете израсходовать много памяти на сохранение полуразорванных мертвых соединений. Сокеты в состоянии FIN-WAIT-2 менее опасны, нежели FIN-WAIT-1, поскольку поглощают не более 1,5 Кбайт памяти, но они могут существовать дольше.

cat /proc/sys/net/ipv4/tcp_fin_timeout 60

Меняем на 30:

Echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout

tcp_keepalive_probes

Целочисленная переменная tcp_keepalive_probes задает число передач проб keepalive, после которого соединение считается разорванным. По умолчанию передается 9 проб.

cat /proc/sys/net/ipv4/tcp_keepalive_probes 9

Echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes

tcp_keepalive_intvl

Целочисленная переменная tcp_keepalive_intvl определяет интервал передачи проб. Произведение tcp_keepalive_probes * tcp_keepalive_intvl определяет время, по истечении которого соединение будет разорвано при отсутствии откликов. По умолчанию установлен интервал 75 секунд, т.е., время разрыва соединения при отсутствии откликов составит приблизительно 11 минут.

cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75

Ставим 15:

Echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl

netdev_max_backlog

Здесь указывается максимальное количество пакетов в очередь на обработку если интерфейс получает пакеты быстрее, чем ядро может их обработать.

Cat /proc/sys/net/core/netdev_max_backlog 1000

Увеличиваем:

Echo "20000" > /proc/sys/net/core/netdev_max_backlog

somaxconn

Максимальное число открытых сокетов, ждущих соединения.

Cat 1024

Увеличиваем:

Echo "20000" > /proc/sys/net/core/somaxconn

Так как подобные изменения параметров ядра не сохранятся после перезагрузки - добавляем в /etc/rc.local :

Echo "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog echo "1" > /proc/sys/net/ipv4/tcp_synack_retries echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl echo "20000" > /proc/sys/net/core/netdev_max_backlog echo "20000" > /proc/sys/net/core/somaxconn

Кроме того, можно добавить ограничение числа SYN пакетов в единицу времени в iptables:

Iptables -N syn_flood iptables -A INPUT -p tcp --syn -j syn_flood iptables -A syn_flood -m limit --limit 500/s --limit-burst 1500 -j RETURN iptables -A syn_flood -j DROP

Число новых SYN пакетов - максимум 500 в секунду, при превышении порога в 1500 - новые пакеты блокируются:

Более наглядно этот критерий можно представить себе как некоторую емкость с выпускным отверстием, через которое проходит определенное число пакетов за единицу времени (т.е. скорость «вытекания»). Скорость «вытекания» как раз и определяет величина --limit. Величина --limit-burst задает общий «объем емкости». А теперь представим себе правило --limit 3/minute --limit-burst 5, тогда после поступления 5 пакетов (за очень короткий промежуток времени), емкость «наполнится» и каждый последующий пакет будет вызывать «переполнение» емкости, т.е. «срабатывание» критерия. Через 20 секунд «уровень» в емкости будет понижен (в соответствии с величиной --limit), таким образом она готова будет принять еще один пакет, не вызывая «переполнения» емкости, т.е. срабатывания критерия.