Динамическое шейпирование

Технические вопросы по UTM 5.0
OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Динамическое шейпирование

Сообщение OxOyD »

Господа, помогите... Натолкните хотя бы на мысль в каком направлении мыслить.
Имеется Сервер с биллингом (в сборке имеется модуль динамического шейпирования) и Cisco Catalyst 3750 X - Series через которую сервер смотрит в локальную сеть. Имеются клиенты с различными ТП. Задача: нужно организовать шейпинг пользователей по группам, то есть группе с условным названием "512Кб" задать минимально гарантированную ширину канала входящего и исходящего трафика ну и максимальное значение ширины канала тоже, динамичность шейпирования нужна для изменения времени суток, то есть днем одна скрость у груп, ночью другая скорость. К слову все тарифы безлимитные.
Перекопал массу материалов, и окончательно запутался с реализацией, подскажите хотя бы в каком направлении мыслить.

Возможно ли сделать так чтобы iptables метил и нарезал трафик в соответствии с тем от какой группы пользователей он идет, а при помощи утилиты tc отслеживать этот трафик с меткой и присваивать значения скорости?

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Подскажите пожалуйста шейперить входящий и исходящий трафик нужно на разных интерфейсах?

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Дайте ответ хоть кто нибудь. Я правильно что для того чтобы организовать статическое шейпирование входящего трафика необходимо написать скрипт со следующей последовательностью команд:
#устанавливаем шейпирование в момент включения абонента
iptables -A FORWARD -s 0/0 -d UIP -j ACCEPT
Iptables -A FORWARD -s UIP -d 0/0 -j ACCEPT
#маркируем входящий трафик
iptables -t mangle -A FORWARD -s 0/0 -d UIP -j MARK --set-mark UID
#теперь режем скорость
tc qdisc add dev eth1 root handle 1 : htb
tc filter add dev eth1 parent 1: protocol ip prio 3 handle UID fw classid 1:UID
tc class add dev eth1 parent 1:1 classid 1: UID htb rate 512kbit burst 20k

Последнии строки в соответствии с примером из инструкции по биллингу
Все ли я верно понял? Будут ли данные правила включать и устанавливать трафик в 512kbit для абонентов?

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Ап господа, помогите кто - нибудь.

taf
Сообщения: 309
Зарегистрирован: Вс янв 30, 2005 11:41

Сообщение taf »

пример правил, задающих скорость у меня:

Код: Выделить всё

qdisc del dev eth0 root
qdisc del dev eth1 root

qdisc add dev eth0 root handle 1: est 1sec 8sec hfsc default ffff
qdisc add dev eth1 root handle 1: est 1sec 8sec hfsc default ffff

class add dev eth0 parent 1: classid 1:1 est 1sec 8sec hfsc sc rate 1000Mbit ul rate 1000Mbit
class add dev eth1 parent 1: classid 1:1 est 1sec 8sec hfsc sc rate 1000Mbit ul rate 1000Mbit

class add dev eth0 parent 1: classid 1:ffff est 1sec 8sec hfsc sc umax 1500 dmax 150ms rate 1000kbit ul rate 100Mbit
class add dev eth1 parent 1: classid 1:ffff est 1sec 8sec hfsc sc umax 1500 dmax 150ms rate 1000kbit ul rate 100Mbit
qdisc add dev eth0 parent 1:ffff handle ffff: pfifo
qdisc add dev eth1 parent 1:ffff handle ffff: pfifo

filter add dev eth0 parent 1:0 handle 64: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 64: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 65: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 65: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 66: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 66: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 67: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 67: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 68: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 68: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 69: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 69: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 6a: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 6a: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 6b: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 6b: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 6c: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 6c: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 6d: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 6d: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 6e: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 6e: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 6f: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 6f: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 70: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 70: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 71: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 71: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 72: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 72: protocol ip prio 10 u32 divisor 256
filter add dev eth0 parent 1:0 handle 73: protocol ip prio 10 u32 divisor 256
filter add dev eth1 parent 1:0 handle 73: protocol ip prio 10 u32 divisor 256

filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 193.yy.xxx.0/24 hashkey mask 0x000000ff at 12 link 64:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 193.yy.xxx.0/24 hashkey mask 0x000000ff at 16 link 64:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 193.yy.xxz.0/24 hashkey mask 0x000000ff at 12 link 65:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 193.yy.xxz.0/24 hashkey mask 0x000000ff at 16 link 65:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.0.0/24 hashkey mask 0x000000ff at 12 link 66:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.0.0/24 hashkey mask 0x000000ff at 16 link 66:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.1.0/24 hashkey mask 0x000000ff at 12 link 67:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.1.0/24 hashkey mask 0x000000ff at 16 link 67:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.2.0/24 hashkey mask 0x000000ff at 12 link 68:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.2.0/24 hashkey mask 0x000000ff at 16 link 68:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.3.0/24 hashkey mask 0x000000ff at 12 link 69:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.3.0/24 hashkey mask 0x000000ff at 16 link 69:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.4.0/24 hashkey mask 0x000000ff at 12 link 6a:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.4.0/24 hashkey mask 0x000000ff at 16 link 6a:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.5.0/24 hashkey mask 0x000000ff at 12 link 6b:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.5.0/24 hashkey mask 0x000000ff at 16 link 6b:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.6.0/24 hashkey mask 0x000000ff at 12 link 6c:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.6.0/24 hashkey mask 0x000000ff at 16 link 6c:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.7.0/24 hashkey mask 0x000000ff at 12 link 6d:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.7.0/24 hashkey mask 0x000000ff at 16 link 6d:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.8.0/24 hashkey mask 0x000000ff at 12 link 6e:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.8.0/24 hashkey mask 0x000000ff at 16 link 6e:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.9.0/24 hashkey mask 0x000000ff at 12 link 6f:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.9.0/24 hashkey mask 0x000000ff at 16 link 6f:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.10.0/24 hashkey mask 0x000000ff at 12 link 70:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.10.0/24 hashkey mask 0x000000ff at 16 link 70:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.11.0/24 hashkey mask 0x000000ff at 12 link 71:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.11.0/24 hashkey mask 0x000000ff at 16 link 71:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.12.0/24 hashkey mask 0x000000ff at 12 link 72:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.12.0/24 hashkey mask 0x000000ff at 16 link 72:
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 match ip src 172.16.13.0/24 hashkey mask 0x000000ff at 12 link 73:
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 172.16.13.0/24 hashkey mask 0x000000ff at 16 link 73:

# user1: 11
class add dev eth1 parent 1: classid 1:b est 1sec 8sec hfsc sc umax 1500b dmax 5ms rate 1024kbit ul rate 1024kbit
qdisc add dev eth1 parent 1:b handle b: pfifo
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 ht 68:1b: match ip dst 172.16.2.27/255.255.255.255 flowid 1:b
class add dev eth0 parent 1: classid 1:b est 1sec 8sec hfsc sc umax 1500b dmax 5ms rate 1024kbit ul rate 1024kbit
qdisc add dev eth0 parent 1:b handle b: pfifo
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 68:1b: match ip src 172.16.2.27/255.255.255.255 flowid 1:b
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 ht 65:15: match ip dst 193.yy.xxz.21/255.255.255.255 flowid 1:b
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 65:15: match ip src 193.yy.xxz.21/255.255.255.255 flowid 1:b
# user2: 197
class add dev eth1 parent 1: classid 1:c5 est 1sec 8sec hfsc sc umax 1500b dmax 10ms rate 1536kbit ul rate 1536kbit
qdisc add dev eth1 parent 1:c5 handle c5: pfifo
filter add dev eth1 parent 1:0 protocol ip prio 10 u32 ht 68:71: match ip dst 172.16.2.113/255.255.255.255 flowid 1:c5
class add dev eth0 parent 1: classid 1:c5 est 1sec 8sec hfsc sc umax 1500b dmax 10ms rate 1536kbit ul rate 1536kbit
qdisc add dev eth0 parent 1:c5 handle c5: pfifo
filter add dev eth0 parent 1:0 protocol ip prio 10 u32 ht 68:71: match ip src 172.16.2.113/255.255.255.255 flowid 1:c5

То есть для определения, входит ли пакет в класс клиента или нет используется механизм хэш-таблиц. На первый и второй взгляд выглядит это все кошмарно, но имеет одно несомненное преимущество - производительность. Схема с правилами в iptables и потом filter по метке загибается при количестве парвил более 500 и трафике более 10 тыс pps. на хэшах споконо прожевываются сотни тысяч pps и десятки гигабит на вполне скромном железе.

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Про правила с бедами читал, но пока что для меня слишком сложно это, я пытаюсь пошагово разобраться в этом, для этого нужно хотя бы заставить работать самое просто

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Хм а почему у вас все правила дублируются на интерфейса? Или они оба локальные?

taf
Сообщения: 309
Зарегистрирован: Вс янв 30, 2005 11:41

Сообщение taf »

Одно правило для eth0 и еще одно для eth1. eth0 смотрит в сторону интернета и на нем задается исходящая от клиента скорость, eth1 смотрит в сторону клиентов, и на нем задается входящая на клиента скорость.

Не забываем, что tc без дополнительных плясок с бубнами не умеет задавать скорость для входящего на интерфейс трафика. Если таки приходящий на интерфейс трафик таки надо нарезать (в случае совмещенного шейпера и NAT'а), то применяют половецкие пляски с imq/ifb и ingress-дисциплинами. Но лучше все таки разносить NAT и шейпер по разным тазикам. Меньше гемора и тормозов.

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Разнести NAT и шейпер будет в будующем возможность пока что нужно плясать именно так. В общем кое что начало проясняться и даже работать. Вот что имею:
$tc class add dev eth1 parent 1:1 classid 1:UID htb rate 512kbit ceil 1mbit burst 1600
$tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle UID fw flowid 1:UID
$fw -A FORWARD -s 0/0 -d UIP -j ACCEPT
$fw -A FORWARD -s UIP -d 0/0 -j ACCEPT
$fw -t mangle -A FORWARD -i eth0 -o eth1 -d UIP -j MARK --set-mark UID

На удивление даже работает, то есть входящая скорость у пользователя режется до 512 (кстати осталось не понятным почему при установленном ceil скорость режетеся лишь глядя на rate)

Теперь осталось решить как ограничить исходящую? Я так понимаю копать нужно в сторону ingress и ifb0. Надеюсь услышать ваше мнение.

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Будет ли рабочей для ограничения исходящей скорости клиента такая связка?

$tc qdisc add dev eth0 ingress
$tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
$tc class add dev ifb0 parent 1:1 classid 1:UID htb rate 512kbit burst 1600
$tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src UIP flowid 1:UID
$fw -t mangle -A FORWARD -i eth0 -o eth1 -s UIP -j MARK --set-mark UID

taf
Сообщения: 309
Зарегистрирован: Вс янв 30, 2005 11:41

Сообщение taf »

Вроде должно. Но я бы посоветовал отказаться от маркировки пакетов через iptables. Если система хэш-таблиц пока сложна, то можно применить простую фильтрацию по адресам:

/sbin/tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip src aaa.bbb.ccc.ddd/32 classid 1:100

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

Ну во первых как мне объяснили система работы черед псевдоинтерфейс не реальна для меня так как я работаю с транзитным трафиком поэтому для исходящего трафика я состряпал правила аналогичные правилам для входящего, и все работает.
Во вторых, во советуете убрать маркировку и сделать фильтрацию по айпи потому что считаете что iptables не справится с большим количеством записей? Я правильно понял?

И еще вопрос, в чем все таки дело с значением ceil? почему ограничение делается от значения rate, а ceil тупо игнорится?

taf
Сообщения: 309
Зарегистрирован: Вс янв 30, 2005 11:41

Сообщение taf »

Применяя маркировку пакетов вы фактически заставляете машину делать одну и ту же работу дважды - первый раз при обработке правила в iptables, второй раз при обработке выставленной метки в tc filters. Да, ваша схема работает при количестве правил не более сотни и трафике не более 2-3 тыс пакетов в секунду. Чем больше правил и больше трафика, тем все более и более грустно все это будет работать.

Вариант с ifb рабочий для любого вида трафика.

ceil может игнорироваться в том случае, когда исчерпана полоса, заданная в родительском классе.

OxOyD
Сообщения: 36
Зарегистрирован: Вс сен 16, 2012 16:29

Сообщение OxOyD »

taf писал(а):Вроде должно. Но я бы посоветовал отказаться от маркировки пакетов через iptables. Если система хэш-таблиц пока сложна, то можно применить простую фильтрацию по адресам:

/sbin/tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip src aaa.bbb.ccc.ddd/32 classid 1:100
а я правильно понял что для осуществления данного фильтрования необходимо оба интерфейса редиректить на ifb0 так как трафик через нат идет и фильтр просто не увидит после ната айпишники правильно?

taf
Сообщения: 309
Зарегистрирован: Вс янв 30, 2005 11:41

Сообщение taf »

OxOyD писал(а):
taf писал(а):Вроде должно. Но я бы посоветовал отказаться от маркировки пакетов через iptables. Если система хэш-таблиц пока сложна, то можно применить простую фильтрацию по адресам:

/sbin/tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip src aaa.bbb.ccc.ddd/32 classid 1:100
а я правильно понял что для осуществления данного фильтрования необходимо оба интерфейса редиректить на ifb0 так как трафик через нат идет и фильтр просто не увидит после ната айпишники правильно?
Ответил в аську, продублирую еще и тут:

На ifb надо заворачивать тот трафик, у которого после NAT'а меняется IP в требуемом поле. Для простого NAT'а достаточно заворачивать "внутренний" интерфейс.

Но в свое время я редиректил обе "стороны", мне так было удобнее :)

Закрыто