Есть ли способ ограничить пропускную способность на ip, используя HTB + диапазон CIDR в Linux?

Я могу создать правила, чтобы ограничить всю подсеть или ограничить отдельные IP-адреса с помощью tc и htb. Я хочу использовать диапазоны CIDR, чтобы сохранить элегантность.

Все рассматриваемые машины работают под управлением CentOS 7. Я пытался использовать tc + htb для достижения этой цели, но я открыт для других инструментов, если есть лучший метод.

Моя цель - ограничить диапазон CIDR и назначить индивидуальные ограничения для каждого IP-адреса источника.

Например, установите глобальный предел для 192.168.1.0/24 равным 100 Мбит / с, и каждый исходный IP-адрес в пределах 192.168.1.0/24 имеет индивидуальный предел загрузки 10 Мбит / с, который не может быть превышен.

Вот рабочий пример того, что я делаю для каждого ip(глядя на упрощение процедуры, если это возможно):

Эти шаги нужно выполнить только один раз:

Создайте исходный HTB qdisc:

tc qdisc add dev eth0 root handle 1: htb default 12

Create root class:

tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit

These steps must be performed for each IP in the CIDR range using current method (what I am looking to hopefully improve):

A class must be added for each source ip:

tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit ceil 100mbit

tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10mbit ceil 100mbit

tc class add dev eth0 parent 1:1 classid 1:12 htb rate 10mbit ceil 100mbit

A filter must be created for each source ip:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.2 flowid 1:10

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.3 flowid 1:11

It may be that there is no elegant way to do this, but any tips / advice would be greatly appreciated. I have looked through several guides online such as http://lartc.org/. Спасибо.

1 ответ

Я думаю, что вы могли бы попробовать с хешем, давая один сегмент на ip, чтобы обеспечить равное количество pps на ip. Вам также следует использовать sfq qdisc, поскольку htb не справедлива.

tc qdisc add dev eth0 root handle 1: htb default 12
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
# Here, you want a fair qdisc
tc qdisc add dev eth0 parent 1:1 handle 101: sfq perturb 10
# Put a range in the filter
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 192.168.1.0/24 flowid 1:1
# Create 254 bucket, each ip src will be attached to one bucket
tc filter add dev eth0 parent 1:1 protocol ip handle 10 flow hash keys nfct-src divisor 254

Привет, вы можете найти здесь: Классификатор меток брандмауэра Linux (tc-fw) не работает после обновления до Debian9 - рабочая конфигурация ядра 4.19 для вашей задачи.

Бр, Николай

Другие вопросы по тегам