Обнаружение и защита от DoS-атак. Защита от SYN flood атак

ERP-система (Enterprise Resource Planning) – это система управления ресурсами компании. Читайте, как ее выбрать, каковы ее преимущества и недостатки, сколько она стоит и что учесть, чтобы внедрение прошло успешно.

Что такое ERP-система и зачем она нужна

ERP-система расшифровывается как Enterprise Resource Planning. ERP-система простыми словами – это система управления ресурсами компании. Обычно их внедряют на крупных предприятиях со сложным производством, разветвленной филиальной сетью, большим ассортиментом выпускаемой продукции, повышенным объемом складских операций. Их главное достоинство заключается в том, что они позволяют объединить несколько задач: можно одновременно учитывать и планировать денежные средства, а также отслеживать их движение; и оценивать производительность труда на предприятии. Кроме того, все процессы становятся прозрачными.

ERP обеспечивает:

  1. Объединение всех бизнес-процессов по единым правилам в рамках одной системы;
  2. Оперативное получение руководством информации о всех сторонах деятельности предприятия;
  3. Планирование и контроль деятельности организации (краткосрочные и долгосрочные планы различных подразделений увязываются между собой).

В результате повышаются эффективность управления бизнесом и его конкурентоспособность.

Ерп-системаудобна еще и тем, что ее можно внедрять частями (модулями), автоматизировав, например, сначала производство, а затем работу с персоналом. Набор модулей охватывает все направления деятельности, что позволяет автоматизировать практически все бизнес-процессы.

Опыт предприятий, прошедших внедрение успешно, показывает, что в результате сокращаются складские запасы (в среднем на 21,5%), возрастает производительность труда (на 17,5%), увеличивается число своевременно выполненных заказов (на 14,5%). Кроме того, повышается инвестиционная привлекательность бизнеса, особенно для иностранных инвесторов, которые всегда хотят, чтобы онбыл прозрачным.

Плюсы и минусы ERP-системы

У систем управления ресурсами есть два серьезных недостатка: внедрять их, как правило, дорого и долго.

Расходы должны рассматриваться руководством компании как стратегические инвестиции, которые принесут дополнительную прибыль далеко не сразу. Обычно окупаемость приходит лишь спустя несколько лет.

Высокая стоимость складывается из нескольких составляющих:

  • цена одной лицензии, то есть, по сути, цена одного рабочего места, составляет от 1500 до 8000 долл.;
  • цена за консалтинговые услуги, внедрение и сопровождение колеблется в пределах 100–500% от стоимости;
  • цена обучения пользователей – от 1000 долл. в неделю.

Долгое и сложное внедрение ERP обусловлено, как правило, необходимостью серьезного пересмотра работы компании. Ее невозможно внедрить на предприятии, где не отлажены бизнес-процессы (см. также про ). Именно поэтому требуется предварительное независимое исследование предприятия консалтинговой компанией. Это позволит понять, можно ли вообще внедрять на данном предприятии какую-либо систему или необходимо сначала откорректировать бизнес-процессы. Если эту стадию пропустить, предприятие рискует потерять огромные деньги в случае неудачной или затянувшейся установки системы.

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

Целесообразно составить документ «Требования к ERP-системе» для использования прежде всего внутри предприятия. В нем должны быть формализованы и расписаны все ее существенные характеристики. Лишь после этого следует приступать к выбору.

Согласно статистике только 30% всех внедрений оказываются успешными, то есть затраты окупаются. Однако у вашей компании есть шанс улучшить столь неутешительную статистику. Для этого надо учесть чужой опыт. Расскажем обо всем по порядку.

Методы внедрения

Существует несколько методов внедрения ерп-системы.

  1. Поэтапная реализация – автоматизируются лишь несколько связанных бизнес-процессов. При таком варианте риск неудачи относительно низкий.
  2. «Большой взрыв» – установка целиком и сразу. Это очень рискованный вариант, который предпочтителен для и относительно несложным производством. Этот метод требует интенсивной стадии тестирования, поскольку необходимо тщательно проверить, насколько безошибочно автоматизированы все бизнес-процессы.
  3. Развертывание – введение в действие на одном участке производства (в отделе, филиале и т. п.), а затем уже распространяется на другие участки. Само развертывание на каждом участке можно провести как поэтапную реализацию или как «большой взрыв». Риск в этом случае, как правило, незначительный (если не переусердствовать с «большими взрывами»).

Необходимо тщательно проанализировать, какой из указанных методов внедрения ERP наиболее оптимален для вашей компании (принять во внимание затраты и опыт других фирм), и лишь потом приступать к выбору.

Выбор ERP-системы

Сегодня на российском рынке существует несколько автоматизированных систем управления предприятием как западных, так и отечественных производителей. Какая же ERP лучше – западная или отечественная? Мнения по этому вопросу весьма противоречивы. Выделим сильные и слабые стороны обоих вариантов.

Безусловно, сильной стороной западных платформ является четко прописанная последовательность действий при производственном планировании. Главный же недостаток – необходимость доработки с учетом национальных особенностей. К примеру, для ведения бухгалтерского учета и составления отчетности в соответствии с российскими правилами приходится дорабатывать настройки модуля «Финансы».

Кроме того, российские предприятия, на которых выпуск продукции осуществляется по конструкторской и технологической документации (например, машиностроительные и приборостроительные заводы), обязаны использовать стандарты ЕСКД (Единая система конструкторской документации) и ЕСТД (Единая система технологической документации). Западные автоматизированные системы управления эти стандарты не поддерживают. Поэтому необходимы доработки на программном уровне. Это требует дополнительных затрат, которые следует учесть заранее.

Российские системы и их внедрение стоят значительно дешевле западных. И, еонечно, отечественные специалисты учитывают российскую специфику.

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

Расходы при установке

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

В бюджет проекта стоит заложить возможное превышение сметы. И заказчики, и представители консалтинговых компаний, как правило, считают вполне нормальным, если фактические расходы превысили запланированные на 10–15 процентов, однако на практике эти расхождения бывают больше.

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

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

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

Причины неудачного внедрения ERP-систем

Многие предприятия в целях экономии полагаются только на собственную службу информатизации или приглашают на временную работу сторонних специалистов, пытаясь сэкономить на услугах консультантов. Увы, нередко это приводит к тому, что работа затягивается на несколько лет, а компания теряет время и ресурсы. Дело в том, что введение систем управления ресурсами предполагает реорганизацию всех бизнес-процессов, а внутренним и внештатным специалистам такая задача зачастую не по плечу.

Однако если руководство компании решает полностью доверить установку ERP системному интегратору, возможна другая ошибка. Все функции перекладываются на консультантов. Сами же специалисты занимают отстраненную позицию – мол, они сделают, а мы поглядим. Но даже самые квалифицированные консультанты не могут видеть и знать всего положения дел в компании, к тому же работать с системой в итоге придется именно персоналу предприятия. Успех проекта в равной степени зависит и от консультантов, и от самой компании. Поэтому лучше, когда за результаты отвечают обе стороны.

Проблемы могут возникнуть, если крупная организация станет устанавливать систему целиком (метод «большого взрыва»). Опыт свидетельствует, что неудача в этом случае практически гарантирована. Резкое изменение принципов работы – это стресс для всего предприятия, поэтому процесс ни в коем случае нельзя искусственно ускорять. Персонал должен постепенно привыкать к переменам, которые вносит ERP. Поэтому правильнее сперва выбрать методы поэтапной реализации или развертывания.

Необходимо быть готовыми к сопротивлению сотрудников. Это одна из главных проблем, с которой сталкивается руководство. Она обусловлена тем, что на долгое время у сотрудников значительно прибавляется забот. Кроме того, их ошибки, благодаря нововведениям, становятся заметными всем участникам бизнес-процессов и прежде всего руководству (см. ).

И последнее – после установки не ждите быстрого и «чудесного» преображения компании. Как мы уже отмечали, эффект от внедрения ERP – вопрос времени. Главный положительный результат на первой стадии работы системы заключается в том, что она сама заставит вас отладить и усовершенствовать все бизнес-процессы. А это уже немало.

Поддержка пользователей и мотивация

Стоит отдельно остановиться на двух важных аспектах автоматизации: обучении и поддержке пользователей, а также мотивации. Логично обучить работе с новой ИТ-системой прежде всего команду внедрения, а затем организовать центр обучения пользователей (если компания крупная) или провести ряд очных встреч, если работников не так много. Можно учить и дистанционно, с помощью вебинаров, записанных курсов и прочих возможностей.

После того как внедрение состоялось, нужно обеспечить пользователей постоянно обновляемой библиотекой инструкций, например, на корпоративном портале.

Нужно помнить и о мотивации. Внедрение любой ERP-системы требует от участников колоссальных трудозатрат, поэтому немотивированный персонал, в том числе на рядовых должностях, значительно увеличит текучку кадров.

A SYN flood attack is a form of denial-of-service attack in which an attacker sends a large number of SYN requests to a target system’s services that use TCP protocol. This consumes the server resources to make the system unresponsive to even legitimate traffic. This attack can occur on any services that use TCP protocol but mainly on web service. In this article, we will go through the basics of SYN flood attacks and the mitigation steps in detail.

The SYN Flood attack exploits an implementation characteristic of the Transmission Control Protocol (TCP), which is called 3-way handshake. Following are the steps that occur in a normal 3-way handshake:

1. The client requests a connection by sending a SYN (synchronize) message to the server.
2. The server acknowledges this request by sending SYN-ACK back to the client.
3. The client responds with an ACK, and the connection is established.

A SYN flood attack works by not responding to the server with the expected ACK code. By these half-open connections, the target machines TCP backlog will get filled up and hence all new connections may get ignored. This will cause the legitimate users to also get ignored.

This attack can take place in two ways:

1. Direct Attack

In this kind of attack, attackers rapidly send SYN segments without spoofing their IP source address. When detected, this type of attack is very easy to defend, because we can add a simple firewall rule to block packets with the attacker"s source IP address which will shutdown the attack.

2. Using Ip address Spoofing

This is a more complex form of attack than the direct attack. In this method, the malicious machine will send SYN request floods to the target machine from spoofed IP addresses, causing the server to send the SYN-ACK to a falsified IP address - which will not send an ACK because it "knows" that it never sent a SYN.

Detecting SYN flood Attack

The generic symptom of SYN Flood attack to a web site visitor is that a site takes a long time to load, or loads some elements of a page but not others. If you suspect a SYN Flood attack on a web server, you can use netstat command to check the web server connection requests that are in “SYN_RECEIVED” state.

netstat -tuna | grep:80 | grep SYN_RECV

If it shows numerous connections with this state, the server could be under SYN Flood attack. If the attack is direct with large number of SYN_RECV packets from a single IP address, you can stop this attack by adding that IP address in the firewall. If you have APF or CSF firewall installed on your server, you can accomplish this by executing the following command:

apf –d IPADDRESS
csf –d IPADDRESS

Defending SYN Flood Attack

Using SYN cookies

This is the most effective method of defending from SYN Flood attack. The use of SYN cookies allow a server to avoid dropping connections when the SYN queue fills up. Instead, the server behaves as if the SYN queue has been enlarged. The server sends back the appropriate SYN+ACK response to the client but discards the SYN queue entry. If the server then receives a subsequent ACK response from the client, it is able to reconstruct the SYN queue entry using information encoded in the TCP sequence number.

SYN cookies can be enabled by adding the following to /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1

After modifying the sysctl configuration file, you need to execute the following command to load sysctl settings from the file /etc/sysctl.conf

Increasing the SYN backlog queue

An optional defending technique is to increase the SYS backlog queue size. The default size is 1024. This can be done by adding the following to /etc/sysctl.conf

net.ipv4.tcp_max_syn_backlog = 2048

Reducing SYN_ACK retries

Tweaking the kernel parameter tcp_synack_retries causes the kernel to close the SYN_RECV state connections earlier. Default value is 5.

net.ipv4.tcp_synack_retries = 3

Setting SYN_RECV timeout

Lowering the timeout value for SYN_RECV will help in reducing the SYN flood attack. The default value is 60 and we can reduce it to 40 or 45. This can be done by adding the following line to sysctl.conf.

net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv=45

Preventing IP spoofing

The following sysctl parameter will help to protect against IP spoofing which is used for SYN flood attacks.

net.ipv4.conf.all.rp_filter = 1

Many hosting companies provide protection against SYN attack by deploying firewalls that employ SYN flood defense such as Netscreen or Appsafe.

Bobbin Zachariah 8:24 am

About Bobbin Zachariah

Founder of LinOxide, passionate lover of Linux and technology writer. Started his career in Linux / Opensource from 2000. Love traveling, blogging and listening music. Reach Bobbin Zachariah

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

Проблемы, не зависящие от атакующего.

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

Программная реализация.

Для реализации подходит как unix, так и windows-платформы. Программа должна запускаться с правами root и администратора соответственно. Под unix много готовых реализаций, например, synk4.c (искать поисковиками). Специализированные для координированых DDoS-атак реализации найти сложнее, но при минимальных навыках программирования можно доработать существующие или создать свои.

Кроме стандартных сырых сокетов, D0minat0r из Nerf нашел очень красивый способ реализации SYN flood под linux, на других юниксоподобных не тестировалось, на win не работает. Linux позволяет root"у биндить сокет к любому адресу, в т.ч. не принадлежащему локальному хосту. После этого можно вызывать connect() для этого сокета, и локальный хост пошлет SYN-пакет от адреса, к которому прибинжен сокет. Если сокет был в неблокирующем режиме, то сразу после connect() можно вызывать close(), и повторять операцию.

Реализации под windows встречаются реже, из-за расхожего мифа о невозможности генерации сырых пакетов в этой OS. На самом деле, win98 поддерживает сырые сокеты уровня до заголовка IP, а win2k и XP - и заголовок тоже (опция IP_HDRINCL), т.е. реализация атаки под win2k и XP отличается от юниксовской лишь несколькими строчками. Готовая реализация от меня, проверенная на win2k, лежала одно время на www.nerf.ru, но после смены хостинга, моего ухода из этой группы и форматцевта потерялась. Если у кого-то сохранилась - свяжитесь, плиз, выложу.

Механизмы защиты OS от SYN-flood.

a) Стандартный таумаут. Полуоткрытые соединения по прошествии некоторого времени выбрасываются из буфера. При истощении буфера запросы клиентов на подключение будут проходить с вероятностью C1/C2, где C1 - количество SYN-пакетов от клиента, C2 - количество SYN-пакетов от всех остальных (включая атакующего). Даже при нагрузке на канал атакующего в 6 пакетов в секунду C1/C2 - примерно 1/100, т.е. служба выведена из строя на 99%.

б) Безлимитный буфер полуоткрытых соединений. При нагрузке на канал атакующего 100 Mb/сек и таймауту около минуты очередь полуоткрытых соединений будет занимать примерно 1 Gb памяти, что для крупных серверов не смертельно. Побочный эффект: атакуемый сервер отвечает трафиком, в 3 раза большим, чем трафик атакующего (говорят, что происходит DDoS с умножением в 4 раза), что может привести к истощению пропускной способности канала. Однако, при невозможности истощить ширину канала, защита от атаки будет абсолютной, ни одно клиентское соединение не будет отвергнуто.

в) Очистка наиболее старых полуоткрытых соединений. При переполнении буфера из него удаляется самое старое полуоткрытое соединение. Побочный эффект: если при атаке буфер заполняется за время t, то клиент не сможет подключиться во время атаки, если время подтверждения соединения больше t - его запрос тоже будет выброшен. Например, для нагрузки канала атакующего 4 Мбит/сек и длины буфера 512 (рекомендуемое значение для Win2K) время t - около 50 msec, что гарантированно отбросит все попытки подключения к серверу с диалапа и многие - с выделенных линий. Увеличивая размер буфера, защиту можно свести к предыдущему варианту.

г) SYN COOKIE. После истощения буфера информация, которая не помещается в буфер, отсылается клиенту, который якобы запросил ее. Если клиент - настоящий, то он возвращает информацию обратно, если поддельный - она теряется, причем механизм реализован в рамках RFC по TCP, т.е. его поддерживают и клиенты, не знакомые с этой технологией. Операционная система c SYN COOKIE, независимо от размера буфера полуоткрытых соединений, совершенно неуязвима для SYN-flood атак. Побочный эффект: запрет "больших окон".

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

Собственно, речь пойдет о защите от 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), таким образом она готова будет принять еще один пакет, не вызывая «переполнения» емкости, т.е. срабатывания критерия.

Disclaimer 1: прошу простить мне тот факт, что статья довольно скомкана, и многие темы не раскрыты полностью. Не стесняйтесь задавать вопросы в комментариях. Я, в свою очередь, постараюсь раскрыть наиболее интересные темы в дальнейших статьях.

Disclaimer 2: в сети есть множество статей с заголовками “Как защитить сервер от SYN-атак” или “Защита Linux от DDoS”. Должен предупредить, что многим из них ни в коем случае нельзя слепо верить! Они зачастую написаны людьми, которые плохо понимают, что происходит во время атаки, и рекомендуют делать сумасшедшие вещи - кто-то “оптимизирует” sysctl так, что на сервер перестает проходить даже нормальный трафик, а большинство советуют еще и включить syncookies, чего делать категорически нельзя при большей части реальных атак!

Этой статьей я преследую 3 цели:

Что такое SYN-атака?

SYN-флуд или SYN-атака - это метод вызова отказа в обслуживании, влияющий на хосты, выполняющие серверные процессы TCP. Атака используется тот факт, что TCP хранит состояние сессии после получения SYN-сегмента на порту, находящемся в состоянии LISTEN. Основная идея - эксплуатировать это поведение, заставляя хост хранить столько состояний для ложных полуоткрытых сессий, что у него не остается ресурсов для установки новых соединений (RFC4987).

С SYN-флудом относительно сложно бороться, поэтому атаки этого типа так популярны. Почему же?

1) Обычно используются случайные Source IP, которые бесполезно банить, потому что они заново генерируются в каждом пакете;
2) SYN-атака потребляет мало ресурсов на стороне атакующего и очень много на стороне жертвы;
3) Защита от этого типа атак довольно комплексная, полна нюансов и требует времени, чтобы понять и внедрить ее.

Я считаю, что серверы, которые потенциально подвержены атакам (по сути, все серверы, которые имеют публичные IP-адреса, в особенности Web-серверы) должны быть защищены от SYN-атак заранее.

Рисунок 1: SYN-атака

Как производятся SYN-атаки?

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

hping3 - это богатая возможностями утилита, которая может проделывать множество типов атак с различными параметрами. Я не буду давать мастер-класс по ее использованию, покажу только пример того, как можно проверить свой сервер на уязвимость к небольшой SYN-атаке:

# hping3 -S <--fast|--faster|--flood> -p 80 xx.xx.xx.xx

80 (HTTP) в этом примере - это порт назначения. Обратите внимание на другие параметры (hping3 --help), чтобы понять, как атаки могут отличаться друг от друга.

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

Как определить и измерить SYN-атаку?

1) Во время SYN-атаки атакующий открывает множество подключений к Вашему серверу, но никогда не завершает их, и подключения продолжают висеть в состоянии SYN_RECV. Их можно подсчитать вот так:

# netstat -anutp | grep SYN_RECV | wc -l

Если это число >30 - Вы, вероятно, под SYN-атакой.

2) Вы можете мониторить текущую нагрузку на сеть с помощью vnstat:

# vnstat -l -i eth0

Это очень полезная утилита, которая поможет понять, насколько сильная идет атака.

Нажмите F2, зайдите в "Display options" и выберите "Display threads in a different color". Розовым цветом можно будет увидеть нагрузку от системных прерываний.

4) Просмотрите SYN-сегменты, которые получает сервер - что в них общего? "-c 100" говорит tcpdump ограничиться 100 пакетами.

# tcpdump -i eth0 -nn "tcp port 80" and "tcp == 2" -c 100

И наконец, помните, что многие SYN-атаки не “равномерны”, у них есть пики и провалы, которые нужно учитывать в процессе анализа.



Рисунок 2. Динамика типичной атаки

Сначала - главное

Сетевая карта, прерывания, очереди…

Первая вещь, над которой нужно поработать - это драйвер сетевой карты. Когда на сетевую карту приходит фрейм, она должна инициировать системное прерывание, которое говорит процессору приостановить выполнение текущей задачи и обработать пришедшую порцию трафика. Однако если бы каждый фрейм вызывал незамедлительное прерывание и “отвлекал” CPU от текущих задачи, заметную деградацию производительности можно было бы наблюдать даже на простейших сетевых операциях, таких как передача файла по FTP. Поэтому эти прерывания организованы в очередь, которая скапливается на сетевой карте и обрабатывается процессором за один раз. Обычно это происходит 250-1000 раз в секунду, чем реже - тем меньше загрузка CPU, тем выше задержка.

С другой стороны, большинство современных десктопов и серверов имеют насколько процессорных ядер. Поскольку каждое из них работает для ОС как отдельный процессор, мы можем равномерно распределить между ними нагрузку от прерываний. Есть 2 способа это сделать.

1) Первый и рекомендуемый - использовать аппаратные очереди. Современные сетевые карты имеют несколько очередей прерываний, обычно 4-16. По какой-то причине, в Linux они часто отключены по умолчанию. Нам нужно их включить, а затем равномерно распределить их по процессорам.

2) Второй способ называется RPS - Receive Packet Steering. Это довольно новый механизм ядра, который автоматически распределяет нагрузку между всеми ядрами, неважно, есть на карточке несколько аппаратных очередей или нет. Используйте этот способ только если у Вас больше ядер, чем аппаратных очередей (кстати, рассмотрите возможность отключения SMT/HyperThreading - во время атаки это будет весьма кстати).


Рисунок 3. Intel 10Gb NIC

Шаги, которые нужно предпринять:

1) Определите производителя и модель сетевой карты (лучше бы это был Intel)

# ethtool -i eth0

2) Установите последние драйверы. Зайдите на сайт производителя чипа для сетевой карты и скачайте последнюю версию драйвера под Linux (чтобы его собрать, понадобятся исходники текущего ядра)

3) Настройте аппаратные очереди. Для этого Вам понадобится воспользоваться документацией от драйвера сетевой карты, которая идет вместе с ним. Для igb (драйвера Intel) c 8 очередями и 4 портами это выглядит примерно так:

# rmmod igb
# modprobe igb QueuePairs=1,1,1,1 RSS=8,8,8,8 IntMode=3,3,3,3 InterruptThrottleRate=3000,3000,3000,3000

Для драйвера igb в RHEL/CentOS Вы можете просто добавить строку параметров драйвера в /etc/modprobe.conf и перезагрузиться:

options igb QueuePairs=1,1,1,1 RSS=8,8,8,8 IntMode=3,3,3,3 InterruptThrottleRate=3000,3000,3000,3000

4) Распределите загрузки прерываний равномерно между ядрами.
Нужно будет определить, какие номера прерываний использует карточка (в нашем случае eth0).

# cat /proc/interrupts | grep eth0

Здесь Вы можете увидеть все номера прерываний, которые использует Ваша NIC, и то, как они по факту сейчас распределяются по ядрам. Запишите эти числа. Теперь нам нужно поменять SMP affinity, чтобы назначить каждому прерыванию свое ядро (interrupt 1 > cpu 1, interrupt 2 > cpu 2 и т.д.). Вот как это делается:

# echo > /proc/irq/xx/smp_affinity

5) ОПЦИОНАЛЬНО: Включите RPS (это может не понадобиться, см. выше)

# echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

Выберите соответствующее устройство (если это не eth0) и все очереди приема, которые оно поддерживает (rx-0..n).

Sysctl

Следующая вещь называется sysctl. Это программный интерфейс, позволяющий Вам настраивать множество параметров системы “на лету”. Однако в рамках данной статьи мы воздержимся от обсуждения того, как с их помощью защититься от SYN-атак - об этом в Интернете и так написано слишком много.

В отличие от того, как думает большинство “советчиков”, НЕ СУЩЕСТВУЕТ “универсальных оптимизаций”, которые подошли бы каждому, у кого есть сервер. Каждая так называемая оптимизация влечет за собой последствия, такие как повышенное потребление памяти или уменьшение доступности/функциональности. Безусловно, определенные изменения должны применяться, но эта тема заслуживает отдельной статьи, более обширной, чем эта.

Единственное, что хочется отметить как важное и зачастую неправильно применяемое - так называемые syncookies. Вкратце, это системный механизм борьбы с SYN-атаками путем отправки cookies в ответ на каждый SYN-запрос для подтверждения легитимности соединения. Факт в том, что это может быть действительно полезно, если скорость атаки составляет 40% от эффективной пропускной способности сервера или меньше (под эффективной я имею в виду такую пропускную способность, которую сервер по факту способен обработать). В остальных случаях использование syncookies ведет к повышению нагрузки на сеть, CPU и, таким образом, к отказу в обслуживании.

Лично я в большинстве случаев отключаю syncookies.

Базовые техники защиты с помощью iptables

Не забудьте “укрепить” свой файрвол: блокируйте весь входящий трафик, кроме того, который ДЕЙСТВИТЕЛЬНО нужен на Вашем сервера. Разрешите управление только из доверенных сетей.

Самый простой случай - это атака с 1 IP без подмены адресов (спуфинга). С такими бороться просто:

# iptables -A INPUT -p tcp -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP
# iptables -A INPUT -p tcp -m state --state NEW -m recent --set -j ACCEPT

Эти правила ограничивают количество SYN-пакетов с одного адреса до 20 в минуту. Только не пользуйтесь этим на постоянной основе! Вы можете заблокировать легитимный трафик, идущий из-за NAT.

Многие SYN-атаки можно отфильтровать по “необычным” и повторяющимся параметрам TCP-заголовка, которыми “грешат” атакующие утилиты.

Первый такой параметр - это MSS (Maximum Segment Size) - максимальный размер сегмента, который хочет разрешить хост, инициирующий соединение. Большинство атакующих утилит (включая hping) не задействуют эту опцию по умолчанию. С другой стороны, я еще не видел легитимных клиентов, которые бы ее не ставили. “Нормальные” значения находятся в диапазоне от 536 до 65535, давайте это использовать:

# iptables -t mangle -I PREROUTING -p tcp -m tcp --dport 80 -m state --state NEW -m tcpmss ! --mss 536:65535 -j DROP

Кстати, таблица mangle быстрее, чем filter, потому что обрабатывается раньше, однако через нее проходит ВЕСЬ трафик, и нет возможности разделить INPUT, OUTPUT и FORWARD.

Еще один крайне полезный параметр - это размер окна TCP (window size). Большинство атакующих не генерируют его каждый раз, и он остается одинаковым в течение всей атаки. Чтобы отфильтровать и заблокировать сегменты по window size, понадобится модуль u32 для iptables. После того, как Вы узнаете размер окна, с которым идет атака (например, 512), преобразуйте его в hex (в нашем случае 0x200) и выполните следующую команду:

# iptables -t mangle -I PREROUTING -d xx.xx.xx.xx -p tcp -m u32 --u32 "6&0xFF=0x6 && 32&0xFFFF=0x200" -j DROP

Но будьте осторожны! Не блокируйте well-known размеры окон, используемые популярными операционными системами: 14600, 1892, 65535, 62240, 5840, 32120, 5720, 4128, 8760, 16384, 62920, 64380 и 17820.

Наконец, упомянем параметр TTL (Time To Live). Я хочу, чтобы это был самый последний параметр, на котором основываются Ваши проверки, поскольку диапазон значений невелик и Вы практически наверняка заблокируете не того, кого надо. Но когда вы видите множество пакетов атаки, и совпадает у них только TTL - это может помочь.

# iptables -A FORWARD -p tcp -m ttl --ttl-eq=55 -m state --state NEW -j DROP

Если ничего не помогает

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

1) Наращивание/оптимизация вычислительных/сетевых ресурсов для обработки большего числа запросов;
2) Отделение нежелательного трафика от легального с целью его дальнейшей блокировки.

Таким образом, у Вас есть 3 причины попросить помощи со стороны:
1) У Вас недостаточно полосы пропускания или же вычислительных ресурсов для отделения нежелательного трафика от легального;
2) Атака сложная, и нежелательные пакеты не отличаются или почти не отличаются от легальных. Профессионалы используют более продвинутые методы фильтрации, а иногда дорогостоящее специализированное оборудование и ПО.

И наконец,




Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: