Перейти к содержимому
Калькуляторы
1 час назад, x86 сказал:

Простой ответ - никак.

Сложный - используйте u32, но это все-равно не даст всех возможностей iptables.

 

А как тогда классифицировать трафик? Веди при использовании suricata используется iptables. А ifb не работает с iptables?

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


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


#!/bin/bash

TARIFS_DB="/srv/billing/tarrifs.txt"

if ls $TARIFS_DB 2>/dev/null >/dev/null
then
    true
else
    echo "ERROR: Tarif database not found."
    exit 4
fi

ACTION=$1
U=$2
CLS=$3

# Avaible tarifs
# Format:
# <tarif_name>=<tc-class>=<tarif_speed>

# TARIFS='
# Default=1:1=2500M
# Tresh=1:16=32M
# Ultra=1:11=16M
# Maxi=1:12=8M
# Mini=1:13=2M
# Nano=1:14=1M
# Micro=1:15=512K
# Minimal=1:64=64K
# '

TARIFS="$(cat $TARIFS_DB)"

case $ACTION in
enable)
    IFACES=$(ip netns exec $U cat  /proc/net/dev|awk '{print $1}'|sed '1d'|sed '1d'|tr -d ':'|sed '/lo/d'|sed '/ovs-system/d')
    for a in $IFACES
    do
        ip netns exec $U /sbin/tc qdisc del dev $a root handle 1:

        ip netns exec $U /sbin/tc qdisc add dev $a root handle 1: htb default 1 r2q 1
        for b in $(echo $TARIFS)
        do
                        TARRIF=$(echo $b|tr '=' ' '|awk '{print $1}')
            CLASS=$(echo $b|grep $TARRIF|tr '=' ' '|awk '{print $2}')
            SPEED=$(echo $b|grep $TARRIF|tr '=' ' '|awk '{print $3}')
                ip netns exec $U /sbin/tc class add dev $a parent 1: classid $CLASS htb rate ${SPEED}bit quantum 8000 burst 8
        done

#        ip netns exec $U /sbin/tc class add dev $a parent 1: classid 1:11 htb rate ${Ultra}bit quantum 8000 burst 8
#        ip netns exec $U /sbin/tc class add dev $a parent 1: classid 1:12 htb rate ${Maxi}bit quantum 8000 burst 8
#            ip netns exec $U /sbin/tc class add dev $a parent 1: classid 1:13 htb rate ${Mini}bit quantum 8000 burst 8
#            ip netns exec $U /sbin/tc class add dev $a parent 1: classid 1:14 htb rate ${Nano}bit quantum 8000 burst 8
    done
    ;;
disable)
        IFACES=$(ip netns exec $U cat /proc/net/dev|awk '{print $1}'|sed '1d'|sed '1d'|tr -d ':'|sed '/lo/d'|sed '/ovs-system/d')
        for a in $IFACES
        do
                ip netns exec $U /sbin/tc qdisc del dev $a root handle 1:
        done
        ;;
class)
    for a in $(echo $TARIFS)
    do
        if [ "$CLS" == "$(echo $TARIFS|tr ' ' '\n'|grep $CLS|tr '=' ' '|awk '{print $1}')" ]
        then
            true
        else
            echo "ERROR: Tarif not found. Please contact developer to add new tarif."
            exit 1
        fi
        CLASS=$(echo $a|grep $CLS|tr '=' ' '|awk '{print $2}')
        if [ "$CLASS" != "" ]
        then
            break
        else
            true
        fi
    done
    for a in $(ip netns exec $U iptables -t mangle -L -v --line-numbers|grep CLASSIFY|cut -d' ' -f1)
    do
        ip netns exec $U iptables -t mangle -D FORWARD 1
    done
    ip netns exec $U iptables -t mangle -A FORWARD -i ${U}0p1 -j CLASSIFY --set-class $CLASS
        ip netns exec $U iptables -t mangle -A FORWARD -o ${U}0p1 -j CLASSIFY --set-class $CLASS
    ;;
tarifs)
    echo "Available tarifs:"
    printf "Tarif:\tClass:\tSpeed:\t\n"
    for a in $(seq 0 32)
    do
        printf "="
    done
    printf "\n"
    for a in $(echo $TARIFS)
    do
        TR=$(echo $a|tr '=' ' '|awk '{print $1}')
                CLS=$(echo $a|tr '=' ' '|grep  ":"|awk '{print $2}')
                SPD=$(echo $a|tr '=' ' '|grep  "M"|awk '{print $3}')
        printf "$TR\t$CLS\t$SPD\t\n"
    done
    ;;
help|* )
    echo "$0 enable <client_ns> - enable shaper from client"
        echo "$0 disable <client_ns> - disable shaper from client"
        echo "$0 class <client_ns> <tariff> - set tarrif from client"
    echo "$0 tarifs - list awail tarifs"
    exit 0
;;

esac

Вот мой скрипт для шейпинга. Подходит, если клиенты распиханны по netns.

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


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

Судя по скрипту, классификация делается по интерфейсу.

Для шейпинга входящего трафика следует на каждый такой интерфейс завести соответствующий ему ifb, перенаправить на него входящий трафик и соответственно шейпить его на данном ifb.

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


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

1 час назад, x86 сказал:

Судя по скрипту, классификация делается по интерфейсу.

Для шейпинга входящего трафика следует на каждый такой интерфейс завести соответствующий ему ifb, перенаправить на него входящий трафик и соответственно шейпить его на данном ifb.

Да, но у меня на пользователя выделен vlan и на роутере netns. Классификация делается через iptables.

Изменено пользователем ne-vlezay80

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


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

Еще раз - что является критерием классификации?

Если это интерфейс, то его входящий трафик нужно заворачивать на соответствующий ifb и соответственно на нем шейпить входящий трафик.

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


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

29 минут назад, x86 сказал:

Еще раз - что является критерием классификации?

Если это интерфейс, то его входящий трафик нужно заворачивать на соответствующий ifb и соответственно на нем шейпить входящий трафик.

ifb не работает с iptables.

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


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

Классифицировать тоже надо через tc - типа tc filter add dev $ifb parent 1: protocol ip prio 1 u32 match u32 0 0 flowid 1:1

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


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

2 часа назад, x86 сказал:

Классифицировать тоже надо через tc - типа tc filter add dev $ifb parent 1: protocol ip prio 1 u32 match u32 0 0 flowid 1:1

А как ты думаешь через tc залазеть на 7-мой уровень модели OSI?

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


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

17 часов назад, ne-vlezay80 сказал:

ifb не работает с iptables.

А если классифицировать средствами iptables на входящих интерфейсах, а шейпить уже на ifb? skb->prio у пакета сохраняется на всем протяжении его жизни в системе.

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


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

7 минут назад, taf_321 сказал:

А если классифицировать средствами iptables на входящих интерфейсах, а шейпить уже на ifb? skb->prio у пакета сохраняется на всем протяжении его жизни в системе.

ifb на входящем интерфейсе сработает ДО iptables

 

15 часов назад, ne-vlezay80 сказал:

А как ты думаешь через tc залазеть на 7-мой уровень модели OSI?

Хочешь показать, что знаешь умные слова?

Ну, покажи где у тебя 7-й уровень используется?

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


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

В 4/27/2018 в 09:57, x86 сказал:

Ну, покажи где у тебя 7-й уровень используется?

Это DPI, которые реализуется через suricata.

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


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

В 30.04.2018 в 09:18, ne-vlezay80 сказал:

Это DPI, которые реализуется через suricata.

Т.е. suricata маркирует трафик?

Тогда использование ifb смысла не имеет( или нужно маркировать самому ).

Можно пробовать шейпить на исходящем интерфейсе.

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


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

4 часа назад, x86 сказал:

Т.е. suricata маркирует трафик?

Тогда использование ifb смысла не имеет( или нужно маркировать самому ).

Можно пробовать шейпить на исходящем интерфейсе.

Я так и делаю.

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


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

Join the conversation

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

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

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

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

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

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

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