Есть ли способ ограничить пропускную способность на 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 для вашей задачи.
Бр, Николай