Jump to content
Калькуляторы

Как назначить клиенту раздельные скорости 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 - скорость правильная, и входящая, и исходящая.

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Если забит исходящий канал - входящий тоже будет проседать. 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 падение скорости было таким непропорциональным и неизменным.

Share this post


Link to post
Share on other sites

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

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

Как нет?

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this