Я пытаюсь настроить базовую классификацию трафика, чтобы ограничить максимальную пропускную способность входящего трафика для каждой машины в моей локальной сети до 3 Мбит / с. Я использую шлюз 192.168.2.1, где интерфейс eth1
подключен к коммутатору, чтобы обеспечить подключение к Интернету для хостов на 192.168.2.0/24
.
Классификация проста: входящий трафик классифицируется на два класса, первый класс. 1:20
для неклассифицированного трафика по умолчанию используется как резерв, второй класс 1:30
ограничит входящую полосу пропускания до 3 Мбит / с. Затем я использую tc filter
для классификации трафика, исходящего от каждого хоста, как класса 1:30
.
# Clear the qdisc first.
tc qdisc del root dev eth1
# Set a HTB qdisc on the root, and use class 1:20 by default
tc qdisc add dev eth1 root handle 1: htb default 20
# Create class 1:1, limit the total ingress bandwidth to 8 Mbps.
tc class add dev eth1 parent 1: classid 1:1 htb rate 8mbit burst 15k
# Class 1:20
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 5mbit ceil 5.5mbit burst 15k
# Class 1:30
tc class add dev eth1 parent 1:1 classid 1:30 htb rate 3mbit ceil 4mbit burst 15k
# Attach fq_codel w/ ECN on each class to control latency / bufferbloat.
tc qdisc add dev eth1 parent 1:20 handle 20: fq_codel ecn
tc qdisc add dev eth1 parent 1:30 handle 30: fq_codel ecn
# Match the LAN range and classify them as class 1:30
tc filter add dev eth1 parent 1: protocol ip prio 2 u32 match ip src 192.168.2.0/24 flowid 1:30
Однако правило работает не так, как задумано. Скорость загрузки для хостов по-прежнему превышает пропускную способность, указанную в 1:20
не 1:30
. В чем моя ошибка?
Какая у вас версия ядра?
Я пытаюсь настроить подобное, и у меня возникает сильное чувство, что ядро debian 4.15.0-23-generic сломано. Проблема не в самом HTB, а в том, чтобы классифицировать пакеты по правильному классификационному потоку.
Даже этот обучающий пример не работает:
tc qdisc add dev int0 root handle 1:0 htb r2q 100000 default 13
tc class add dev int0 parent 1:0 classid 1:1 htb rate 10Gbit
tc class add dev int0 parent 1:1 classid 1:11 htb rate 1Gbit ceil 2Gbit
tc class add dev int0 parent 1:1 classid 1:12 htb rate 1Gbit ceil 2Gbit
tc class add dev int0 parent 1:1 classid 1:13 htb rate 1Gbit ceil 2Gbit
когда делать
tc -s -d filter show dev int0
Вы видите, что все пакеты проходят правильно через 1:13
но если вы это сделаете
iptables -t mangle -A POSTROUTING -j MARK --set-mark 11
tc filter add dev int0 parent 1:0 protocol ip handle 11 fw flowid 1:12
работает странным образом, только несколько пакетов каждые несколько минут идут, как ожидалось, другие по-прежнему проходят по умолчанию
следующий пример попытки классификации:
ipset create SHAPER4 hash:net family inet skbinfo
ipset add SHAPER4 10.0.0.0/8 skbprio 1:12
iptables -t mangle -A POSTROUTING -j SET --map-set SHAPER4 src,dst --map-prio
работает так же (кажется, что статистически больше пакетов идет правильно, чем в предыдущем примере)
В журналах нет ошибок или предупреждений, просто работайте так
tc -s -d class show dev int0
class htb 1:13 parent 1:1 prio 0 quantum 1250 rate 1Gbit ceil 10Gbit
linklayer ethernet burst 1375b/1 mpu 0b overhead 0b cburst 0b/1 mpu 0b
overhead 0b level 0
Sent 74139067325 bytes 53655936 pkt (dropped 0, overlimits 48986938 requeues 0)
backlog 0b 0p requeues 0
lended: 41808373 borrowed: 11847563 giants: 0
tokens: -81 ctokens: -4
class htb 1:11 parent 1:1 prio 0 quantum 1000 rate 10Mbit ceil 100Mbit
linklayer ethernet burst 1600b/1 mpu 0b overhead 0b cburst 1600b/1 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended: borrowed: 0 giants: 0
tokens: 20000 ctokens: 20000
class htb 1:12 parent 1:1 prio 0 quantum 1000 rate 5Mbit ceil 30Mbit
linklayer ethernet burst 1600b/1 mpu 0b overhead 0b cburst 1593b/1 mpu 0b
overhead 0b level 0
Sent 4704 bytes 48 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended: 48 borrowed: 0 giants: 0
tokens: 37550 ctokens: 6247
Какой-то сетевой разработчик ядра здесь?
Я попробую другие версии, прежде чем сообщать об этом :)
tc работает над загрузкой. Поэтому, если вы хотите сформировать входящий трафик, вам нужно разместить правила в интерфейсе локальной сети.
Предполагая, что вы это делаете, ваше правило должно соответствовать адресату 192.168.2.0/24, а не источнику.