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

Формирование группового трафика с контролем трафика?

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

На уровне приложения пользователи классифицируются как члены группы, каждая группа имеет ограниченную полосу пропускания.

Пример :

Members of group A : 512kbit/s
Members of group B : 1Mbit/s
Members of group C : 2Mbit/s

Когда пользователь подключается к приложению, он извлекает исходный порт для источника запроса от пользователя и отправляет мне исходный порт и полосу пропускания, в которой пользователь должен быть ограничен в зависимости от группы, к которой он принадлежит. С этой информацией я должен добавить соответствующие правила, чтобы пользователь (исходный порт в действительности) был ограничен нужной полосой пропускания.

Если подключающийся пользователь не является членом какой-либо группы, его следует ограничить скоростью полосы пропускания по умолчанию.

На самом деле я управляю этим с помощью самодельного демона, который добавляет или удаляет правила, когда получает запрос от приложения. С моим небольшим знанием tc я не могу ограничивать других пользователей (тех, кто не в группе, фактически всех остальных) со скоростью по умолчанию, и моя конфигурация кажется мне ужасной.

Вот база моих tc qdisc и классов:

tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbps ceil 125mbps

Чтобы классифицировать пользователя с заданной скоростью, мне нужно добавить один подкласс, а затем связать с ним один фильтр:

# a member of group A
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 512kbps ceil 512kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 50001 flowid 1:11

# a member of group A again
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 512kbps ceil 512kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 61524 flowid 1:12

# a member of group B again
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 1000kbps ceil 1000kbps
# tts associated filter to match his source port
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip sport 57200 flowid 1:13

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

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

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

Я ценю любой совет, спасибо.