Перейти к содержимому
Калькуляторы

Как назначить клиенту раздельные скорости in/out на Linux-шлюзе?

Имеется Линукс-шлюз, требуется настроить на нём шейпер для клиента (каждый клиент в отдельном vlan'e):

 

#!/bin/sh
# This is /etc/network/ifup-post.sh script.

CLIENT_IFACE="$1"        # possible values: ethN, vlanN, ...
CLIENT_ID="${CLIENT_IFACE#vlan}"  # ..convert "vlan15" to "15"
CLIENT_IP="10.20.30.$CLIENT_ID"
PUBLIC_IFACE="eth0"

DEFAULT_HTBCLASS=99

SPEED_IN="2000kbit"  # ..actually taken from billing
SPEED_OUT="5000kbit"

if [ "$1" = "$PUBLIC_IFACE" ]; then
   echo "Pre-setup $PUBLIC_IFACE..."
   tc qdisc add dev $PUBLIC_IFACE root handle 1: htb default $DEFAULT_HTBCLASS
   tc class add dev $PUBLIC_IFACE parent 1: classid 1:1 htb rate 100mbit
   exit
elif [ "$CLIENT_ID" = "$CLIENT_IFACE" ]; then
   exit  # ..not client vlan
fi

# Configure client speed..
iptables -t mangle -A PREROUTING -s $CLIENT_IP -j MARK --set-mark $CLIENT_ID
iptables -t mangle -A PREROUTING -d $CLIENT_IP -j MARK --set-mark $CLIENT_ID
iptables -t mangle -A POSTROUTING -o $PUBLIC_IFACE -m mark --mark $CLIENT_ID -j CLASSIFY --set-class 1:$CLIENT_ID
iptables -t mangle -A POSTROUTING -o $CLIENT_IFACE -m mark --mark $CLIENT_ID -j CLASSIFY --set-class $CLIENT_ID:$CLIENT_ID

tc qdisc add dev $CLIENT_IFACE root handle $CLIENT_ID: htb default $DEFAULT_HTBCLASS
tc class add dev $CLIENT_IFACE classid $CLIENT_ID:$CLIENT_ID htb rate $SPEED_IN
tc class add dev $PUBLIC_IFACE parent 1:1 classid 1:$CLIENT_ID htb rate $SPEED_OUT

 

Скорость проверяю через два wget: один на клиенте качает с внешнего узла, другой на внешнем узле качает с клиента.

Когда запущен один wget - скорость правильная, и входящая, и исходящая.

Когда работают оба сразу - исходящая правильная, входящая проседает в несколько раз.

Выглядит так, будто классы на клиентском интерфейсе неявно вкладываются в дерево классов на внешнем.

Вопрос: как ограничить скорости независимо друг от друга?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Когда работают оба сразу - исходящая правильная, входящая проседает в несколько раз.

Выглядит так, будто классы на клиентском интерфейсе неявно вкладываются в дерево классов на внешнем.

Если забит исходящий канал - входящий тоже будет проседать. ACK-и там всякие и прочая, знаете.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если забит исходящий канал - входящий тоже будет проседать. ACK-и там всякие и прочая, знаете.

Исходящий канал ничем не занят.

Как ни странно, но вроде бы помогло:

tc qdisc add dev $CLIENT_IFACE  parent $CLIENT_ID:$CLIENT_ID sfq
tc qdisc add dev $PUBLIC_IFACE parent 1:$CLIENT_ID sfq

Непонятно, почему при дефолтном pfifo падение скорости было таким непропорциональным и неизменным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если забит исходящий канал - входящий тоже будет проседать. ACK-и там всякие и прочая, знаете.

Исходящий канал ничем не занят.

Как нет?

Ваши же слова: "Когда работают оба сразу - исходящая правильная, входящая проседает в несколько раз."

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.