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

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

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

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

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

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

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

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

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

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

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

1. Использование tc (Traffic Control)

tc, входящий в пакет iproute2, является стандартным инструментом для настройки QoS (Quality of Service) в Linux и позволяет вам управлять трафиком, а также устанавливать пределы на пропускную способность.

Установка и базовая настройка

  1. Установите необходимые пакеты (если еще не установлены):

    sudo apt-get install iproute2
  2. Создайте базовую иерархию для управления трафиком:

    # Удалите все старые настройки
    sudo tc qdisc del dev eth0 root
    
    # Добавьте корневую очередь с параметрами по умолчанию
    sudo tc qdisc add dev eth0 root handle 1: htb default 12
  3. Создайте класс с ограничением пропускной способности:

    # Ограничьте общий трафик до 1Mb/s
    sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit
    
    # Создайте класс для низкой приоритетности (если необходимо)
    sudo tc class add dev eth0 parent 1:1 classid 1:12 htb rate 512kbit ceil 1mbit

Ограничение по IP-адресу или процессу

Чтобы ограничить трафик по IP-адресу, вы можете использовать фильтры tc:

sudo tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 192.168.1.100 flowid 1:12

Таким образом, трафик, идущий к указанному IP-адресу, будет ограничен до 512 Kb/s.

Ограничение по количеству пакетов

Если требуется ограничить количество пакетов в секунду, вы можете использовать rate:

sudo tc qdisc add dev eth0 root handle 2: netem rate 1000kbit delay 100ms

Это обеспечит определенную задержку и ограничение на количество передаваемых пакетов.

2. Использование iptables

Для более детальной настройки можно использовать iptables в связке с tc. К примеру, можно оставить работу iptables, но не сбрасывать пакеты, а просто пометить их:

sudo iptables -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 1

И затем использовать tc для ограничения трафика, помеченного данной меткой.

3. Использование systemd для управления процессами

Если ваша задача включает управление пропускной способностью на уровне процессов, вы можете рассмотреть использование компонентов systemd, таких как slice, для ограничения ресурсов (но это ограничит CPU и память, а не сеть напрямую).

Для сетевой пропускной способности специфично решение tc и iptables будет более подходящим.

Заключение

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

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

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