Следующая ситуация:
Что делать:
Шлюз-маршрутизатор - это Linux-системы с двумя интерфейсами. Я понял, что могу использовать tc для настройки формирования трафика.
Мои команды:
sudo tc qdisc add dev eth0 handle 1: root tbf rate 300000 burst 500000 latency 1ms
В результате спидтест с iperf дал мне 265 Кбит / сек.
Вопрос: Как я могу установить правильные правила tc для ограничения трафика для каждого клиента и приоритизации TCP ACK?
Было бы так много вопросов, о которых нужно спросить, чтобы правильно ответить, и так много возможных имплементаций, что я просто сделаю некоторые предположения и предложу одно решение, которое вы можете изменить позже.
Вы можете использовать флаги TCP и conntrack, машину подключения в ядре Linux, чтобы определить, какие соединения являются соединениями B и A tcp. Затем вы можете пометить их на соединительной машине с помощью CONNMARK
цель. Так и с -j CONNMARK --restore-mark
target, когда пакет в этом соединении идет в направлении от A к B, он будет помечен как 100.
Сторона TC, я использую htb как классный QDISC. Класс HTB будет отбрасывать пакеты, если трафика слишком много. fq_codel используется как очередь. fq_codel организует очереди в каждом классе.
Пакет отправки корневого htb qdisc, не помеченный как класс 1: 1000. Маркированные пакеты будут идти в соотношении 1: 100. tc filter
используется для распознавания помеченных 100 пакетов и отправки их в класс 1: 100.
tc class
используется для установки ограничения пропускной способности.
В следующем коде предполагается, что ваша максимальная пропускная способность составляет 1 Мбит / с, ваш сетевой интерфейс B - eth0, ваша сеть A - eth1, а ваш уровень - ethernet.
# Spread connmark to mark
iptables -t mangle -A POSTROUTING -o eth0 -j CONNMARK --restore-mark
# New TCP connections from B to A : connmark 100
iptables -t mangle -A POSTROUTING -o eth1 -p tcp --syn -m state --state NEW -j CONNMARK --set-mark 100
# Interface : eth0, qdisc : htb, default leaf : 1000
tc qdisc add dev eth0 root handle 1:0 htb default 1000
# Interface eth0, parent branch node : 1:0, branch id : 1:10
tc class add dev eth0 parent 1:0 classid 1:10 htb rate 1000kbit ceil 1000kbit
# CLASS - B to A TCP branch
tc class add dev eth0 parent 1:10 classid 1:100 htb rate 700kbit ceil 1000kbit burst 5k prio 0 linklayer ethernet
# QDISC - Queue
tc qdisc add dev eth0 parent 1:100 handle 110: fq_codel
# FILTER - Filter
tc filter add dev eth0 parent 1:0 protocol ip prio 0 handle 100 fw flowid 1:100
# CLASS - Default branch
tc class add dev eth0 parent 1:10 classid 1:200 htb rate 300kbit ceil 500kbit burst 5k prio 7 linklayer ethernet
# QDISC - default branch queue
tc qdisc add dev eth0 parent 1:1000 handle 1010: fq_codel
Возможно, я не так ясен, как хотел бы, чтобы ответить Б. Спросите меня все, что вы не понимаете.