Назад | Перейти на главную страницу

Как установить общий сетевой лимит для каждого клиента + приоритет для подтверждений TCP

Следующая ситуация:

Что делать:

Шлюз-маршрутизатор - это 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

Возможно, я не так ясен, как хотел бы, чтобы ответить Б. Спросите меня все, что вы не понимаете.