Modify htb
Краткое описание
Добавлен "конструктор" шейпера, в виде шейпера adv_shaper модуля shaper. Требуется для того, чтобы избавиться от pppd_compat, когда необходим только сложный шейпер (htb, несколько классов, несколько фильтров, несколько действий).
Добавлена команда
shaper refresh all
shaper refresh INTERFACE
На основе существующей shaper change, чтобы можно было менять шейперы всем абонентам (одному абоненту) после перезагрузки конфигурации.
Описание полей
секция shaper down-limiter = adv_shaper up-limiter=adv_shaper
секция advanced_shaper и advanced_shaper_up синтаксис (в [] необязательные параметры)
qdisc = htb handle HANDLE parent PARENTID r2q R2Q default DEF_CLASS
qdisc = fq_codel handle HANDLE parent PARENTID [ limit LIMIT ] [ flows FLOWS ] [ quantum QUANTUM ] [ target TARGET ] [ interval INTERVAL ] [ ecn|noecn ]
qdisc = sfq handle HANDLE parent PARENTID perturb PERTURB [ limit LIMIT ] [ quantum QUANTUM ]
qdisc = tbf handle HANDLE parent PARENTID rate RATE burst BURST latency LATENCY
qdisc = ingress handle HANDLE parent PARENTID
class = classid CLASSID parent PARENTID [ rate RATE ] [ burst BURST ] [ cburst CBURST ] [ ceil CEIL ]
filter = net parent PARENTID priority PRIO ip NET src|dst classid CLASSID
filter = net6 parent PARENTID priority PRIO ip6 NET src|dst classid CLASSID
filter = fw parent PARENTID priority PRIO handle HANDLE classid CLASSID
filter = u32 parent PARENTID priority PRIO value VAL mask VAL_MASK offset OFFSET offmask OFFMASK classid CLASSID
action = parent PARENTID priority PRIO pass
action = parent PARENTID priority PRIO police mtu MTU action pass|drop [ mpu MPU ] [ rate RATE ] [ burst BURST ]
qdisc
Дисциплина. Может быть корневой и краевой Первая дисциплина (qdisc) в списке - корневая (root) Остальные - краевые (leaf) По умолчанию Linux ставит pfifo_fast в качестве краевой дисциплины Реализованы дисцпилины:
- htb
- tbf
- sfq
- fq_codel
- ingress
Пример:
qdisc = tbf handle 1:0 parent ffff:ffff rate 10240 burst 10240 latency 50
qdisc = htb handle 1:0 parent ffff:ffff r2q 100 default 1:100
qdisc = sfq handle 2:0 parent 1:10 perturb 10
qdisc = fq_codel handle 3:0 parent 1:100
qdisc = ingress handle ffff:0 parent ffff:fff1
filter fw
Фильтр по fwmark, которую следует добавлять в таблице mangle
iptables -t mangle -A PREROUTING -s XXX.XXX.XXX.XXX/24 -j MARK --set-mark 10
Пример:
filter = fw parent 1:0 priority 60 handle 10 classid 1:10
filter u32
Фильтр u32. Производит сравнение 32-битного значения VAL со значением в пакете со смещением OFFSET, с применением маски VAL_MASK Пример:
filter = u32 parent 1:0 priority 200 value f16de000 mask ffffff00 offset 16 classid 1:10
filter net
Частный случай фильтра u32, который производит сравнение по IP адресу источника или назначения. (Смещение 12 и 16 соответственно) с применением маски Пример:
filter = net parent 1:0 priority 100 ip XXX.XXX.XXX.XXX/24 src classid 1:10
filter net6
Частный случай фильтра u32, который производит сравнение по IPv6 адресу источника или назначения. (Смещение 8 и 24 соответственно) с применением маски Пример:
filter = net6 parent 1:0 priority 500 ip6 fe80::cdef/127 dst classid 1:10
action pass
Пример:
#Exclude packets from policer
filter = net parent ffff:0 priority 50 ip 192.0.2.0/24 dst classid ffff:0
action = parent ffff:0 priority 50 pass
action police
Пример
#Policer that use speed from radius
filter = net parent ffff:0 priority 100 ip 0.0.0.0/0 src classid ffff:0
action = parent ffff:0 priority 100 police rate 0 burst 0 mpu 0 mtu 40960 action drop
Описание параметров
HANDLE, PARENTID, CLASSID, DEF_CLASS - 32-битное число. Записывается в виде шестнадцатеричного числа в формате XXXX:XXXX Пример:
1:100 == 0x00010100
1:0 == 0x00010000
0:1 == 0x00000001
PARENTID для корневой дисциплины требуется указывать ffff:ffff
Если требуется пропустить трафик без шейпера, то в поле фильтра CLASSID следует указывать HANDLE корневой дисциплины. Иначе указывается CLASSID определённого класса.
R2Q для дисциплины htb - параметр r2q, то есть rate to quantum. Требуется подбирать при больших расхождениях пропускной способности между классами и при больших скоростях.
RATE,BURST для дисциплин указывать 0, если требуется брать данные из radius и секции shaper. Если требуется какое-то специфичное значение - указывать в килобитах**.
PRIO - порядковый номер фильтра. Чем меньше - тем раньше будет проверяться. Записывается в виде десятичного числа.
NET - подсеть в формате XXX.XXX.XXX.XXX/YY для IPV4 И любая допустимая запись IPv6 с точки зрения функции inet_pton
NETTYPE - src или dst
VAL, VAL_MASK - 32-битные числа. Записываются в виде шестнадцатеричного числа
ffffffff
00a01000
a01000
ffffff00
OFFSET - смещение от начала пакета. Записывается в виде десятичного числа.
Примеры использования
Пример 1:
[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1
[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 100 default 1:100
class = classid 1:1 parent 1:0 rate 0 burst 0 cburst 0
class = classid 1:100 parent 1:1 rate 0 burst 0 cburst 0
class = classid 1:200 parent 1:1 rate 0 burst 0 cburst 0
class = classid 1:10 parent 1:1 rate 10240 ceil 10240 burst 5120 cburst 5120
qdisc = sfq handle 2:0 parent 1:10 perturb 10
qdisc = fq_codel handle 3:0 parent 1:100
qdisc = tbf handle 4:0 parent 1:200 rate 10240 burst 10240 latency 50
filter = net parent 1:0 priority 100 ip XXX.XXX.XXX.XXX/24 src classid 1:10
filter = net6 parent 1:0 priority 300 ip6 fe80::cdef/24 src classid 1:10
filter = net6 parent 1:0 priority 400 ip6 fe80::cdef/127 src classid 1:10
filter = net6 parent 1:0 priority 500 ip6 fe80::cdef/127 dst classid 1:10
filter = net6 parent 1:0 priority 600 ip6 ::/0 dst classid 1:10
filter = u32 parent 1:0 priority 200 value f16db000 mask ffffff00 offset 16 classid 1:10
filter = fw parent 1:0 priority 50 handle 10 classid 1:0
filter = fw parent 1:0 priority 60 handle 20 classid 1:10
Результат:
✘ ⚡ root@host ~ tc -d qdisc sh dev ppp0
qdisc htb 1: root refcnt 2 r2q 100 default 0x10100 direct_packets_stat 0 ver 3.17 direct_qlen 3
qdisc sfq 2: parent 1:10 limit 127p quantum 1518b depth 127 flows 128/1024 divisor 1024 perturb 10sec
qdisc tbf 4: parent 1:200 rate 81920bit burst 10Kb/1 mpu 0b lat 50.0ms linklayer ethernet
qdisc fq_codel 3: parent 1:100 limit 10240p flows 1024 quantum 1518 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
qdisc ingress ffff: parent ffff:fff1 ----------------
⚡ root@host ~ tc -d class sh dev ppp0
class htb 1:1 root rate 112640Kbit ceil 112640Kbit linklayer ethernet burst 1375Kb/1 mpu 0b cburst 1375Kb/1 mpu 0b level 7
class htb 1:100 parent 1:1 leaf 3: prio 0 quantum 140800 rate 112640Kbit ceil 112640Kbit linklayer ethernet burst 1375Kb/1 mpu 0b cburst 1375Kb/1 mpu 0b level 0
class htb 1:10 parent 1:1 leaf 2: prio 0 quantum 12800 rate 10240Kbit ceil 10240Kbit linklayer ethernet burst 625Kb/1 mpu 0b cburst 625Kb/1 mpu 0b level 0
class htb 1:200 parent 1:1 leaf 4: prio 0 quantum 140800 rate 112640Kbit ceil 112640Kbit linklayer ethernet burst 1375Kb/1 mpu 0b cburst 1375Kb/1 mpu 0b level 0
class tbf 4:1 parent 4:
class tbf 4:1 parent 4:
⚡ root@host ~ tc -d f sh dev ppp0
filter parent 1: protocol ip pref 50 fw chain 0
filter parent 1: protocol ip pref 50 fw chain 0 handle 0xa classid 1:
filter parent 1: protocol ip pref 60 fw chain 0
filter parent 1: protocol ip pref 60 fw chain 0 handle 0x14 classid 1:10
filter parent 1: protocol all pref 100 u32 chain 0
filter parent 1: protocol all pref 100 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol all pref 100 u32 chain 0 fh 800::1 order 1 key ht 800 bkt 0 flowid 1:10 not_in_hw
match c16da000/ffffff00 at 12
filter parent 1: protocol all pref 200 u32 chain 0
filter parent 1: protocol all pref 200 u32 chain 0 fh 805: ht divisor 1
filter parent 1: protocol all pref 200 u32 chain 0 fh 805::1 order 1 key ht 805 bkt 0 flowid 1:10 not_in_hw
match c16db000/ffffff00 at 16
filter parent 1: protocol all pref 300 u32 chain 0
filter parent 1: protocol all pref 300 u32 chain 0 fh 801: ht divisor 1
filter parent 1: protocol all pref 300 u32 chain 0 fh 801::1 order 1 key ht 801 bkt 0 flowid 1:10 not_in_hw
match fe800000/ffffff00 at 8
filter parent 1: protocol all pref 400 u32 chain 0
filter parent 1: protocol all pref 400 u32 chain 0 fh 802: ht divisor 1
filter parent 1: protocol all pref 400 u32 chain 0 fh 802::1 order 1 key ht 802 bkt 0 flowid 1:10 not_in_hw
match fe800000/ffffffff at 8
match 00000000/ffffffff at 12
match 00000000/ffffffff at 16
match 0000cdef/fffffffe at 20
filter parent 1: protocol all pref 500 u32 chain 0
filter parent 1: protocol all pref 500 u32 chain 0 fh 803: ht divisor 1
filter parent 1: protocol all pref 500 u32 chain 0 fh 803::1 order 1 key ht 803 bkt 0 flowid 1:10 not_in_hw
match fe800000/ffffffff at 24
match 00000000/ffffffff at 28
match 00000000/ffffffff at 32
match 0000cdef/fffffffe at 36
filter parent 1: protocol all pref 600 u32 chain 0
filter parent 1: protocol all pref 600 u32 chain 0 fh 804: ht divisor 1
filter parent 1: protocol all pref 600 u32 chain 0 fh 804::1 order 1 key ht 804 bkt 0 flowid 1:10 not_in_hw
Пример 2:
[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1
[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 20 default 1:1
class = classid 1:100 parent 1:0 rate 0 burst 0 cburst 0
class = classid 1:1 parent 1:100 rate 0 burst 0 cburst 0
class = classid 1:10 parent 1:100 rate 10240 burst 5120 cburst 5120
filter = net parent 1:0 priority 100 ip XXX.XXX.XXX.XXX/24 src classid 1:0
filter = net parent 1:0 priority 110 ip YYY.YYY.YYY.YYY/24 src classid 1:0
filter = net parent 1:0 priority 201 ip ZZZ.ZZZ.ZZZ.ZZZ/22 src classid 1:10
filter = net parent 1:0 priority 202 ip WWW.WWW.WWW.WWW/17 src classid 1:10
filter = net parent 1:0 priority 203 ip KKK.KKK.KKK.KKK/31 src classid 1:10
Пример 3:
[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1
[advanced_shaper]
qdisc = tbf handle 1:0 parent ffff:ffff rate 0 burst 0 latency 50
Пример 4:
[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
up-limiter=police
down-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
rate-multiplier=1.1
verbose=1
[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 20 default 1:100
class = classid 1:1 parent 1:0 rate 0 burst 0 cburst 0
class = classid 1:100 parent 1:1 rate 0 burst 0 cburst 0
class = classid 1:10 parent 1:1 rate 10240 burst 5120 cburst 5120
qdisc = sfq handle 2:0 parent 1:10 perturb 10
qdisc = fq_codel handle 3:0 parent 1:100
filter = fw parent 1:0 priority 50 handle 10 classid 1:0
filter = u32 parent 1:0 priority 30 value f16da000 mask ffffff00 offset 12 classid 1:10
Пример 5:
Используем полисер и для download и для upload
[shaper]
attr-down=PPPD-Downstream-Speed-Limit
attr-up=PPPD-Upstream-Speed-Limit
down-limiter=adv_shaper
up-limiter=adv_shaper
down-burst-factor=0.1
up-burst-factor=1.0
verbose=1
[advanced_shaper]
qdisc = htb handle 1:0 parent ffff:ffff r2q 100 default 1:100
filter = net parent 1:0 priority 50 ip XXX.XXX.XXX.XXX/24 src classid 1:0
action = parent 1:0 priority 50 pass
filter = net parent 1:0 priority 100 ip 0.0.0.0/0 src classid ffff:0
action = parent 1:0 priority 100 police rate 0 burst 0 mpu 0 mtu 40960 action drop
[advanced_shaper_up]
qdisc = ingress handle ffff:0 parent ffff:fff1
filter = net parent ffff:0 priority 50 ip XXX.XXX.XXX.XXX/24 dst classid ffff:0
action = parent ffff:0 priority 50 pass
filter = net parent ffff:0 priority 100 ip 0.0.0.0/0 src classid ffff:0
action = parent ffff:0 priority 100 police rate 0 burst 0 mpu 0 mtu 40960 action drop
Результаты:
tc qd sh dev ppp0
qdisc htb 1: root refcnt 2 r2q 100 default 0x10100 direct_packets_stat 96767 direct_qlen 3
qdisc ingress ffff: parent ffff:fff1 ----------------
tc f sh dev ppp0
filter parent 1: protocol all pref 50 u32 chain 0
filter parent 1: protocol all pref 50 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol all pref 50 u32 chain 0 fh 800::1 order 1 key ht 800 bkt 0 flowid 1: not_in_hw
match XXXXXXXX/ffffff00 at 12
action order 1: gact action pass
random type none pass val 0
index 2 ref 1 bind 1
filter parent 1: protocol all pref 100 u32 chain 0
filter parent 1: protocol all pref 100 u32 chain 0 fh 801: ht divisor 1
filter parent 1: protocol all pref 100 u32 chain 0 fh 801::1 order 1 key ht 801 bkt 0 flowid ffff: not_in_hw
match 00000000/00000000 at 12
action order 1: police 0x2 rate 102400Kbit burst 1250Kb mtu 40Kb action drop overhead 0b
ref 1 bind 1
tc f sh dev ppp0 parent root
filter protocol all pref 50 u32 chain 0
filter protocol all pref 50 u32 chain 0 fh 800: ht divisor 1
filter protocol all pref 50 u32 chain 0 fh 800::1 order 1 key ht 800 bkt 0 flowid ffff: not_in_hw
match XXXXXXXX/ffffff00 at 16
action order 1: gact action pass
random type none pass val 0
index 3 ref 1 bind 1
filter protocol all pref 100 u32 chain 0
filter protocol all pref 100 u32 chain 0 fh 801: ht divisor 1
filter protocol all pref 100 u32 chain 0 fh 801::1 order 1 key ht 801 bkt 0 flowid ffff: not_in_hw
match 00000000/00000000 at 12
action order 1: police 0x3 rate 102400Kbit burst 12500Kb mtu 40Kb action drop overhead 0b
ref 1 bind 1
speedtest
Speedtest by Ookla
Latency: 0.50 ms (0.04 ms jitter)
Download: 96.39 Mbps (data used: 43.6 MB )
Upload: 98.92 Mbps (data used: 161.8 MB )
Packet Loss: 0.0%
iperf3 в исключённой сети ~= 700/700 (гигабитный линк и ~= 300 МБит постоянного трафика)
Hi. Looks great. Is it possible to add ipv6 support?
Hi. Looks great. Is it possible to add ipv6 support?
Hi. I'll try later, because I need to build a test bench with ipv6.
- Syntax changed Now you can write parameters in any order Now the syntax has become more similar to tc utility
- filter net6 added