LINUX.ORG.RU
решено ФорумAdmin

[классика][shaper][tc][iptables] работает, но криво


0

3

имеется:
лок. сеть за NAT'ом
+

#!/bin/bash

IPT="/sbin/iptables"
TC="/sbin/tc"
IP="/bin/ip"

DEV_IN="eth0"
RATE_IN="2850"

DEV_OUT="eth1"
RATE_OUT="600"

RATE_LOCAL="1gbit"
IP_LOCAL="192.168.0.254" # gw

stop(){
    $TC qdisc del dev $DEV_IN root >/dev/null 2>&1
    $TC qdisc del dev $DEV_OUT root >/dev/null 2>&1

    $IPT -t mangle -D POSTROUTING -o $DEV_IN -j SHAPER-IN >/dev/null 2>&1
    $IPT -t mangle -F SHAPER-IN >/dev/null 2>&1
    $IPT -t mangle -X SHAPER-IN >/dev/null 2>&1

    $IPT -t mangle -D POSTROUTING -o $DEV_OUT -j SHAPER-OUT >/dev/null 2>&1
    $IPT -t mangle -F SHAPER-OUT >/dev/null 2>&1
    $IPT -t mangle -X SHAPER-OUT >/dev/null 2>&1
}
    
start_in(){ 
    $IP link set dev $DEV_IN qlen 32
    
    $TC qdisc add dev $DEV_IN root handle 1: htb r2q 3 default 90
    
    # класс для НЕТРАНЗИТНЫХ пакетов
    # (идущих с lan'а в лок. сеть)
    $TC class add dev $DEV_IN parent 1:0 classid 1:1 htb rate $RATE_LOCAL quantum 60000 prio 99
        $TC qdisc add dev $DEV_IN parent 1:1 pfifo
        $TC filter add dev $DEV_IN parent 1:0 prio 1 protocol ip u32 match ip src $IP_LOCAL classid 1:1
    
    # класс для ТРАНЗИТНЫХ пакетов 
    # (идущих с wan'а в лок. сеть)
    $TC class add dev $DEV_IN parent 1:0 classid 1:2 htb rate ${RATE_IN}kbit ceil ${RATE_IN}kbit

        $TC class add dev $DEV_IN parent 1:2 classid 1:5  htb rate $[5*$RATE_IN/100]kbit  burst 10k ceil ${RATE_IN}kbit prio 5
        $TC class add dev $DEV_IN parent 1:2 classid 1:8  htb rate $[15*$RATE_IN/100]kbit burst 10k ceil ${RATE_IN}kbit prio 8
        $TC class add dev $DEV_IN parent 1:2 classid 1:10 htb rate $[10*$RATE_IN/100]kbit burst 10k ceil ${RATE_IN}kbit prio 10
        $TC class add dev $DEV_IN parent 1:2 classid 1:20 htb rate $[65*$RATE_IN/100]kbit burst 10k ceil ${RATE_IN}kbit prio 20
        $TC class add dev $DEV_IN parent 1:2 classid 1:30 htb rate $[4*$RATE_IN/100]kbit  burst 10k ceil ${RATE_IN}kbit prio 30
        $TC class add dev $DEV_IN parent 1:2 classid 1:90 htb rate $[1*$RATE_IN/100]kbit  burst 10k ceil ${RATE_IN}kbit prio 90

        $TC qdisc add dev $DEV_IN parent 1:5  handle 5:  sfq perturb 1
        $TC qdisc add dev $DEV_IN parent 1:8  handle 8:  sfq perturb 1
        $TC qdisc add dev $DEV_IN parent 1:10 handle 10: sfq perturb 1
        $TC qdisc add dev $DEV_IN parent 1:20 handle 20: sfq perturb 1
        $TC qdisc add dev $DEV_IN parent 1:30 handle 30: sfq perturb 1
        $TC qdisc add dev $DEV_IN parent 1:90 handle 90: sfq perturb 1

        $TC filter add dev $DEV_IN parent 1:0 prio 5  protocol ip handle 5  fw flowid 1:5
        $TC filter add dev $DEV_IN parent 1:0 prio 8  protocol ip handle 8  fw flowid 1:8
        $TC filter add dev $DEV_IN parent 1:0 prio 10 protocol ip handle 10 fw flowid 1:10
        $TC filter add dev $DEV_IN parent 1:0 prio 20 protocol ip handle 20 fw flowid 1:20
        $TC filter add dev $DEV_IN parent 1:0 prio 30 protocol ip handle 30 fw flowid 1:30
        $TC filter add dev $DEV_IN parent 1:0 prio 90 protocol ip handle 90 fw flowid 1:90

    # Добавление цепочки SHAPER-IN в mangle для последующей маркировки входящих пакетов (WAN->LAN)
    $IPT -t mangle -N SHAPER-IN
    $IPT -t mangle -I POSTROUTING -o $DEV_IN -j SHAPER-IN

    # SYN-пакеты
    $IPT -t mangle -A SHAPER-IN -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 5
    # icmp, dns
    $IPT -t mangle -A SHAPER-IN -p icmp -j MARK --set-mark 5
    $IPT -t mangle -A SHAPER-IN -p udp --sport 53 -j MARK --set-mark 5
    # icecast
    $IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 7000,8000 -j MARK --set-mark 8
    # ssh, rdp
    $IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 22,11122,3389 -j MARK --set-mark 10
    # imap, imaps, pop3, pop3s
    $IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 143,993,110,995 -j MARK --set-mark 10
    # http, https; ftp(20,21)
    $IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 80,443,8080,20,21,81 -j MARK --set-mark 20
    # Закачки > 1MB http(80,8080), https; ftp(20,21)
    $IPT -t mangle -A SHAPER-IN -p tcp -m multiport --sports 80,8080,81,21 -m connbytes --connbytes 1048576: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 30
    # Маркировка пакетов, непопадающих под верхние правила
    $IPT -t mangle -A SHAPER-IN -m mark --mark 0 -j MARK --set-mark 90

    echo "Inbound shaping added to $DEV_IN.   Rate: ${RATE_IN}Kbit/sec."
}

start_out(){

    $IP link set dev $DEV_OUT qlen 32

    $TC qdisc add dev $DEV_OUT root handle 1: htb r2q 4 default 90

    # класс для ТРАНЗИТНЫХ пакетов
    # (идущих с лок. сети на wan)
    $TC class add dev $DEV_OUT parent 1:0 classid 1:2 htb rate ${RATE_OUT}kbit ceil ${RATE_OUT}kbit
        $TC class add dev $DEV_OUT parent 1:2 classid 1:5  htb rate $[5*$RATE_OUT/100]kbit  ceil ${RATE_OUT}kbit prio 5
        $TC class add dev $DEV_OUT parent 1:2 classid 1:7  htb rate $[10*$RATE_OUT/100]kbit ceil ${RATE_OUT}kbit prio 7
        $TC class add dev $DEV_OUT parent 1:2 classid 1:8  htb rate $[15*$RATE_OUT/100]kbit ceil ${RATE_OUT}kbit prio 8
        $TC class add dev $DEV_OUT parent 1:2 classid 1:90 htb rate $[5*$RATE_OUT/100]kbit  ceil ${RATE_OUT}kbit prio 90

        $TC qdisc add dev $DEV_OUT parent 1:5  handle 5:  sfq perturb 1
        $TC qdisc add dev $DEV_OUT parent 1:7  handle 7:  sfq perturb 1
        $TC qdisc add dev $DEV_OUT parent 1:8  handle 8:  sfq perturb 1
        $TC qdisc add dev $DEV_OUT parent 1:90 handle 90: sfq perturb 1

        $TC filter add dev $DEV_OUT parent 1:0 prio 5  protocol ip handle 5  fw flowid 1:5
        $TC filter add dev $DEV_OUT parent 1:0 prio 7  protocol ip handle 7  fw flowid 1:7
        $TC filter add dev $DEV_OUT parent 1:0 prio 8  protocol ip handle 8  fw flowid 1:8
        $TC filter add dev $DEV_OUT parent 1:0 prio 90 protocol ip handle 90 fw flowid 1:90


    # Добавление цепочки SHAPER-OUT в mangle для последующей маркировки исходящих пакетов (LAN->WAN)
    $IPT -t mangle -N SHAPER-OUT
    $IPT -t mangle -I POSTROUTING -o $DEV_OUT -j SHAPER-OUT

    # SYN-пакеты
    $IPT -t mangle -A SHAPER-OUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 5
    # icmp
    $IPT -t mangle -A SHAPER-OUT -p icmp -j MARK --set-mark 5
    # ssh
    $IPT -t mangle -A SHAPER-OUT -p tcp -m multiport --dports 22 -j MARK --set-mark 7
    # dns; http, https
    $IPT -t mangle -A SHAPER-OUT -p udp --dport 53 -j MARK --set-mark 8
    $IPT -t mangle -A SHAPER-OUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 8
    # Маркировка пакетов, непопадающих под верхние правила
    $IPT -t mangle -A SHAPER-OUT -m mark --mark 0 -j MARK --set-mark 90

    echo "Outbound shaping added to $DEV_OUT.  Rate: ${RATE_OUT}Kbit/sec."
}

case "$1" in
    start)
        stop
        start_in
        start_out
    ;;

    stop)
        stop
        echo "Shaping removed on $DEV_IN/$DEV_OUT"
    ;;

    *)
        echo "Usage: $0 {start|stop}"
esac

проблема: торрент-трафик «съедает» около 75% ширины канала

подскажите, в чём проблема? ну, кроме рук :)


> проблема: торрент-трафик «съедает» около 75% ширины канала

В торрент-качалке не настраивается предельная скорость приема?

anonymous ()
Ответ на: комментарий от anonymous

В торрент-качалке не настраивается предельная скорость приема?

мне к каждому бегать с просьбой сбавить скорость?
и вообще: по существу будут предложения/исправления, кроме необдуманных выхлопов?

cac2s ()

имхо странная настройка
использование rate + приоритеты - както нето чтоб ихзлишне а неразумна - тут уже фиг найдеш кто в чем виноват

а почему так работает - просто - суть rate в том - что если класс не сьел свой рейт - то пакет в него попавший пропускаеться ВАЩЕ сразу
несмотря нинакой приоритет

а торенты будут постоянно стучаться на вход - и их будут пропускать несмотря на приоритеты - просто по рейту

эт часть проблемы
вторая в том - что ты управляеш своим куосом - а не куосом провайдера
а пакеты от торрента будут стучаться на вход постоянно


а что делать - а попобуй выделить торент пакеты - и задать им ceil примерно 60-70% от общей полосы - тогда твой куос будет ограничивать максимальную скорость торентов - и когда подут пакеты от других служб - им как бы будет место в потоке - и они смогут лучше разгоняться

ae1234 ★★ ()
Ответ на: комментарий от ae1234

использование rate + приоритеты - както нето чтоб ихзлишне а неразумна

а при чем здесь гарантированная ширина класа к его приоритету относительно других?

а почему так работает - просто - суть rate в том - что если класс не сьел свой рейт - то пакет в него попавший пропускаеться ВАЩЕ сразу несмотря нинакой приоритет

тебя не смущает, что пакеты торрент-клиентов попадают в класс 1:90, у которого гарантированная ширина всего-лишь 5%, в то время как я описывал проблему, состоящую в том, что 1:90 съедает около 75%?
а если посмотреть внимательно - максимальная ширина у любого из классов - 100%, и, возвращаясь к «ненужности» совместного использования prio + rate, тебе должно стать понятно (по крайней мере, хочется в это верить), что как раз prio и указывает - какому классу одалживать неиспользованную часть rate. поэтому фраза «пропускаеться ВАЩЕ сразу несмотря нинакой приоритет» - полный бред, потому что именно приоритет в моём случае играет ключевую роль (http-трафик имеет бОльшую значимость, перед неклассифицированным трафиком)

а торенты будут постоянно стучаться на вход - и их будут пропускать несмотря на приоритеты - просто по рейту

на вход чего? кто будет пропускать? опять-таки, при чём здесь 5% rate?! бррр... бредятина!

cac2s ()
Ответ на: комментарий от cac2s

гарантированная ширина канала да 5%
НО ! ты шипуеш тот траффик который уже был зашипован провайдером - и который уже попал к тебе

и ты шипуеш его на туже ширину канала что и провайдер

ну как бы обьяснить
вот смотри - канал у провайдера широкий - и все пакеты что идут на твой адресс - провайдер шипует ну типа на 10мбит
эти 10 мегабит идут по последней миле к тебе - попадают в твой куос - и ты эти 10 мегабит ТАКЖЕ шипуеш на 10 мегабит

ты не видишь странность в этой схеме ?

твой шейпер - неделает именно qos - ибо никак из 10 мегабит которые уже пришли нераспределить другие 10 мегабит - просто говоря неоткуда взять более приоритетного траффика и заменить им менее приоритетный

еще это ухудшает тем - что торренты udp и так далее


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

можно попробовать поиграться с приоритетами в ip пакетах - может быть шейпер провайдера на них среагирует

ae1234 ★★ ()
Ответ на: комментарий от ae1234

(1) входящая ширина - 3072 Кбит/сек, в скрипте - 2850 Кбит/сек
(2) провайдер на своей стороне шейпит мой трафик, идентифицируя мои пакеты по IP, и отдает мне мои пакеты не быстрее 3 Мбит/сек
(3) я, получая пакеты, идентифицирую их по номерам портов и отдаю их в лок. сеть не быстрее 2850 Кбит/сек

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

исходя из (1), (2) и (3) - так и есть: у провайдера остается резервная ширина (3072-2850 Кбит/сек). другое дело, если этой ширины недостаточно... + действительно нужно будет попробовать уменьшить ceil в 1:90 со 100% до, скажем, 80% и посмотреть на результат. но это в понедельник.

в любом случае - спасибо за то, что не прошел мимо :)

cac2s ()
Ответ на: комментарий от cac2s

а отпишись чего получиться :)

на самом деле - идеально было бы если шейпер торрентовый траффик шейпил до 70-80% от СВОБОДНОЙ полосы
тоесть динамически

тобиш ceil постоянно подстраивался

ae1234 ★★ ()
Ответ на: комментарий от ae1234

попробовал:

$TC class add dev $DEV_IN parent 1:2 classid 1:90 htb rate $[1*$RATE_IN/100]kbit burst 10k ceil $[$RATE_IN-$RATE_IN/3]kbit prio 90
$RATE_IN = 2750kbit (доступно 3Мбит)
rate = 1%
ceil = $RATE_IN-30%

результат - неизменный :(

cac2s ()
Ответ на: комментарий от ae1234

идеально было бы если шейпер торрентовый траффик шейпил до 70-80% от СВОБОДНОЙ полосы

а он от какой шейпит? О_о
ceil - максимальная (негарантированная) ширина канала, доступная данному классу, если каналы с более высоким приоритетом (более низким значением prio) неполностью используют свой ceil.
а поскольку у класса 1:90 самый низкий приоритет, то он может претендовать на доступный ему ceil в самую последнюю очередь, чего на деле не происходит ((

cac2s ()
Ответ на: комментарий от ae1234

блин! как всегда :)

    # SYN-пакеты
    $IPT -t mangle -A SHAPER-IN -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 5
убрал - всё стало красиво

cac2s ()
Ответ на: комментарий от cac2s

всмысле было настолько много syn пакетов что они забивали приличную часть канала ?

ae1234 ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.