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

Есть ли способ ограничить пропускную способность для каждого 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 добавить dev eth0 корневой дескриптор 1: htb по умолчанию 12

Создать корневой класс:

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

Эти шаги должны быть выполнены для каждого IP-адреса в диапазоне CIDR с использованием текущего метода (который я надеюсь улучшить):

Для каждого IP-адреса источника необходимо добавить класс:

tc class добавить dev eth0 parent 1: 1 classid 1:10 скорость htb 10mbit ceil 100mbit

tc class добавить dev eth0 parent 1: 1 classid 1:11 скорость htb 10mbit ceil 100mbit

tc class добавить dev eth0 parent 1: 1 classid 1:12 скорость htb 10mbit ceil 100mbit

Для каждого IP-адреса источника необходимо создать фильтр:

tc filter add dev протокол eth0 ip parent 1: 0 prio 1 u32 match ip src 192.168.1.2 flowid 1:10

tc filter add dev протокол eth0 ip parent 1: 0 prio 1 u32 match ip src 192.168.1.3 flowid 1:11

Возможно, нет элегантного способа сделать это, но мы будем очень благодарны за любые советы. Я просмотрел несколько руководств в Интернете, таких как http://lartc.org. Спасибо.

Я думаю, вы могли бы попробовать с хешем, давая одно ведро на IP, чтобы обеспечить равное количество пакетов в секунду на 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