Я пытаюсь ограничить пропускную способность вывода, создаваемую приложением с 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 кбит / с.
Я также хотел бы знать, есть ли способ упростить мои правила. Я не знаю, можно ли использовать только один класс для каждой группы и связать несколько фильтров с одним и тем же классом, чтобы каждый пользователь мог обрабатываться одним классом, а не одним классом для каждого пользователя.
Я ценю любой совет, спасибо.