(Чтобы обойти проблему «дублируется»: я не вижу много запросов. Число довольно мало. Вместо этого каждый запрос загружает много данных.)
Сервер, о котором я говорю, имеет подключение к Интернету 2x10 ГБит / сек, с бэкэндом 40 ГБит / сек. Он обслуживает около 20 ТБ данных для общественности, используя nginx / vsftpd / rsyncd в стабильной системе Debian. Кроме того, apache2 используется для обслуживания некоторого нестатического контента, но на это можно не обращать внимания.
Оборудование достаточно мощное, чтобы обслуживать до 18 Гбит / с (как было замечено однажды), а трафик бесплатный. Поскольку сервер является зеркалом программного обеспечения с открытым исходным кодом и другого общедоступного программного обеспечения, также не проблема простоя, являющегося критической проблемой.
Однако я наблюдаю определенную схему DDoS-атаки, я бы хотел перестать влиять на сервер. Когда атака продолжается, большая часть ISO-образов DVD Debian (около 300 ГБ, т.е. намного больше, чем умещается в ОЗУ) загружается с нескольких хостов, причем загрузка каждого файла повторяется. В зависимости от того, насколько организована атака, это приводит к значительному увеличению пропускной способности и, конечно же, создает некоторую нагрузку на оборудование, в то же время ограничивая возможности легитимных пользователей сервера.
В этих атаках обычно координируются 2–3 сети, каждая из которых загружает файлы, как описано. В большинстве случаев кажется, что хостеры с одним щелчком мыши или кеши файлов какого-либо вида злоупотребляют, их обманом заставляют загружать один и тот же файл снова и снова - и это автоматизируется для загрузки ряда разных файлов в рамках атаки.
Есть ли способ настроить nginx для автоматического запрета определенных диапазонов IP-адресов? Или ограничить скорость трафика, скажем, 1 ГБит / сек для этих сетей (на какое-то время)?
Я не хочу налагать общие ограничения, поскольку сервер действительно должен использоваться даже для высокоскоростной передачи (скорее всего, от зеркала к зеркалу).
В качестве примечания: умный злоумышленник, независимо от мотивации, может начать злоупотреблять FTP / RSYNC вместо HTTP, работая над решениями, которые может дать этот вопрос.
В настоящее время, когда я понимаю, что происходит DDoS-атака, я просматриваю файлы журналов, выявляю сети-нарушители и вручную их блокирую.
На самом деле вы можете использовать Nginx limit_req модуль, а также Nginx limit_conn
Оба модуля могут ограничивать соединения из определенного источника, а также ограничивать запросы, сделанные с IP-адресов, и это в вашем случае может быть очень полезно.
Согласно reuqest, nginx также можно использовать для ограничения пропускной способности.
location ^~ /videos/ {
...
limit_rate_after 100m;
limit_rate 150k;
...
}
в этом примере limit_rate_after 100m;
nginx будет (помните об этом для каждого подключения пользователя) соединение дроссельной заслонки до макс. 150k
. Так, например, если вам нужно разрешить до 100 м полной полосы пропускания, а затем ограничить скорость, это может вам помочь.
Имейте в виду, что это решение ограничивает скорость загрузки nginx на одно соединение, поэтому, если один пользователь откроет несколько видеофайлов, он сможет загрузить 150 КБ, умноженное на количество подключений к видеофайлам. Если вам нужно установить ограничение на количество подключений, вы сможете сделать это с помощью limit_zone и limit_conn директивы. Пример:
Внутри конфигурации вашего серверного блока:
limit_rate 128K; limit_zone one $binary_remote_addr 10m;
Внутри конфигурации вашего блока местоположения:
limit_conn one 10;
В этом примере это позволит 10 подключений на IP по 1 Мбит каждый.
Вы можете использовать fail2ban с конфигурационным сканированием журналов доступа nginx. В Интернете есть множество руководств, которые помогут в этом.
Очень сложно заблокировать такие атаки без специального программного обеспечения / оборудования, которое распознает шаблоны. Вы, вероятно, могли бы использовать какой-то черный список, хотя я не уверен, что он подходит для вашего варианта использования.
Другое решение - использовать какую-то стену javascript, которая блокирует загрузку, если браузер не использует javascript, но это плохая практика и блокирует законных пользователей с помощью curl / wget.