Автор Тема: Помощ за шейпър  (Прочетена 8040 пъти)

rutera

  • Напреднали
  • *****
  • Публикации: 24
    • Профил
Помощ за шейпър
« -: Sep 04, 2007, 14:23 »
Зздравейте дадоха ми шейпър но е забито на 100кб ако някои може да ми каже каде да пипна за да го направя примерно на 512кб.ето скрипта.
благодаря много

Примерен код
#!/usr/bin/perl

use CGI;
use strict;
use warnings;

my $dev_ext     = "eth0"; # External interface using for upload
my $dev_int     = "eth1"; # Internal interface using for download
my $rate_limit  = "100Mbit";

#########################################
# Adding basic rules in traffic control #
#########################################
    my $delroot_dev0  = "/sbin/tc qdisc del dev $dev_ext root";
    my $addroot_dev0  = "/sbin/tc qdisc add dev $dev_ext root handle 1 htb default 30 r2q 100";
    my $addclass_dev0 = "/sbin/tc class add dev $dev_ext parent 1: classid 1:1 htb rate $rate_limit burst 15k";

    my $delroot_dev1  = "/sbin/tc qdisc del dev $dev_int root";
    my $addroot_dev1  = "/sbin/tc qdisc add dev $dev_int root handle 1 htb default 30 r2q 100";
    my $addclass_dev1 = "/sbin/tc class add dev $dev_int parent 1: classid 1:2 htb rate $rate_limit burst 15k";


    `$delroot_dev0`;
    `$addroot_dev0`;
    `$addclass_dev0`;

    `$delroot_dev1`;
    `$addroot_dev1`;
    `$addclass_dev1`;

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

my @sport_range = ("20","21","22","25","80","110","143","443","3389");

    my $basicclass_sport  = "/sbin/tc class add dev $dev_ext parent 1:1 classid 1:10 htb rate $rate_limit burst 15k";
    my $basicqdisc_sport  = "/sbin/tc qdisc add dev $dev_ext parent 1:10 handle 10 sfq perturb 10";
#    `$basicclass_sport`;
#    `$basicqdisc_sport`;

foreach my $sport (@sport_range){
    my $basicfilter_sport = "/sbin/tc filter add dev $dev_ext parent 1:0 protocol ip prio 100 u32 match ip sport $sport 0xffff classid 1:10";
#    `$basicfilter_sport`;
}


my @dport_range = ("20","21","22","25","80","110","143","443","3389");

    my $basicclass_dport  = "/sbin/tc class add dev $dev_int parent 1:2 classid 1:20 htb rate $rate_limit burst 15k";
    my $basicqdisc_dport  = "/sbin/tc qdisc add dev $dev_int parent 1:20 handle 20 sfq perturb 10";
#    `$basicclass_dport`;
#    `$basicqdisc_dport`;

foreach my $dport (@dport_range){

    my $basicfilter_dport = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip dport $dport 0xffff classid 1:20";
#    `$basicfilter_dport`;
}



    my $class_default = "/sbin/tc class add dev $dev_int parent 1:2 classid 1:30 htb rate 50Kbit ceil 1000Kbit burst 15k";
    my $qdisc_default = "/sbin/tc qdisc add dev $dev_int parent 1:30 handle 30 sfq perturb 10";

    `$class_default`;
    `$qdisc_default`;

    &users_shapers();




sub users_shapers(){

my ($ip, $id, $bgmin, $bgmax, $intmin, $intmax);

my $rates_limit = "1000";

$bgmin  = $rates_limit;
$bgmax  = $rates_limit;
$intmin = $rates_limit;
$intmax = $rates_limit;

    for ($ip=1;$ip<254;$ip++){
    
   my $ips = ($ip^32-24);
        $id = sprintf("%X", $ips + 0x200);
        my $class_bg_ul = "tc class add dev $dev_int parent 1:2 classid 1:0".$id." htb rate ".$bgmin."Kbit ceil ".$bgmax."Kbit prio 5";
        my $qdisc_bg_ul = "tc qdisc add dev $dev_int parent 1:0".$id." handle 0".$id." sfq perturb 10 ";
   my $addr_bg_ul  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip src 83.228.200.55".$ip." classid 1:0".$id."";

        $id = sprintf("%X", $ips + 0x800);
        my $class_bg_dl = "tc class add dev $dev_ext parent 1:1 classid 1:0".$id." htb rate ".$bgmin."Kbit ceil ".$bgmax."Kbit prio 5";
        my $qdisc_bg_dl = "tc qdisc add dev $dev_ext parent 1:0".$id." handle ".$id." sfq perturb 10 ";
   my $addr_bg_dl  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip dst 83.228.200.55".$ip." classid 1:0".$id."";

        $id = sprintf("%X", $ips + 0x400);
        my $class_int_ul = "tc class add dev $dev_int parent 1:25 classid 1:0".$id." htb rate ".$intmin."Kbit ceil ".$intmax."Kbit prio 4";
        my $qdisc_int_ul = "tc qdisc add dev $dev_int parent 1:0".$id." handle ".$id." sfq perturb 10 ";
   my $addr_int_ul  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip src 83.228.200.".$ip." classid 1:0".$id."";

        $id = sprintf("%X", $ips + 0x300);
        my $class_int_dl = "tc class add dev $dev_ext parent 1:20 classid 1:0".$id." htb rate ".$intmin."Kbit ceil ".$intmax."Kbit prio 4";
        my $qdisc_int_dl = "tc qdisc add dev $dev_ext parent 1:0".$id." handle ".$id." sfq perturb 10 ";
   my $addr_int_dl  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip dst 83.228.200.".$ip." classid 1:0".$id."";
    
       
        `$class_bg_ul`;
        `$qdisc_bg_ul`;
   `$addr_bg_ul`;

   `$class_int_ul`;
   `$qdisc_int_ul`;
   `$addr_int_ul`;

        `$class_bg_dl`;
        `$qdisc_bg_dl`;
   `$addr_bg_dl`;

   `$class_int_dl`;
   `$qdisc_int_dl`;
   `$addr_int_dl`;
    }
}

Активен

zeridon

  • Killmode enabled
  • Administrator
  • Напреднали
  • *****
  • Публикации: 1398
  • Distribution: Debian/Ubuntu
  • Window Manager: console/Gnome
  • BOfH
    • Профил
    • WWW
Помощ за шейпър
« Отговор #1 -: Sep 04, 2007, 14:36 »
my $class_default = "/sbin/tc class add dev $dev_int parent 1:2 classid 1:30 htb rate 50Kbit ceil 1000Kbit burst 15k";

е те тука е класът по подразбиране който кълца на 50к с таван 1000к

my $rates_limit = "1000";

$bgmin  = $rates_limit;
$bgmax  = $rates_limit;
$intmin = $rates_limit;
$intmax = $rates_limit;

те тва са лимитите и са на 1000к

така че май просто линията не ти пуска повече от 100
Активен

Внмимавай имам клещи за кабел
http://www.netsecad.com/
http://theregister.co.uk/odds/bofh/

rutera

  • Напреднали
  • *****
  • Публикации: 24
    • Профил
Помощ за шейпър
« Отговор #2 -: Sep 04, 2007, 16:18 »
ей това
Примерен код
my $rates_limit = "1000";

го променях нищо не ставаше.
Примерен код
my $class_default = "/sbin/tc class add dev $dev_int parent 1:2 classid 1:30 htb rate 50Kbit ceil 1000Kbit burst 15k";

а това ^ не сам го пипал
 ще го пробвам пак както си го описал дано има резултат. а иначе по принцип като пусна шейпъра пинга примерно кам дата.бг се дига малко.
а по принцип добре ли е направен?!
Активен

bnight

  • Напреднали
  • *****
  • Публикации: 313
  • Distribution: Ubuntu 8.10
  • Window Manager: KDE 3.5.10
    • Профил
    • WWW
Помощ за шейпър
« Отговор #3 -: Sep 04, 2007, 16:49 »
Имам теоретичен въпрос знаеш ли какво е шейпър ? И друг въпрос какво искаш да постигнеш с този шейпър ?
Активен

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

rutera

  • Напреднали
  • *****
  • Публикации: 24
    • Профил
Помощ за шейпър
« Отговор #4 -: Sep 04, 2007, 17:47 »
За шейпър не знам как се борави с него. А какво искам от него - ами просто да разпредели интернета на няколко ип-та.
Активен

bnight

  • Напреднали
  • *****
  • Публикации: 313
  • Distribution: Ubuntu 8.10
  • Window Manager: KDE 3.5.10
    • Профил
    • WWW
Помощ за шейпър
« Отговор #5 -: Sep 04, 2007, 18:12 »
а като не знаеш как се борави с него как решаваш че забива скоростта на 100К ?  Ето какво всъщност е шейпъра това е филтър на изходящият ти трафик тоест на upload-a. Така се контролира кое IP като се върже към примерно един web server с колко максимум може да тегли. Каква е схемата при ограничаването на интернета на някои на който даваш нет:

Имаме router с два интерфейса eth0 и eth1 като на eth0 идва нет-а a клиентите са на eth1 с IP-та от рода 192.168.0.1/24 Реално за да ограничим Интернета който ще получава клиента с  IP 192.168.0.25 трябва да ограничим изходящият трафик през eth1 към IP 192.168.0.25
Как става това на практика първо си правим един клас и после добавяме това IP да използва този клас.
Ето ги двете команди:
/sbin/tc class add dev eth1 parent 1:0 classid 1:24 htb rate 200kbit ceil 300kbit

А сега и въпросният филтър:
/sbin/tc filter add dev eth1 parent 1:0 protocol ip prio 10 u32 match ip dst 192.168.0.25 flowid 1:24

Сега остава въпроса как да тестваме това което направихме. Ами много лесно пускаме си да теглим нещо от 192.168.0.25 и гледаме с каква скорост се тегли като скороста не трябва да надвишава максималанта зададена в случея 300kbit-a.
Успех.
Активен

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

rutera

  • Напреднали
  • *****
  • Публикации: 24
    • Профил
Помощ за шейпър
« Отговор #6 -: Sep 04, 2007, 22:12 »
Да споделя какво се полу4ава с примера даден по долу.
паржо тръгна но не беше ограничен на 300кб/с а на 30кб/с.
Второто стартиране показжа тази грешка.
Примерен код
RTNETLINK answers: No such file or directory
RTNETLINK answers: Invalid argument
We have an error talking to the kernel

А за разяснението много сам благодарен на такива хора като теб че помагат на такива не знаещи като мен.Може ли да споделиш твое мнение със този скрипт
Примерен код
#!/usr/bin/perl

use CGI;
use strict;
use warnings;

my $dev_ext     = "eth0"; # External interface using for upload
my $dev_int     = "eth1"; # Internal interface using for download
my $rate_limit  = "100Mbit";

#########################################
# Adding basic rules in traffic control #
#########################################
   my $delroot_dev0  = "/sbin/tc qdisc del dev $dev_ext root";
   my $addroot_dev0  = "/sbin/tc qdisc add dev $dev_ext root handle 1 htb default 30 r2q 100";
   my $addclass_dev0 = "/sbin/tc class add dev $dev_ext parent 1: classid 1:1 htb rate $rate_limit burst 15k";

   my $delroot_dev1  = "/sbin/tc qdisc del dev $dev_int root";
   my $addroot_dev1  = "/sbin/tc qdisc add dev $dev_int root handle 1 htb default 30 r2q 100";
   my $addclass_dev1 = "/sbin/tc class add dev $dev_int parent 1: classid 1:2 htb rate $rate_limit burst 15k";


   `$delroot_dev0`;
   `$addroot_dev0`;
   `$addclass_dev0`;

   `$delroot_dev1`;
   `$addroot_dev1`;
   `$addclass_dev1`;

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

my @sport_range = ("20","21","22","25","80","110","143","443","3389");

   my $basicclass_sport  = "/sbin/tc class add dev $dev_ext parent 1:1 classid 1:10 htb rate $rate_limit burst 15k";
   my $basicqdisc_sport  = "/sbin/tc qdisc add dev $dev_ext parent 1:10 handle 10 sfq perturb 10";
#    `$basicclass_sport`;
#    `$basicqdisc_sport`;

foreach my $sport (@sport_range){
   my $basicfilter_sport = "/sbin/tc filter add dev $dev_ext parent 1:0 protocol ip prio 100 u32 match ip sport $sport 0xffff classid 1:10";
#    `$basicfilter_sport`;
}


my @dport_range = ("20","21","22","25","80","110","143","443","3389");

   my $basicclass_dport  = "/sbin/tc class add dev $dev_int parent 1:2 classid 1:20 htb rate $rate_limit burst 15k";
   my $basicqdisc_dport  = "/sbin/tc qdisc add dev $dev_int parent 1:20 handle 20 sfq perturb 10";
#    `$basicclass_dport`;
#    `$basicqdisc_dport`;

foreach my $dport (@dport_range){

   my $basicfilter_dport = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip dport $dport 0xffff classid 1:20";
#    `$basicfilter_dport`;
}



   my $class_default = "/sbin/tc class add dev $dev_int parent 1:2 classid 1:30 htb rate 50Kbit ceil 1000Kbit burst 15k";
   my $qdisc_default = "/sbin/tc qdisc add dev $dev_int parent 1:30 handle 30 sfq perturb 10";

   `$class_default`;
   `$qdisc_default`;

   &users_shapers();




sub users_shapers(){

my ($ip, $id, $bgmin, $bgmax, $intmin, $intmax);

my $rates_limit = "1000";

$bgmin  = $rates_limit;
$bgmax  = $rates_limit;
$intmin = $rates_limit;
$intmax = $rates_limit;

   for ($ip=1;$ip<254;$ip++){
  
my $ips = ($ip^32-24);
       $id = sprintf("%X", $ips + 0x200);
       my $class_bg_ul = "tc class add dev $dev_int parent 1:2 classid 1:0".$id." htb rate ".$bgmin."Kbit ceil ".$bgmax."Kbit prio 5";
       my $qdisc_bg_ul = "tc qdisc add dev $dev_int parent 1:0".$id." handle 0".$id." sfq perturb 10 ";
my $addr_bg_ul  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip src 83.228.200.55".$ip." classid 1:0".$id."";

       $id = sprintf("%X", $ips + 0x800);
       my $class_bg_dl = "tc class add dev $dev_ext parent 1:1 classid 1:0".$id." htb rate ".$bgmin."Kbit ceil ".$bgmax."Kbit prio 5";
       my $qdisc_bg_dl = "tc qdisc add dev $dev_ext parent 1:0".$id." handle ".$id." sfq perturb 10 ";
my $addr_bg_dl  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip dst 83.228.200.55".$ip." classid 1:0".$id."";

       $id = sprintf("%X", $ips + 0x400);
       my $class_int_ul = "tc class add dev $dev_int parent 1:25 classid 1:0".$id." htb rate ".$intmin."Kbit ceil ".$intmax."Kbit prio 4";
       my $qdisc_int_ul = "tc qdisc add dev $dev_int parent 1:0".$id." handle ".$id." sfq perturb 10 ";
my $addr_int_ul  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip src 83.228.200.".$ip." classid 1:0".$id."";

       $id = sprintf("%X", $ips + 0x300);
       my $class_int_dl = "tc class add dev $dev_ext parent 1:20 classid 1:0".$id." htb rate ".$intmin."Kbit ceil ".$intmax."Kbit prio 4";
       my $qdisc_int_dl = "tc qdisc add dev $dev_ext parent 1:0".$id." handle ".$id." sfq perturb 10 ";
my $addr_int_dl  = "/sbin/tc filter add dev $dev_int parent 1:0 protocol ip prio 100 u32 match ip dst 83.228.200.".$ip." classid 1:0".$id."";
  
  
       `$class_bg_ul`;
       `$qdisc_bg_ul`;
`$addr_bg_ul`;

`$class_int_ul`;
`$qdisc_int_ul`;
`$addr_int_ul`;

       `$class_bg_dl`;
       `$qdisc_bg_dl`;
`$addr_bg_dl`;

`$class_int_dl`;
`$qdisc_int_dl`;
`$addr_int_dl`;
   }
}


как бих могъл да направа 3,4 ип-та и да са ограничени на примерно 500кб/с.  благодаря за вниманието
Активен

Hapkoc

  • Напреднали
  • *****
  • Публикации: 2117
    • Профил
Помощ за шейпър
« Отговор #7 -: Sep 04, 2007, 23:39 »
Нали правиш разлика между KB/s и Kb/s?
Активен

Gaara

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian
  • Window Manager: E17
    • Профил
Помощ за шейпър
« Отговор #8 -: Sep 05, 2007, 01:44 »
Hapkoc е отново прав  '<img'>
Единственото нещо, което трябва да се промени е
Примерен код

my $rates_limit = "1000";

и според мен не се пипа default класа, защото ако не се лъжа, неизразходваният трафик от потребителите отива към този клас, а не се разпределя м/у тях (ако правилно съм разчел скрипта), т.е. не се ползва link sharing модела. От друга страна rate=ceil, т.е. вероятността да достигнеш максимума от 1000Kbit е доста малка (никаква) - лично мнение.

Ето още малко хинтове:
Примерен код

[gaara@debian ~]$ let 'a=1000/8';echo $a
125
[gaara@debian ~]$ let 'a=4000/8';echo $a
500
[gaara@debian ~]$
Активен

Last night, Darth Vader came down from planet Vulcan and told me that if you don't install Debian, he'd melt your brain.

rutera

  • Напреднали
  • *****
  • Публикации: 24
    • Профил
Помощ за шейпър
« Отговор #9 -: Sep 05, 2007, 07:28 »
Hapkoc  да знам разликата между двете и да обаркал сам се.Идеата ми беше следната имам FREE 80МBit BG и искам да го делна на 5 компютри  но както разбирате ако го пусна без шейпър даже може аз да не мога и един филм да смакна   '<img'>  .
А и другото беше че ми трябжа някакво скриптче дори да не е този които сам дал в по горните постове просто да разделя нета . Благодаря за вниманието
Активен

shadowx

  • Напреднали
  • *****
  • Публикации: 99
  • Distribution: Slackware
  • Window Manager: Gnome
    • Профил
Помощ за шейпър
« Отговор #10 -: Sep 06, 2007, 11:23 »
Примерен код

#!/bin/bash
# shape script
# GPLv2

p="p"
tc="/sbin/tc"
wc="/usr/bin/wc"
file1=/tmp/client.trafia1  ## Tarifa 1
file2=/tmp/client.trafia2  ## Tarifa 2
ieth="eth1"                  # In Interface
oeth1="eth0.73"           # Out interface
kbit="Kbit"

## Tarifa 1
echo -e "[*] Tarifa 256kbps"

n="1"
last=`$wc -l $file1|awk '{print $1}'`

while [ $n -le $last ]
    do {

np=$n$p
classid="1:$(( 9000+$n ))"
uip=`sed -n $np $file1`
speed=256                ## Client Speed
rate="$speed$kbit"
## ednata posoka...
    echo -e "[*] user = $uip , rate = $rate"
    $tc class add dev $ieth parent 1:1 classid $classid cbq bandwidth 10Mbit rate $rate weight 4Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
    $tc qdisc add dev $ieth parent $classid tbf rate $rate buffer 10Kb/8 limit 15Kb mtu 1500
    $tc filter add dev $ieth parent 1:0 protocol ip prio 100 u32 match ip dst $uip flowid $classid
## drugata poskoka....
    $tc class add dev $oeth1 parent 1:1 classid $classid cbq bandwidth 10Mbit rate $rate weight 4Kbit  prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
    $tc qdisc add dev $oeth1 parent $classid tbf rate $rate buffer 10Kb/8 limit 15Kb mtu 1500
    $tc filter add dev $oeth1 parent 1:0 protocol ip prio 100 u32 match ip src $uip flowid $classid

        }
    let "n=$n + 1" # Going to next line...
 done
## Tarifa 2
echo -e "[*] Tarifa 512kbps"
sleep 2

n="1"
last=`$wc -l $file2|awk '{print $1}'`
while [ $n -le $last ]
    do {

np=$n$p
classid="1:$(( 9900+$n ))"
uip=`sed -n $np $file2`
speed=2048              ## Client Speed
rate="$speed$kbit"

## ednata posoka
    echo -e "[*] user = $uip , rate = $rate"
    $tc class add dev $ieth parent 1:1 classid $classid cbq bandwidth 10Mbit rate $rate weight 4Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
    $tc qdisc add dev $ieth parent $classid tbf rate $rate buffer 10Kb/8 limit 15Kb mtu 1500
    $tc filter add dev $ieth parent 1:0 protocol ip prio 100 u32 match ip dst $uip flowid $classid
## drugata posoka
    $tc class add dev $oeth1 parent 1:1 classid $classid cbq bandwidth 10Mbit rate $rate weight 4Kbit  prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded
    $tc qdisc add dev $oeth1 parent $classid tbf rate $rate buffer 10Kb/8 limit 15Kb mtu 1500
    $tc filter add dev $oeth1 parent 1:0 protocol ip prio 100 u32 match ip src $uip flowid $classid

        }
    let "n=$n + 1" # Going to next line...
  done

exit 1;
## EOF

Ето ти примерен скрипт който изчита ИП-тата от 2 различни файла (всеки с описани ИП-та на различни скорости...).

Малко грозно написано , но върши работа....



Активен

There he goes. One of God's own prototypes. A high-powered mutant of some kind never even considered for mass production. Too weird to live, and too rare to die.

rutera

  • Напреднали
  • *****
  • Публикации: 24
    • Профил
Помощ за шейпър
« Отговор #11 -: Sep 06, 2007, 16:55 »
shadowx   дай ми пример какво трябва да садържат файловете мерси
Активен

Gaara

  • Напреднали
  • *****
  • Публикации: 631
  • Distribution: Debian
  • Window Manager: E17
    • Профил
Помощ за шейпър
« Отговор #12 -: Sep 07, 2007, 14:05 »
rutera, твоят скрипт е много добър, а и аз ти казах какво да направиш и каква стойност да сложиш, т.е. 4000.
Активен

Last night, Darth Vader came down from planet Vulcan and told me that if you don't install Debian, he'd melt your brain.

rutera

  • Напреднали
  • *****
  • Публикации: 24
    • Профил
Помощ за шейпър
« Отговор #13 -: Sep 07, 2007, 19:21 »
Gaara  за скипта знам но идеята ми е на 3-pc та да има им пусна 512К а на другите 3 по един мегабаит. ей това не мога да направа ако някой може да помага  ':ok:'
Активен

shadowx

  • Напреднали
  • *****
  • Публикации: 99
  • Distribution: Slackware
  • Window Manager: Gnome
    • Профил
Помощ за шейпър
« Отговор #14 -: Sep 07, 2007, 21:19 »
Example file1 :
Примерен код

192.168.1.2
192.168.1.3
192.168.1.5
Активен

There he goes. One of God's own prototypes. A high-powered mutant of some kind never even considered for mass production. Too weird to live, and too rare to die.