
Я размещаю на своем сайте несколько относительно больших файлов, и мне пришло в голову, что было бы тривиально, если бы кто-то создал скрипт, который бы постоянно их загружал, переваривая передачу данных и обходясь мне в кругленькую сумму. Ваше типичное домашнее соединение было бы достаточно быстрым, чтобы доставить мне неприятности, если бы оно загружалось круглосуточно, не говоря уже о сверхбыстром оптоволоконном соединении или надлежащем удаленном сервере.
Так что мне интересно, есть ли что-то доступное для Apache или даже для всей системы Ubuntu, что будет накладывать ограничения на IP-адрес? Например, 10 ГБ передачи в течение 24 часов. Когда лимит будет достигнут, клиенту будет выдана облегченная страница «запрещено — квота достигнута» или ему будет отказано в подключении. Я поискал вокруг и не нашел ничего, кроме различных решений по регулированию, которые могут помочь, но не решат проблему.
решение1
Модуль квот 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, которые могли бы это сделать — требуются дополнительные исследования).
Единственная альтернатива, которая, как я знаю, будет работать лучше (по моему мнению), — это использование модуля hashlimit iptables в сочетании с tc (формирование/контроль трафика):http://ipset.netfilter.org/iptables-extensions.man.html#lbAY- при использовании этого подхода трафик только замедляется, но никогда не блокируется. Причина, по которой это может быть более осуществимо, заключается в том, что модуль hashlimit iptables может обрабатывать отслеживание клиентов на лету, записывая отдельные IP-адреса и/или порты источника/назначения "хэш-ключи", когда они поступают на ваш сервер. Я опубликовал ответ о том, как этого добиться, на другой связанный вопрос, здесь:https://serverfault.com/a/754116/30506- но вкратце, вы создаете класс формирования трафика (ограничитель пропускной способности, зафиксированный, скажем, на 5 Мбит/с), а затем, когда скорость пакетов сеансов на клиента достигает определенного порога, вы начинаете направлять их пакеты в этот класс, тем самым успокаивая их трафик. Однако в вашем случае успокоение должно быть настроено на работу в течение часов, а не секунд.
решение2
Здравствуйте и добро пожаловать в 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
Честь и хвала авторам упомянутой статьи Уиллу Сьюэллу и Джиму Фишеру!