Автор Тема: Скрипт за ограничаване на трафика  (Прочетена 3059 пъти)

GuessWho

  • Напреднали
  • *****
  • Публикации: 14
    • Профил
След няколко теми без отговор по форумите,  реших да се опитам да си направя сам скрип за ограничаване на входящата/изходящата скорост на клиентите, като идеята е едни и същи правила да въжат за всички клиенти. Порових се малко в гугъл-а попрочетох няколко статиики и всичко взе да ми изглежда много лесно ....  ;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
Активен

bnight

  • Напреднали
  • *****
  • Публикации: 313
  • Distribution: Ubuntu 8.10
  • Window Manager: KDE 3.5.10
    • Профил
    • WWW
Re: Скрипт за ограничаване на трафика
« Отговор #1 -: Apr 10, 2009, 10:49 »
Първо мерси за изчерпателно написаното скриптче аз може да го помодифицирам малко за да сложда допълнителни скорости и тн за различни потребители но както и да е. На кратко защо нямаш правила за изходящ трафик. Ами за да си напишеш такива те трябва да са за WAN интерфейса. Тъй като по-принцип tc ограничава само upload-a за даден интерфейс. И това което ти правиш реално за да ограничаваш download-a на свойте клиенти е да лимитираш upload-a на eth0.
Активен

Registered Linux user: 473460
http://skyhost.bg - Хостинг и Домейни

GuessWho

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

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

ivanatora

  • Напреднали
  • *****
  • Публикации: 658
  • Distribution: Ubuntu 10.04
  • Window Manager: Fluxbox
    • Профил
    • WWW
Re: Скрипт за ограничаване на трафика
« Отговор #3 -: Apr 10, 2009, 17:43 »
За ъплоуд не можеш да използваш U32 класификатора с match ip src, защото TC-то работи след POSTROUTING-а. Т.е. за него ip src за всички пакети изходящи от WAN интерфейса ти е винаги външния адрес на същата машина.
Слагай марки на пакетите от iptables (mangle, -j MARK) и в TC-то си направи филтрите за ъплоуд по марките.
Активен

bnight

  • Напреднали
  • *****
  • Публикации: 313
  • Distribution: Ubuntu 8.10
  • Window Manager: KDE 3.5.10
    • Профил
    • WWW
Re: Скрипт за ограничаване на трафика
« Отговор #4 -: Apr 10, 2009, 20:17 »
Да то вярно че имаше нещо такова че самите пакети трябва да се маркират за да стане магията със уплоад-а. Иначе аз не разбирам достатъчно от tc . Но пък скриптчето ти ми реши проблема с гледането на мачове през IPtv докато другите users на мрежата теглят торенти. Мерси за което.
Активен

Registered Linux user: 473460
http://skyhost.bg - Хостинг и Домейни

GuessWho

  • Напреднали
  • *****
  • Публикации: 14
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #5 -: 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
Активен

ivanatora

  • Напреднали
  • *****
  • Публикации: 658
  • Distribution: Ubuntu 10.04
  • Window Manager: Fluxbox
    • Профил
    • WWW
Re: Скрипт за ограничаване на трафика
« Отговор #6 -: Apr 13, 2009, 20:52 »
Маркването няма нужда да го правиш и за даунлоуда - него можеш да го класифицираш с U32.
Как тестваш ъплоуда?
Активен

GuessWho

  • Напреднали
  • *****
  • Публикации: 14
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #7 -: Apr 13, 2009, 21:01 »
За тест ползвам ввв.спеедтест.нет... мисля че резултатите са задоволително точни ....

п.п: за тест ползвм дестинация която е ... доставчика на моя доставчик, а без шеип си изпълвам максималния даунлоуд/уплоуд на канала .... за това мисля че резултатите от теста са точни.
« Последна редакция: Apr 13, 2009, 21:06 от GuessWho »
Активен

VladSun

  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #8 -: 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
« Последна редакция: Apr 14, 2009, 09:34 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

GuessWho

  • Напреднали
  • *****
  • Публикации: 14
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #9 -: 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

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

mishot

  • Напреднали
  • *****
  • Публикации: 191
  • Distribution: Fedora 16
  • Window Manager: Gnome-Shell
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #10 -: Apr 14, 2009, 17:11 »
ще работи ли ако интернета ми не е pppoe, a нормален LAN(статично IP)
Активен

GuessWho

  • Напреднали
  • *****
  • Публикации: 14
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #11 -: Apr 14, 2009, 17:16 »
Не виждам причина за да НЕ работи ! Сложи вместо ppp0 интерфейса към доставчика и тествай.
Активен

mishot

  • Напреднали
  • *****
  • Публикации: 191
  • Distribution: Fedora 16
  • Window Manager: Gnome-Shell
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #12 -: Apr 14, 2009, 17:44 »
благодаря за отговора, ще тествам!
Активен

GuessWho

  • Напреднали
  • *****
  • Публикации: 14
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #13 -: Apr 14, 2009, 18:02 »
Кажи после какво е станало :)
Активен

mishot

  • Напреднали
  • *****
  • Публикации: 191
  • Distribution: Fedora 16
  • Window Manager: Gnome-Shell
    • Профил
Re: Скрипт за ограничаване на трафика
« Отговор #14 -: Apr 14, 2009, 18:11 »
теста ще е в събота
Активен