Назад | Перейти на главную страницу

Могу ли я ограничить передачу данных в течение определенного периода времени для каждого IP-адреса?

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

Поэтому мне интересно, есть ли что-нибудь, доступное для Apache или даже для всей системы Ubuntu, что налагает ограничения на IP-адрес? Например, передача 10 ГБ за 24 часа. Когда лимит будет достигнут, клиенту будет предоставлена ​​облегченная страница «Запрещено - достигнута квота» или ему будет прямо отказано в подключении. Я осмотрелся и не нашел ничего, кроме различных решений по регулированию, которые могут помочь, но не решат проблему.

Здесь описан модуль квот iptables: http://ipset.netfilter.org/iptables-extensions.man.html#lbBT

quota
    Implements network quotas by decrementing a byte counter with each
    packet. The condition matches until the byte counter reaches zero.
    Behavior is reversed with negation (i.e. the condition does not match
    until the byte counter reaches zero).

    [!] --quota bytes
           The quota in bytes.

Я не думаю, что это поможет вам, поскольку, используя этот метод, вам, вероятно, придется создавать отдельные правила квот для каждого возможного исходного IP-адреса, который может поступать на ваш сервер (что практически невозможно). Вам также потребуется интегрировать какую-то автоматизацию сценария BASH для сброса этих квот каждые 24 часа (или в любой другой период), как упоминалось здесь: Квота трафика IPtables - вверх и вниз

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

Единственная другая альтернатива, которая, как я знаю, будет работать лучше (на мой взгляд), - это использование модуля iptables hashlimit в сочетании с tc (формирование трафика / контроль): http://ipset.netfilter.org/iptables-extensions.man.html#lbAY - при таком подходе трафик только замедляется, но никогда не блокируется. Причина, по которой это может быть более осуществимо, заключается в том, что модуль iptables hashlimit может обрабатывать отслеживание клиентов на лету, записывая отдельные «хэш-ключи» IP-адреса и / или порта источника / назначения, когда они поступают на ваш сервер. Я опубликовал ответ о том, как этого добиться, на другой связанный с этим вопрос, здесь: https://serverfault.com/a/754116/30506 - но в итоге вы создаете класс формирования трафика (ограничитель пропускной способности, установленный, скажем, на 5 Мбит / с), а затем, когда скорость пакетов для сеансов каждого клиента достигает определенного порога, вы начинаете направлять их пакеты в этот класс, тем самым усмиряя их трафик . Однако в вашем случае умиротворение должно быть настроено так, чтобы работать в течение нескольких часов, а не секунд.

Привет и добро пожаловать в Server Fault!

Ограничение пропускной способности может быть выполнено с помощью iptables и limit модуль.

Можно найти очень хорошее введение в это Вот

Небольшой пример из этой ссылки для настройки увеличения пропускной способности:

$ sudo iptables --flush  # start again
$ sudo iptables --new-chain RATE-LIMIT
$ sudo iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT
$ sudo iptables --append RATE-LIMIT --match limit --limit 50/sec --limit-burst 20 --jump ACCEPT
$ sudo iptables --append RATE-LIMIT --jump DROP

Престижность авторам Уиллу Сьюэллу и Джиму Фишеру упомянутой статьи!