Linux за българи: Форуми

Linux секция за начинаещи => Настройка на програми => Темата е започната от: GuessWho в Apr 09, 2009, 16:30



Титла: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 09, 2009, 16:30
След няколко теми без отговор по форумите,  реших да се опитам да си направя сам скрип за ограничаване на входящата/изходящата скорост на клиентите, като идеята е едни и същи правила да въжат за всички клиенти. Порових се малко в гугъл-а попрочетох няколко статиики и всичко взе да ми изглежда много лесно ....  ;D  до момента в които забелязах, че нямам ограничение на upload-а.
Ето и кода:

Код:
#!/bin/bash
#
#
#
#
##################################
tc="/sbin/tc"
network="192.168.0."
start_ip="10"
end_ip="50"
download="2048"
upload="2048"
metric="Kbit"
clsid="2"
lan="eth0"
wan="ppp0"
##################################

function shape_start ()
{


$tc qdisc del dev eth0 root    &> /dev/null
$tc qdisc del dev $wan root    &> /dev/null
$tc qdisc del dev eth0 ingress &> /dev/null
$tc qdisc del dev $wan ingress &> /dev/null

##
sleep 2

$tc qdisc add dev eth0  root handle 1:0 htb
$tc qdisc add dev $wan  root handle 1:0 htb

$tc class add dev eth0  parent 1:0 classid 1:1 htb rate 102400Kbit
$tc class add dev $wan  parent 1:0 classid 1:1 htb rate 102400Kbit

echo "Start shapes ..."
###################################################################################################################################
#Users Rules .....
while test $start_ip -le $end_ip
do

#Clients Download Limit
$tc class add dev $lan parent 1:1 classid 1:$clsid htb rate $download$metric
$tc qdisc add dev $lan parent 1:$clsid handle "$clsid": sfq perturb 10
$tc filter add dev $lan parent 1:0 protocol ip prio 1 u32 match ip dst $network$start_ip classid 1:$clsid

#Clients Upload Limit
$tc class add dev $wan parent 1:1 classid 1:$clsid htb rate $upload$metric
$tc qdisc add dev $wan parent 1:$clsid handle "$clsid": sfq perturb 10
$tc filter add dev $wan parent 1:0 protocol ip prio 1 u32 match ip src $network$start_ip classid 1:$clsid

clsid=$[clsid+1]
start_ip=$[start_ip+1]
done

###################################################################################################################################

echo "OK"
}


function shape_stop ()
{
    echo "Stop all shapes ..."
    $tc qdisc del dev eth0 root    &> /dev/null
    $tc qdisc del dev $wan root    &> /dev/null
   
    $tc qdisc del dev eth0 ingress &> /dev/null
    $tc qdisc del dev $wan ingress &> /dev/null
   
    echo "OK"
}

###################################################################################################################################

case $1 in
   
    start)
     shape_start
   
    ;;

    stop)
     shape_stop
   
    ;;
   
    restart)
     shape_stop
     sleep 3
     shape_start
   
    ;;
   
    *)
    echo "Useg: rc.shape (start|stop|restart)"
    exit 1
    ;;
esac

Някой има ли на идея защо нямам ограничение за изходящия трафик на потребителите ?
Със Slackware 12 съм, за да споделям нет-а правя следното:
Код:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: bnight в Apr 10, 2009, 10:49
Първо мерси за изчерпателно написаното скриптче аз може да го помодифицирам малко за да сложда допълнителни скорости и тн за различни потребители но както и да е. На кратко защо нямаш правила за изходящ трафик. Ами за да си напишеш такива те трябва да са за WAN интерфейса. Тъй като по-принцип tc ограничава само upload-a за даден интерфейс. И това което ти правиш реално за да ограничаваш download-a на свойте клиенти е да лимитираш upload-a на eth0.


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 10, 2009, 12:07
bnight,  искам да ти благодаря че въобще се вкючи в темата :)
Та така де ... за да огранича download-a на клиентите ограничавам уплоад-а на eth0 към тях.....
Следователно ако направим същото нещо само че на WAN интерфейса ppp0 (което и съм направил) трябва да се ограничи и уплоад-а на клиентите нали така ?

Или може би, ще проявиш добра воля и ще ми покажеш нагледно каде бъркам ?  :)


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: ivanatora в Apr 10, 2009, 17:43
За ъплоуд не можеш да използваш U32 класификатора с match ip src, защото TC-то работи след POSTROUTING-а. Т.е. за него ip src за всички пакети изходящи от WAN интерфейса ти е винаги външния адрес на същата машина.
Слагай марки на пакетите от iptables (mangle, -j MARK) и в TC-то си направи филтрите за ъплоуд по марките.


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: bnight в Apr 10, 2009, 20:17
Да то вярно че имаше нещо такова че самите пакети трябва да се маркират за да стане магията със уплоад-а. Иначе аз не разбирам достатъчно от tc . Но пък скриптчето ти ми реши проблема с гледането на мачове през IPtv докато другите users на мрежата теглят торенти. Мерси за което.


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 13, 2009, 19:39
Е вече наистина започвам да се отчайвам .....
Порових се в нета и разгледах как става схемата с маркирането на пакетите .... по това което видях направих промени в скрипта но се получи "малка" аномалия.Както преди download-а се ограничава нормално но пак има някакъв странен проблем с upload-а.Ще се опитам да обесня .... задавам стойност на "up_speed" да речем 2048kbit (2Mbit), което трябва да е 256Kb/s, но максималния upload не превишава "0,2Mbit"-та. Същата стойност (0,2Mbit) се запазва до към 9500-10000Kbit-та. Следващия тест беше със стойност 10240Kbit-та, като този път upload-a ми се ограничи на ~6Mbit-та.
Кажете ми какво пропускам ???
Ето и частта от сорса където слагам марките, правя класовете и закачам филтрите към марките + роот класовете (принципът на останалата част от кода е същия като в първия пост):

Код:
## Syzdavame ROOT klasovete za interfeisite ...
#$lan - eth0
#$wan - ppp0

$tc qdisc add dev $lan root handle 1: htb
$tc qdisc add dev $wan root handle 1: htb
## End

m="3"
burst="100k"

## Add Download/Upload Rules

while test $mark_ip_s -le $mark_ip_e
do
    #Clients Download Limit
$ipt -t mangle -A FORWARD -d $net.$mark_ip_s -j MARK --set-mark 0x$m
$tc class add dev $lan parent 1: classid 1:$m htb rate $down_speed$metric burst $burst
$tc filter add dev $lan parent 1: protocol ip prio 1 handle 0x$m fw classid 1:$m
   
    m=$[m+1]
   
        #Clients Upload Limit
$ipt -t mangle -A FORWARD -s $net.$mark_ip_s -j MARK --set-mark 0x$m
$tc class add dev $wan parent 1: classid 1:$m htb rate $up_speed$metric burst $burst
$tc filter add dev $wan parent 1: protocol ip prio 2 handle 0x$m fw flowid 1:$m
   
    m=$[m+1]
    mark_ip_s=$[mark_ip_s+1]
   
done
## End


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: ivanatora в Apr 13, 2009, 20:52
Маркването няма нужда да го правиш и за даунлоуда - него можеш да го класифицираш с U32.
Как тестваш ъплоуда?


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 13, 2009, 21:01
За тест ползвам ввв.спеедтест.нет... мисля че резултатите са задоволително точни ....

п.п: за тест ползвм дестинация която е ... доставчика на моя доставчик, а без шеип си изпълвам максималния даунлоуд/уплоуд на канала .... за това мисля че резултатите от теста са точни.


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: VladSun в Apr 14, 2009, 09:31
Забравил си да зададеш опашка:
Код
GeSHi (Bash):
  1. $tc qdisc add ...

И вместо да слагаш правила и филтри за всяко ИП можеш да използваш IPMARK или IPCLASSIFY:
http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=380752598
http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=386924398


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 14, 2009, 11:06
Току що пробвах с "qdisc" ..... за сега изглежда да работи нормално, и ъплоуда и даунлоуда си се ограничават  :) Благодаря на всички които ми помогнаха.
И разбира се ето и кода:
Код:
#!/bin/bash
#
###################################################################################################################################
tc="/sbin/tc" # Pytqt do TC
ipt="/usr/sbin/iptables" # Pytqt do iptables

net="192.168.0" # Klientskata mreja .... "192.168.0" .... "172.16.242" ... primerno
mark_ip_s="10" # Nachalno IP (samo poslednata cifra)
mark_ip_e="200" # Poslednoto IP (samo poslednata cifra)
down_speed="2560" # Download rate
up_speed="2048"     # Upload rate
metric="kbit" # kbit/mbit .....
lan="eth0"         # Vytreshen Interfase
wan="ppp0" # Vynshen interfase
###################################################################################################################################
#

function shape_start () {

echo "Start shapes ..."

## Delete Rules First
$ipt -t mangle -F
$tc qdisc del dev $lan root 2> /dev/null > /dev/null
$tc qdisc del dev $wan root 2> /dev/null > /dev/null
## End

sleep 2

## Syzdavame ROOT klasovete za interfeisite ...
$tc qdisc add dev $lan root handle 1: htb
$tc qdisc add dev $wan root handle 1: htb
## End

m="3"
burst="100k"

## Add Download/Upload Rules

while test $mark_ip_s -le $mark_ip_e
do
    #Clients Download Limit
$tc class add dev $lan parent 1: classid 1:$m htb rate $down_speed$metric
    $tc qdisc add dev $lan parent 1:$m handle $m sfq perturb 10
    $tc filter add dev $lan parent 1: protocol ip prio 1 u32 match ip dst $net.$mark_ip_s classid 1:$m
   
    #Clients Upload Limit
$ipt -t mangle -A FORWARD -s $net.$mark_ip_s -j MARK --set-mark 0x$m
$tc class add dev $wan parent 1: classid 1:$m htb rate $up_speed$metric burst $burst
$tc qdisc add dev $wan parent 1:$m handle $m sfq perturb 10
$tc filter add dev $wan parent 1: protocol ip prio 1 handle 0x$m fw classid 1:$m
   
    m=$[m+1]
    mark_ip_s=$[mark_ip_s+1]
   
done
## End

###################################################################################################################################

echo "OK"
}


function shape_stop ()
{

echo "Spirane na ogranicheniqta ..."
$ipt -t mangle -F
$tc qdisc del dev $lan root 2> /dev/null > /dev/null
$tc qdisc del dev $wan root 2> /dev/null > /dev/null
echo "OK"

}

###################################################################################################################################

case $1 in
   
    start)
     shape_start
   
    ;;

    stop)
     shape_stop
   
    ;;
   
    restart)
     shape_stop
     sleep 2
     shape_start
   
    ;;
   
    *)
    echo "Useg: rc.shape (start|stop|restart)"
    exit 1
    ;;
esac

Знам че не е кой знае какво но поне върши работа :)


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: mishot в Apr 14, 2009, 17:11
ще работи ли ако интернета ми не е pppoe, a нормален LAN(статично IP)


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 14, 2009, 17:16
Не виждам причина за да НЕ работи ! Сложи вместо ppp0 интерфейса към доставчика и тествай.


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: mishot в Apr 14, 2009, 17:44
благодаря за отговора, ще тествам!


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 14, 2009, 18:02
Кажи после какво е станало :)


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: mishot в Apr 14, 2009, 18:11
теста ще е в събота


Титла: Re: Скрипт за ограничаване на трафика
Публикувано от: GuessWho в Apr 14, 2009, 18:32
Успех тогава за събота :)