Атака SYN-флуд

Вопрос или проблема

на этой неделе я столкнулся с проблемой на своем веб-сервере. Думаю, мы подвержены атаке SYN flood/DDoS. Но я не знаю, как с этим справиться.
Сначала я подумал, что мне угрожает атака, потому что в команде top я вижу высокую загрузку от php7.4-fpm.service в разных сервисах, таких как web4 и web14. Используя netstat -ano | grep :443 | sort, я получаю много соединений со статусами LAST_ACK, SYN_REC и другими от различных IP-адресов.

$ top
    PID USER     PR  NI    VIRT    RES    SHR S  %CPU  %MEM    TIME+ COMMAND                                                                        
 759641 web18     20   0  396596 205824 109540 R  21.1   2.5   2:40.11 php-fpm7.4                                                                     
 759787 web4      20   0  450736 257260 108088 R  21.1   3.2   3:23.28 php-fpm7.4                                                                     
 759684 web18     20   0  394532 203776 109540 R  20.8   2.5   2:35.94 php-fpm7.4                                                                     
 760606 web18     20   0  394532 203772 109536 R  20.8   2.5   1:01.23 php-fpm7.4                                                                     
 761776 web4      20   0  341148 220732 106252 R  20.8   2.7   0:06.14 php-fpm7.4                                                                     
 761799 web4      20   0  339908 218876 105684 R  20.8   2.7   0:01.62 php-fpm7.4                                                                     
 760391 web4      20   0  451628 260020 108596 R  20.5   3.2   2:14.83 php-fpm7.4                                                                     
 760549 web18     20   0  396580 205816 109532 R  20.5   2.5   1:10.79 php-fpm7.4                                                                     
 761664 web4      20   0  365724 245468 106260 R  20.5   3.0   0:09.73 php-fpm7.4                                                                     
 760122 web4      20   0  450584 258352 107964 R  20.1   3.2   2:42.37 php-fpm7.4                                                                     
 760389 web4      20   0  450944 257820 108420 R  20.1   3.2   2:14.58 php-fpm7.4  
[...]

Мой SYN cookie включен, но у меня все еще много соединений. Я установил конфигурации php7.4 на:

$ nano /etc/php/7.4/fpm/pool.d/web4.conf
[...]
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s;
pm.max_requests = 100
[...]

Согласно статусу php, у меня 300k запросов.

$ systemctl status php7.4-fpm.service 
● php7.4-fpm.service - Менеджер процессов FastCGI PHP 7.4
     Loaded: loaded (/lib/systemd/system/php7.4-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-12-04 16:22:58 -03; 1 day 20h ago
       Docs: man:php-fpm7.4(8)
    Process: 253627 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.4/fpm/pool.d/www.conf 74 (code=exited, >
   Main PID: 253623 (php-fpm7.4)
     Status: "Processes active: 18, idle: 7, Requests: 311986, slow: 0, Traffic: 2.1req/sec"
      Tasks: 26 (limit: 9508)
     Memory: 3.1G
        CPU: 1w 3h 17min 18.062s
     CGroup: /system.slice/php7.4-fpm.service
             ├─253623 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
             ├─746242 php-fpm: pool www
             ├─746824 php-fpm: pool www
             ├─746853 php-fpm: pool www
             ├─760260 php-fpm: pool web18
             ├─760389 php-fpm: pool web4
             ├─760391 php-fpm: pool web4
             ├─760470 php-fpm: pool web18
             ├─760476 php-fpm: pool web18
[...]

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

Я не знаю, как я могу остановить запросы или просто заставить их использовать меньше CPU. Я иногда перезапускаю apache и php-сервис, но запросы продолжаются.

Я думал о том, чтобы поместить UFW в таблицу Fail2Ban, но не знаю, сработает ли это, потому что смотря в ufw.log, я вижу свой IP с множеством UFW DENY, так что я думаю, если я использую это правило, меня тоже заблокируют.

Я использую Linux 5.10.0-17-amd64 #1 SMP Debian 5.10.136-1 Apache/2.4.54

Пока Apache не получит HTTP-запрос, он не будет активировать PHP. Если вы видите влияние на свои процессы PHP, значит, это не SYN flood. Скорее всего, все слоты Apache заняты, и вы видите задержанные соединения.

Я думал о том, чтобы поместить UFW в таблицу Fail2Ban

Не совсем понятно, что вы имеете в виду. Если ваш брандмауэр регистрирует, что он блокирует соединения, какую выгоду вы получите, используя fail2ban для блокировки соединений, которые уже блокируются?

Если вы можете профилировать атаку, либо только из журналов, либо из PHP-кода, вставленного в ваши страницы, то имеет смысл использовать эти данные в качестве источника для fail2ban.

Ответ или решение

Атака SYN Flood: Анализ и Решение Проблемы

В условиях современного Интернета предприятия часто сталкиваются с различными угрозами безопасности, и атака SYN Flood является одной из наиболее распространённых форм DDoS-атак. Данная статья поможет вам понять природу данной атаки, распознать её симптомы и предложит решения для защиты вашего веб-сервера.

Что такое SYN Flood?

Атака SYN Flood направлена на истощение ресурсов сервера с помощью манипуляций с сетевыми соединениями. В процессе обычного TCP-соединения происходит стандартный трёхсторонний обмен (SYN, SYN-ACK, ACK). В случае SYN Flood злоумышленник отправляет множество запросов SYN на сервер, не завершая процесс установки соединения. Это приводит к переполнению таблицы подключения сервера, что, в свою очередь, замедляет его работу или делает его полностью недоступным.

Симптомы атаки SYN Flood

Согласно вашему описанию, вы можете столкнуться с атакой SYN Flood, если наблюдаете следующие признаки:

  1. Высокая загрузка процессов php7.4-fpm.service: Это может указывать на то, что сервер пытается обработать большое количество запросов.
  2. Множество подключений с состоянием LAST_ACK и SYN_REC: Команда netstat -ano | grep :443 | sort показывает, что имеется много подключений, которые не отображаются как установленные.
  3. Необходимость блокировки IP-адресов: Вы упомянули, что блокировка злоумышленников с помощью UFW приводит к появлению новых IP-адресов, что также является характерным знаком атаки.

Анализ и возможность решения проблемы

  1. Настройки PHP-FPM: Ваши настройки pm.max_children (10) могут быть недостаточными для обработки большого объёма запросов. Постарайтесь увеличить это значение, но будьте осторожны, чтобы не исчерпать системные ресурсы, такие как память.

  2. Настройки Apache: Высокая загрузка Apache может указывать на то, что все доступные процессы заняты. Убедитесь, что настройки MaxRequestWorkers и другие параметры соответствуют возможности вашего сервера.

  3. SYN Cookies: Вы отметили, что включили SYN Cookies, что является хорошей практикой для защиты от SYN Flood атак. Однако, имейте в виду, что это может не всегда быть достаточным, если атака очень интенсивная.

  4. Использование Fail2Ban: Попытка интегрировать UFW и Fail2Ban имеет смысл, если эта система будет настроена на блокировку IP-адресов, которые проводят множество неудачных попыток подключения к серверу. Создание отдельного фильтра может помочь вам избежать блокировки такого же IP, с которого вы работаете.

  5. Разграничение трафика: Рассмотрите возможность использования анти-DDoS решений, таких как Cloudflare или другие сетевые решения, которые могут помочь в фильтрации нежелательного трафика до того, как он достигнет вашего сервера.

  6. Мониторинг и анализ: Используйте инструменты мониторинга и анализа трафика, чтобы более точно понять природу вашего трафика и выявить, является ли это обычной нагрузкой или атакой.

Заключение

Атака SYN Flood может серьезно повредить вашему веб-серверу, если её не диагностировать и не пресечь вовремя. Следуя веществам, описанным выше, вы сможете лучше справиться с текущими проблемами и подготовиться к возможным угрозам в будущем. Помните, что профилактика и мониторинг являются ключевыми аспектами защиты систем безопасности.

Оцените материал
Добавить комментарий

Капча загружается...