Аббревиатура ERP происходит от английского выражения Enterprise Resource Planning , что дословно означает планирование ресурсов предприятия. Теоретически такая система представляет собой общую стратегию деятельности компании, которая учитывает следующие направления:

  • Управление финансовыми ресурсами - ведение налоговой отчетности, бухгалтерского учета, планирование бюджета;
  • Управление трудовыми ресурсами;
  • Управление активами;
  • Взаимодействие с партнерами и учет истории операций клиентов.

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

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

Строение IT-системы планирования ресурсов предприятия

Являясь сложным программным обеспечением, ERP система состоит из следующих элементов:

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

Модули, подключаемые к основной платформе системы планирования ресурсов производства, условно делятся на три группы:

  1. Внутренние - программы, используемые внутри предприятия, доступ к которым имеют сотрудники.
  2. Внешние - программы, к которым имеют доступ клиенты и партнеры (например, личный кабинет дропшиппер посредника).
  3. Коннекторы - программы для подключения с другими программными продуктами, не являющимися частью системы ERP, но используемые компанией в своей деятельности. Они выполняют обмен данными.

Где взять ERP систему для предприятия

Существует три способа приобрести ПО для планирования ресурсов:

  1. Создание собственного продукта . Зачастую оказывается нерациональным методом, поскольку отсутствие профессионального подхода может привести к возникновению ситуации, когда будет учтено только одно направление, что не даст ощутимого эффекта. При этом внедренную таким способом систему, как правило, сложно заменить или дополнить.
  2. Покупка готовой платформы и внедрение ее в работу предприятия . Тут необходимо сделать правильный выбор в соответствии с деятельностью вашей компании. Качественные и известные продукты стоят довольно дорого и требуют постоянной поддержки со стороны разработчика.
  3. Профессиональная разработка ERP систем индивидуально для компании . Только 20% создаваемых на отечественном рынке программ успешно интегрируются в работу предприятий. А значит риск компании получить некачественный продукт по завышенной стоимости достаточно большой.

Как выбрать и внедрить ERP систему

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

Виды ERP систем для предприятий

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

По виду организации выделяют системы следующих форматов:

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

По типу хранения информации:

  • Облачные - базы данных располагаются на внешних серверах.
  • Внутренние - данные хранятся на собственном сервере компании.

По формату пользовательского интерфейса:

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

По архитектуре программного обеспечения:

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

По классу лицензии на использование:

  • Проприетарная - закрытое ПО, для использования которого требуется оплатить лицензию.
  • Open Source - бесплатные программы с открытым исходным кодом.

Ошибки выбора системы планирования ресурсами

Неправильный выбор системы управления предприятием ERP не только повлечет за собой дополнительные расходы, но и может негативно отразиться на работе предприятия. Чтобы не допустить ошибок, вам нужно знать основные из них:

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

Какие функции должна обеспечивать система планирования ресурсов

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

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

Особенности внедрения ERP

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

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

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

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

Выделяют три стратегии внедрения системы планирования ресурсов предприятия:

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

Как работает ERP система и кому она необходима

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

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

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

Краткий обзор популярных ERP

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

Популярные бесплатные продукты:

  • ERPNext - минималистичная программа для работы частного предпринимателя (ИП). Основной недостаток - ограниченное дисковое пространство, которое можно увеличивать за дополнительную плату.
  • Галактика ERP - разработана под отечественный рынок и позволяет учитывать частые изменения в законодательстве.

Платные программы:

  • SAP ERP - одна из наиболее популярных систем, предлагающих широкий функционал и удобный интерфейс.
  • 1С:Предприятие - достаточно популярная и доступная по цене система, предлагающая большое количество специализированных решений.
  • OpenBravo ERP - программа для среднего уровня с удобным масштабированием и доступной стоимостью.

Достоинства и недостатки ERP

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

Отрицательные стороны интеграции системы планирования ресурсов

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

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

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

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

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

Понимая особенности ERP системы, что это простыми словами и как выбрать для своего предприятия, вы сумеете предостеречь себя от ошибочной покупки ненужного вам дорогостоящего продукта, подобрав наиболее эффективный, сможете грамотно осуществить внедрение, добиться повышения эффективности и прибыли компании.

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) Атака сложная, и нежелательные пакеты не отличаются или почти не отличаются от легальных. Профессионалы используют более продвинутые методы фильтрации, а иногда дорогостоящее специализированное оборудование и ПО.

И наконец,


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

DoS (аббр. Denial of Service «отказ в обслуживании») - хакерская атака на вычислительную систему с целью довести её до отказа, то есть создание таких условий, при которых добросовестные пользователи системы не могут получить доступ к предоставляемым системным ресурсам (серверам), либо этот доступ затруднён.

Существует два типа DoS-атака /DDoS-атак, и наиболее распространенная из них основана на идее флуда, то есть заваливания жертвы огромным количеством пакетов. Флуд бывает разным: ICMP-флуд, SYN-флуд, UDP-флуд и HTTP-флуд. Современные DoS-боты могут использовать все эти виды атак одновременно, поэтому следует заранее позаботиться об адекватной защите от каждой из них.

Обнаружение DoS-атак

SYN-флуд

Наличие SYN- флуда устанавливается легко - через подсчет числа «полуоткрытых» TCP- соединений. В обычной ситуации их не должно быть совсем (или очень небольшое количество: максимум 1-3).

Защита от DoS-атак

    Блокирует фрагменты - пакетов. Так как, в силу функционального назначения протокола, ICMP-пакеты должны быть очень небольшими и нормально укладываться в MTU , наличие их фрагментов обычно свидетельствует об ошибке или попытке атаки. iptables -A INPUT -p icmp -f -j DROP

    Запретить Спуфинг от вашего имени. iptables -A INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j LOG --log-level info --log-prefix "DROP SYN,ACK: " iptables -A INPUT -m conntrack --ctstate NEW,INVALID -p tcp --tcp-flags SYN,ACK SYN,ACK -j REJECT --reject-with tcp-reset

    Ведь если мы получаем пакет с установленными флагами SYN и ACK (такой комбинацией флагов обладает только ответ на SYN-пакет) по еще не открытому соединению, это означает, что кто-то послал другому хосту SYN-пакет от нашего имени, и ответ пришел к нам. Конечно, злоумышленнику предстоит еще угадать номер последовательности, но лучше не предоставлять ему такого шанса. Согласно приведенному правилу, наш хост ответит RST- пакетом, после получения которого атакуемый хост закроет соединение. Добавление такого правила в конфигурацию фаервола настоятельно рекомендуется, потому что если злоумышленнику удастся осуществить спуфинг-атаку от вашего имени, при расследовании этого эпизода следы приведут к вам.

SYN-флуд

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

Увеличение очереди «полуоткрытых» TCP-соединений:

# sysctl -w net.ipv4.tcp_max_syn_backlog=1024

Уменьшение времени удержания «полуоткрытых» соединений:

# sysctl -w net.ipv4.tcp_synack_retries=1

Включение механизма TCP syncookies:

# sysctl -w net.ipv4.tcp_syncookies=1

UDP-флуд

Метод захламления полосы пропускания. Основан на бесконечной посылке UDP-пакетов на порты различных UDP-сервисов. Легко устраняется за счет отрезания таких сервисов от внешнего мира и установки лимита на количество соединений в единицу времени.

#Ставим ограничение на 5 соединений на 80 порт. iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j REJECT # Разрешаем только одно одновременное соединение с одного айпи на smtp iptables -A FORWARD -p tcp --syn --dport smtp -m connlimit --connlimit-above 1 -j DROP #Ставим ограничение на 200 соединений на 1720 порт. iptables -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-above 200 -j REJECT # udp 5060 $IPT -A INPUT -p udp --dport 5060 -m connlimit --connlimit-above 60 -j LOG --log-level info --log-prefix "REJECT 5060: " $IPT -A INPUT -p udp --dport 5060 -m connlimit --connlimit-above 60 -j REJECT # tcp 1720 $IPT -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-above 60 -j LOG --log-level info --log-prefix "REJECT 1720: " $IPT -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit-above 60 -j REJECT

ICMP- флуд

Очень примитивный метод забивания полосы пропускания и создания нагрузок на сетевой стек через монотонную посылку запросов ICMP протокол диагностики перегрузки сети ECHO (пинг). Легко обнаруживается с помощью анализа потоков трафика в обе стороны: во время атаки типа ICMP-флуд они практически идентичны. Почти безболезненный способ абсолютной защиты основан на отключении ответов на запросы ICMP ECHO:

Sysctl net.ipv4.icmp_echo_ignore_all=1

Или с помощью брандмауэра:

Iptables -A INPUT -p icmp -j DROP --icmp-type 8

HTTP-флуд

    Количество процессов ps aux | grep apache | wc -l

    Количество конектов на 80 порту netstat -na | grep ":80\ " | wc -l

    Просмотреть список IP- адресов, с которых идут запросы на подключение: netstat -na | grep ":80\ " | sort | uniq -c | sort -nr

sysctl

    Защита от спуфинга net.ipv4.conf.default.rp_filter = 1

    Проверять TCP-соединение каждую минуту. Если на другой стороне - легальная машина, она сразу ответит. Дефолтовое значение - 2 часа. net.ipv4.tcp_keepalive_time = 60

    Повторить пробу через десять секунд net.ipv4.tcp_keepalive_intvl = 10

    Количество проверок перед закрытием соединения net.ipv4.tcp_keepalive_probes = 5

Debian: борьба с DDoS

По умолчанию ОС Debian и другие ОС не в состоянии поддерживать огромное количество соединений создаваемое ботнетом. Необходимо внести изменения в настройки ядра, чтобы укрепить стек TCP/IP. Пример такой конфигурации:

Net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.core.rmem_max = 996777216 net.core.wmem_max = 996777216 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_mem= 786432 1048576 996777216 net.ipv4.tcp_wmem = 4096 87380 4194304 net.ipv4.tcp_max_orphans = 2255360 net.core.netdev_max_backlog = 10000 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 494967295 kernel.shmall = 268435456 net.core.somaxconn= 16096

Аккуратно меняем конфигурацию ядра и перезагружаем сервер…

FreeBSD: борьба с DDoS

Уменьшаем время ожидания ответного пакета на запрос SYN-ACK (защита от SYN-флуда):

# sysctl net.inet.tcp.msl=7500

Превращаем сервер в черную дыру. Так ядро не будет слать ответные пакеты при попытке подключиться к незанятым портам (снижает нагрузку на машину во время DDoS"а на случайные порты):

# sysctl net.inet.tcp.blackhole=2 # sysctl net.inet.udp.blackhole=1

Ограничиваем число ответов на ICMP-сообщения 50-ю в секунду (защита от ICMP-флуда):

# sysctl net.inet.icmp.icmplim=50

Увеличиваем максимальное количество подключений к серверу (защита от всех видов DDoS):

# sysctl kern.ipc.somaxconn=32768

Включаем DEVICE_POLLING - самостоятельный опрос сетевого драйвера ядром на высоких нагрузках (существенно снижает нагрузку на систему во время DDoS"а):

Пересобираем ядро с опцией «options DEVICE_POLLING»; Активируем механизм поллинга: «sysctl kern.polling.enable=1»; Добавляем запись «kern.polling.enable=1» в /etc/sysctl.conf.

Чтобы не попасть в безвыходное положение во время обрушения DDoS-шторма на системы, необходимо тщательным образом подготовить их к такой ситуации:

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

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

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

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

Spoofed SYN - атака, при которой заголовки пакетов подделывается таким образом, что место реального отправителя занимает произвольный либо несуществующий IP-адрес.

Так как по сути SYN является частым инструментом "интенсивной конкурентной борьбы " и - в то же время - большинство решений DDoS mitigation показывают впечатляющую эффективность именно на этом виде атак, то и мы начнем c SYN-flood, рассмотрев spoofed-вид атаки, как самый грозный из них.

Дисклеймеры

Дисклеймер №1
Все, описанное в этом и последующих топиках – по сути не является know-how. Все методики – открытые, и в то или иное время (некоторые – от 2003 года) были опубликованы в открытых источниках. Я взял на себя труд только свести их в одно и описать «глобальную стратегию » защиты, ориентированную на системных администраторов, обслуживающих небольшие проекты, расположенные на выделенных серверах (описанную стратегию можно применить и в shared-проектах, но реализация будет настолько запредельно ужасной, что писать об этом нет никакого желания)
Дисклеймер №2
В топике не рассматриваются аппаратные решения защиты – во-первых, они отлично рассмотрены в многочисленных статьях производителей этих самых решений, во вторых, проекты, располагающие одним сервером не часто могут себе их позволить (грубо говоря, цена на работающие решения стартует от 20 тысяч евро), в третьих – автор не располагает достаточными данными и опытом по работе с таким специализированным железом, что бы делать глобальные выводы о методах и эффективности такой защиты – навряд ли кому-то интересен обзор решений от двух вендоров из дюжины, не подкрепленный серьезной рабочей статистикой их использования. Но стоит заметить, что оба аппаратных решения, которые мне приходилось использовать, как правило очень эффективны на SYN-атаках при выполнении ряда условий .
Дисклеймер №3
В топике не рассматриваются провайдеры защиты от DDoS-атак – сервис-инженеры этих организаций смогут описать их методы работы лучше и подробнее. Стоило бы, наверное, сделать обзор самих провайдеров как таковых - с точки зрения клиента (в разное время проекты, в которых я принимал участие, были клиентами Dragonara, Blacklotus, Gigenet, Vistnet (в настоящий момент), Prolexic (в настоящий момент) и ряда продавцов услуг вышеперечисленных компаний), но это выбивается из рамок топика, попробуем поговорить об этом позже. Опять же, стоит заметить что все провайдеры защиты, с которыми работают или работали проекты автора, справляются с проблемой SYN-атак, показывая хорошую эффективность.

Немного механики и википедии

Не хотелось бы превращать топик в подобие RFC и цитировать и так всем известные истины, поэтому ограничимся тем, чем интересен TCP с точки зрения SYN-атаки и пробежимся по верхам.

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

В контексте статьи интересно рассмотреть механизм установки TCP-соединения – трехстороннее рукопожатие. В первом приближении на уровне «клиент-сервер» выглядит это вот так: клиент отправляет серверу SYN-пакет, на который отвечает SYN+ACK.Клиент отправляет в ответ ACK на SYN сервера и соединение переходит в состояние установленного.

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

Один в поле

Используй то, что под рукою, и не ищи себе другое – что можно сделать, находясь один на один с атакой? Честно говоря, не многое, но бывает, что хватает и этого. Далее описано, что делать с FreeBSD, так как в наших проектах в 90% случаев используется именно эта система. Впрочем, от ОС к ОС разница будет невелика – принципы одинаковы.

Первое – необходимо получить доступ к серверу (да, в этом тоже может быть сложность, особенно если атака масштабная и/или продолжительная – сервер просто выбрал все буферы или имеет 100% загрузку CPU). Обычно для этого достаточно закрыть атакуемый сервис фаерволом или просто его – сервис – погасить (впрочем, при обнаружении атаки это нужно сделать в любом случае, хотя бы для того, что бы иметь возможность делать на сервере что-то еще).

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

Третье – на интерфейсе, где расположен атакуемый IP-адрес должен остаться только он один. Каждый алиас будет снижать производительность системы. Выражается это в разных числах для разных систем, но числа эти – серьезные, каждый алиас может стоить дополнительных 2-3 тысяч пакетов в секунду.

Четвертое – если вы используете какой-либо фаерволл для входящего трафика по атакуемому адресу – все правила, кроме блокирования, должны быть отключены – к примеру, при spoofed SYN-атаке вероятность того, что вам поможет SYN-proxy от PF стремится к нулю, а CPU это займет очень серьезно.

Пятое – настраиваем систему. Чудес тут не будет, для них нужен рояль в кустах в виде подготовленных драйверов и специально купленных сетевых карт, а единственные две общие рекомендации, которые серьезно отражаются на возможности приема SYN-атаки давно всем известны:
- Размазать обработку прерываний по процессорам сервера;
- Включить syn-cookies и отключить syn-cache.

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

Net.isr.direct=1 kern.ipc.nmbclusters=400000 net.inet.tcp.nolocaltimewait=1 net.inet.tcp.recvspace=16384 net.inet.tcp.sendspace=32768 net.inet.tcp.msl=5000 net.inet.tcp.blackhole=1 net.inet.ip.intr_queue_maxlen=3000 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1 net.inet.icmp.log_redirect=1 net.inet.ip.redirect=0 net.inet.icmp.maskrepl=1 net.inet.tcp.syncookies_only=1 net.route.netisr_maxqlen=4096 kern.ipc.maxsockbuf=83886080 net.inet.ip.intr_queue_maxlen=10240
Система уровня десктопного компьютера, сконфигурированная в соответсвии с данными рекомендациями:

First# netstat -w1 -h -d input (Total) output packets errs idrops bytes packets errs bytes colls drops 260K 0 0 15M 230K 0 13M 0 0
Система уровня IBM System x3630 M3, сконфигурированная в соответсвии с данными рекомендациями:

Second# netstat -w1 -h -d input (Total) output packets errs idrops bytes packets errs bytes colls drops 477K 0 0 36M 457K 0 25M 0 0
Детальные конфигурации ОС и машин, и, собственно, как мы пришли именно к ним - я попробую рассказать в следующем топике.

Одно дело делаем

Что делать помимо тюнинга системы В принципе, есть чем заняться.

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

Если хостер попался понимающий (что действительно большая редкость ) – то работаем по следующему алгоритму - параллелим и блокируем, блокируем и параллелим :
Если у нас есть несколько сетевых карточек (если нет – просим поставить) – включаем их в режим LACP (для этого придется включить аналогичные опции на свитче хостера) – это даст фактически полуторный прирост производительности (отдельные тонкости процесса мы рассмотрим позже - объять необъятное в рамках топика никак не получается) Выходим вот к такой производительности:

Second# netstat -w1 -h -d input (Total) output packets errs idrops bytes packets errs bytes colls drops 1.2M 16K 0 65M 1.1M 0 59M 0 0
Просим заблокировать все неиспользуемые порты и протоколы – SYN-атака может с легкостью сменится UDP-атакой.
На эти действия способен фактически любая хостниг-компания. Но если вам посчастливилось работать с серьезной компанией - попросите заблокировать трафик из региона, где не проживает большая часть аудитории вашего проекта (например, Китай) – обычно это означает анонс блекхола для вашей сети для магистральных провайдеров определенного региона. Как правило, SYN-атака совершается из Азии, ввиду дешевизны и массовости, и, следовательно, такой анонс может серьезно помочь в борьбе с атакой либо вообще исключить ее возможность. Добавить метки