Ограничить сетевую пропускную способность

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

Кратко: Я ищу способ ограничения сетевой активности:

  • Linux
  • Меня устраивает как скорость в Мбит/с, так и количество пакетов/с (предпочтительно, если возможно оба варианта)
  • Ограничение может быть введено как на уровне интерфейса, так и для IP или процесса (предпочтительно, если возможны все варианты)
  • Ограничить пропускную способность без потери пакетов
  • Сильно предпочитаю “стандартные” решения (встроенные в ядро, systemd или широко распространенные инструменты пользовательского пространства)

У меня есть два сервера на Linux, которые много взаимодействуют друг с другом, и хостинг-провайдер иногда помечает этот трафик как DDOS и блокирует нас на несколько часов. Я хочу внедрить программное ограничение скорости, чтобы решить эту проблему. Это можно сделать либо на уровне сетевого адаптера, либо на уровне выполнения/инкапсуляции процесса.

Я смотрел на systemd и ulimit, но не кажется, что они предлагают ограничение пропускной способности сети. Я видел, что можно изменить скорость сетевого адаптера, но это слишком грубо: 10/100/1000 Мбит/с, если только нельзя настроить произвольные значения?

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

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

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

Ограничение сетевой пропускной способности на Linux

Ограничение сетевой пропускной способности является важной задачей для администрации систем, особенно в случаях, когда необходимо предотвратить блокировку систем провайдером за «DDOS-атаку». В данной статье будет рассмотрено несколько стандартных и распространённых методов ограничения пропускной способности на серверах под управлением операционной системы Linux, которые удовлетворяют запросам пользователя.

Преимущества ограничений сети

  1. Устойчивость к блокировкам: Ограничив скорость передачи данных, можно избежать ненужных блокировок со стороны хостинг-провайдера.
  2. Эффективное управление ресурсами: Позволяет более рационально использовать доступные сетевые ресурсы.
  3. Поддержка QoS: Улучшение качества обслуживания для критически важных приложений.

Стандартные решения для ограничения пропускной способности

  1. tc (Traffic Control)

    Утилита tc, входящая в пакет iproute2, отвечает за тонкое управление сетевым трафиком и может быть использована для ограничения пропускной способности как на уровне интерфейса, так и на уровне IP-адресов.

    Пример настройки ограничений с помощью tc:

    # Ограничение на интерфейсе eth0 до 1 Mb/s
    tc qdisc add dev eth0 root handle 1: htb default 12
    tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
    tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.1 flowid 1:1

    В приведённом примере мы ограничиваем трафик с IP-адреса 192.168.1.1 до 1 Mb/s. Используя tc, вы можете детализировать фильтрацию по IP-адресам или протоколам, а также можно задать ограничения по пакетам в секунду.

  2. iptables с hashlimit

    Утилита iptables может также использоваться для ограничения пропускной способности путем установления условий на количество соединений или передачу пакетов.

    iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-name http --hashlimit-mode srcip --hashlimit-upto 1/sec -j ACCEPT
    iptables -A INPUT -p tcp --dport 80 -j REJECT

    Этот пример ограничивает входящий трафик на 1 пакете в секунду с одного источника для порта 80.

  3. cgroups (Контейнеры)

    Если вы работаете с процессами, то можно рассмотреть использование cgroups, которые позволяют ограничивать ресурсы (включая сетевые) для групп процессов.

    Пример настройки:

    # Создание cgroup
    cgcreate -g net_cls:/mygroup
    echo 0x10001 > /sys/fs/cgroup/net_cls/mygroup/net_cls.classid
    
    # Помещаем процесс в cgroup
    cgclassify -g net_cls:/mygroup <pid>

    С помощью данного метода можно ограничить сетевые ресурсы на уровне процессов.

Подводя итоги

Каждый из представленных методов предоставляет возможности для ограничения сетевой пропускной способности без потери пакетов и с использованием надежных и стандартных инструментов, которые уже встроены в ядро Linux или доступны через широко используемые утилиты. tc предлагает самый широкий функционал для тонкой настройки, тогда как iptables позволяет реализовать ограничение по количеству пакетов. cgroups идеально подойдет для управления ресурсами на уровне процессов.

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

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

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