QOS с iptables и tc с нестабильной WAN

У меня есть маршрутизатор / шлюз под Linux, я хочу добавить немного QoS, чтобы зарезервировать полосу пропускания для определенного потока. Это можно сделать с помощью iptables / netfilter и tc, но все примеры начинаются с того факта, что вам заранее известна общая доступная пропускная способность.

Проблема в том, что моя глобальная сеть - это подвижное соединение 3G с переменной производительностью. В первый день я могу иметь 5 Мбит / с, а в дождливый день 2 - до 2 Мбит / с. Как я могу гарантировать, что для моего потока 1 всегда будет доступно 100 Кбит / с с низкой задержкой?

Я подумал о сложном решении, с ежедневным или ежечасным сценарием для проверки пропускной способности и динамического создания и применения сценариев QoS, но для меня это не лучшее решение.

1
задан 10 March 2016 в 17:44
1 ответ

Вы должны быть в состоянии достичь своей цели с планировщиком hfsc. У вас будет возможность зарезервировать часть полосы пропускания и дать гарантию низкой латентности "в реальном времени", остальные классы пропорционально заполнят остальную часть полосы пропускания "линкшер".

Здесь важно использовать реальное время, а не линкшер, потому что в реальном времени, чтобы быть уверенным, что сможет послать пакет в самые последние миллисекунды, другой класс сможет остановить отправку пакета.

Для того, чтобы выполнить то, что вы хотите, вам нужно установить путь к высокому верхнему ограничению на корневом классе (возможно, 10MB), но не к верхнему ограничению на листовом классе. Из-за того, как hfsc linkshare разделяет полосу пропускания между всеми классами "ls", они будут разделять доступную полосу пропускания сверх значения m2, если их больше.

Например, вы можете использовать такую установку :

# dns, ntp, teamspeak
iptables -t mangle -A POSTROUTING -o eth0 -p udp -m multiport --dports 53,123,9987 -j CLASSIFY --set-class 1:100
# Default tcp
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -j CLASSIFY --set-class 1:200
# Default udp
iptables -t mangle -A POSTROUTING -o eth0 -p udp -j CLASSIFY --set-class 1:300

# ROOT QDISC - default goes on class 100 because it's probably arp gratuitous or whois since all ip traffic is already classified
tc qdisc add dev eth0 root handle 1:0 hfsc default 100

# ROOT CLASS - Interface eth0, noeud parent de la branche : 1:0, id de la branche : 1:10
tc class add dev eth0 parent 1:0 classid 1:10 hfsc ls m2 10000kbit ul m2 10000kbit

# CLASS 100 - VOIP, DNS, NTP
tc class add dev eth0 parent 1:10 classid 1:100 hfsc sc m1 400kbit d 10ms m2 100kbit
# QDISC
tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel quantum 300 noecn # fq_codel requires to change the quantum for low bandwitdth

# CLASS 200 - some tcp
tc class add dev eth0 parent 1:10 classid 1:200 hfsc ls m1 80kbit d 10ms m2 80kbit
# QDISC - some tcp
tc qdisc add dev eth0 parent 1:200 handle 210: fq_codel

# CLASS 300 - some udp
tc class add dev eth0 parent 1:10 classid 1:300 hfsc ls m1 20kbit d 10ms m2 20kbit # ratio tcp / udp will then be 4:1
# QDISC - some udp
tc qdisc add dev eth0 parent 1:300 handle 310: fq_codel quantum 300 noecn

Значения могут быть изменены в соответствии с вашими потребностями, особенно в классе 100, хотя я пытался записать эти числа, чтобы они соответствовали вашему 3G.

Вам следует прочитать больше о man tc-hfsc, этом посте, и этой статье, чтобы узнать больше о hfsc и как он работает.

.
1
ответ дан 3 December 2019 в 23:49

Теги

Похожие вопросы