Титла: Traffic Shaper
Публикувано от: mozly в Jul 18, 2004, 22:25
ок знам ,че вероятно има много писано по темата и ако може някои да ме насочи към друга тема във форума или към статия
трябра ми ограничение на трафика имам нереално ип зад шлюз(с реално) и шлюза трябва да прави ограничение на трафика как ?
намерих iproute2 i tc но при tc class add dev eth0 parent 1: classid 1:1 htb rate 116kbit ми дава Еrror:Qdisc htb is classless htb е компилирано като модул и зареден
Ос: Slackware 9.0 ,kernel-2.6.1
Титла: Traffic Shaper
Публикувано от: kennedy в Jul 19, 2004, 06:54
Титла: Traffic Shaper
Публикувано от: в Jul 19, 2004, 13:16
cbq ще ти свърши чудесна работа.Потърси из сайта тук има доста писано по темата. Поздрави...
Титла: Traffic Shaper
Публикувано от: в Jul 19, 2004, 14:55
как да стартирам cbw.init имам един скрипт и искам да го пробвам cbq.init start не става
Титла: Traffic Shaper
Публикувано от: ivanatora в Jul 19, 2004, 23:16
Няма да стане само със скрипта, трябват ти и файлове с правила за шейпването. Примерни такива има в самия скрипт ако го разгледаш.
Титла: Traffic Shaper
Публикувано от: mozly в Jul 19, 2004, 23:30
нещо не схващам аз си направих собствено cbq да нямаш предвид ей това Примерен код | export LC_ALL=C
### Command locations TC=/sbin/tc IP=/sbin/ip MP=/sbin/modprobe
### Default filter priorities (must be different) PRIO_RULE_DEFAULT=${PRIO_RULE:-100} PRIO_MARK_DEFAULT=${PRIO_MARK:-200} PRIO_REALM_DEFAULT=${PRIO_REALM:-300}
### Default CBQ_PATH & CBQ_CACHE settings CBQ_PATH=${CBQ_PATH:-/etc/sysconfig/cbq} CBQ_CACHE=${CBQ_CACHE:-/var/cache/cbq.init}
### Uncomment to enable logfile for debugging #CBQ_DEBUG="/var/run/cbq-$1"
### Modules to probe for. Uncomment the last CBQ_PROBE ### line if you have QoS support compiled into kernel CBQ_PROBE="sch_cbq sch_tbf sch_sfq sch_prio" CBQ_PROBE="$CBQ_PROBE cls_fw cls_u32 cls_route" #CBQ_PROBE=""
### Keywords required for qdisc & class configuration CBQ_WORDS="DEVICE|RATE|WEIGHT|PRIO|PARENT|LEAF|BOUNDED|ISOLATED" CBQ_WORDS="$CBQ_WORDS|PRIO_MARK|PRIO_RULE|PRIO_REALM|BUFFER" CBQ_WORDS="$CBQ_WORDS|LIMIT|PEAK|MTU|QUANTUM|PERTURB"
############################################################################# ############################# SUPPORT FUNCTIONS ############################# #############################################################################
### Get list of network devices cbq_device_list () { ip link show| sed -n "/^[0-9]/ \ { s/^[0-9]\+: \([a-z0-9._]\+\)[:@].*/\1/; p; }" } # cbq_device_list
### Remove root class from device $1 cbq_device_off () { tc qdisc del dev $1 root 2> /dev/null } # cbq_device_off
### Remove CBQ from all devices cbq_off () { for dev in `cbq_device_list`; do cbq_device_off $dev done } # cbq_off
### Prefixed message cbq_message () { echo -e "**CBQ: $@" } # cbq_message
### Failure message cbq_failure () { cbq_message "$@" exit 1 } # cbq_failure
### Failure w/ cbq-off cbq_fail_off () { cbq_message "$@" cbq_off exit 1 } # cbq_fail_off
### Convert time to absolute value cbq_time2abs () { local min=${1##*:}; min=${min##0} local hrs=${1%%:*}; hrs=${hrs##0} echo $[hrs*60 + min] } # cbq_time2abs
### Display CBQ setup cbq_show () { for dev in `cbq_device_list`; do [ `tc qdisc show dev $dev| wc -l` -eq 0 ] && continue echo -e "### $dev: queueing disciplines\n" tc $1 qdisc show dev $dev; echo
[ `tc class show dev $dev| wc -l` -eq 0 ] && continue echo -e "### $dev: traffic classes\n" tc $1 class show dev $dev; echo
[ `tc filter show dev $dev| wc -l` -eq 0 ] && continue echo -e "### $dev: filtering rules\n" tc $1 filter show dev $dev; echo done } # cbq_show
### Check configuration and load DEVICES, DEVFIELDS and CLASSLIST from $1 cbq_init () { ### Get a list of configured classes CLASSLIST=`find $1 \( -type f -or -type l \) -name 'cbq-*' \ -not -name '*~' -maxdepth 1 -printf "%f\n"| sort` [ -z "$CLASSLIST" ] && cbq_failure "no configuration files found in $1!"
### Gather all DEVICE fields from $1/cbq-* DEVFIELDS=`find $1 \( -type f -or -type l \) -name 'cbq-*' \ -not -name '*~' -maxdepth 1| xargs sed -n 's/#.*//; \ s/[[:space:]]//g; /^DEVICE=[^,]*,[^,]*\(,[^,]*\)\?/ \ { s/.*=//; p; }'| sort -u` [ -z "$DEVFIELDS" ] && cbq_failure "no DEVICE field found in $1/cbq-*!"
### Check for different DEVICE fields for the same device DEVICES=`echo "$DEVFIELDS"| sed 's/,.*//'| sort -u` [ `echo "$DEVICES"| wc -l` -ne `echo "$DEVFIELDS"| wc -l` ] && cbq_failure "different DEVICE fields for single device!\n$DEVFIELDS" } # cbq_init
### Load class configuration from $1/$2 cbq_load_class () { CLASS=`echo $2| sed 's/^cbq-0*//; s/^\([0-9a-fA-F]\+\).*/\1/'` CFILE=`sed -n 's/#.*//; s/[[:space:]]//g; /^[[:alnum:]_]\+=[[:alnum:].,:;/*@-_]\+$/ p' $1/$2`
### Check class number IDVAL=`/usr/bin/printf "%d" 0x$CLASS 2> /dev/null` [ $? -ne 0 -o $IDVAL -lt 2 -o $IDVAL -gt 65535 ] && cbq_fail_off "class ID of $2 must be in range <0002-FFFF>!"
### Set defaults & load class RATE=""; WEIGHT=""; PARENT=""; PRIO=5 LEAF=tbf; BOUNDED=yes; ISOLATED=no BUFFER=10Kb/8; LIMIT=15Kb; MTU=1500 PEAK=""; PERTURB=10; QUANTUM=""
PRIO_RULE=$PRIO_RULE_DEFAULT PRIO_MARK=$PRIO_MARK_DEFAULT PRIO_REALM=$PRIO_REALM_DEFAULT
eval `echo "$CFILE"| grep -E "^($CBQ_WORDS)="`
### Require RATE/WEIGHT [ -z "$RATE" -o -z "$WEIGHT" ] && cbq_fail_off "missing RATE or WEIGHT in $2!"
### Class device DEVICE=${DEVICE%%,*} [ -z "$DEVICE" ] && cbq_fail_off "missing DEVICE field in $2!"
BANDWIDTH=`echo "$DEVFIELDS"| sed -n "/^$DEVICE,/ \ { s/[^,]*,\([^,]*\).*/\1/; p; q; }"`
### Convert to "tc" options PEAK=${PEAK:+peakrate $PEAK} PERTURB=${PERTURB:+perturb $PERTURB} QUANTUM=${QUANTUM:+quantum $QUANTUM}
[ "$BOUNDED" = "no" ] && BOUNDED="" || BOUNDED="bounded" [ "$ISOLATED" = "yes" ] && ISOLATED="isolated" || ISOLATED="" } # cbq_load_class
############################################################################# #################################### INIT ################################### #############################################################################
### Check for presence of ip-route2 in usual place [ -x $TC -a -x $IP ] || cbq_failure "ip-route2 utilities not installed or executable!"
### ip/tc wrappers if [ "$1" = "compile" ]; then ### no module probing CBQ_PROBE=""
ip () { $IP "$@" } # ip
### echo-only version of "tc" command tc () { echo "$TC $@" } # tc
elif [ -n "$CBQ_DEBUG" ]; then echo -e "# `date`" > $CBQ_DEBUG
### Logging version of "ip" command ip () { echo -e "\n# ip $@" >> $CBQ_DEBUG $IP "$@" 2>&1 | tee -a $CBQ_DEBUG } # ip
### Logging version of "tc" command tc () { echo -e "\n# tc $@" >> $CBQ_DEBUG $TC "$@" 2>&1 | tee -a $CBQ_DEBUG } # tc else ### Default wrappers ip () { $IP "$@" } # ip tc () { $TC "$@" } # tc fi # ip/tc wrappers
case "$1" in
############################################################################# ############################### START/COMPILE ############################### #############################################################################
start|compile)
### Probe QoS modules (start only) for module in $CBQ_PROBE; do $MP $module || cbq_failure "failed to load module $module" done
### If we are in compile/nocache/logging mode, don't bother with cache if [ "$1" != "compile" -a "$2" != "nocache" -a -z "$CBQ_DEBUG" ]; then VALID=1
### validate the cache [ "$2" = "invalidate" -o ! -f $CBQ_CACHE ] && VALID=0 if [ $VALID -eq 1 ]; then [ `find $CBQ_PATH -maxdepth 1 -newer $CBQ_CACHE| \ wc -l` -gt 0 ] && VALID=0 fi
### compile the config if the cache is invalid if [ $VALID -ne 1 ]; then $0 compile > $CBQ_CACHE || cbq_fail_off "failed to compile CBQ configuration!" fi
### run the cached commands exec /bin/sh $CBQ_CACHE 2> /dev/null fi
### Load DEVICES, DEVFIELDS and CLASSLIST cbq_init $CBQ_PATH
### Setup root qdisc on all configured devices for dev in $DEVICES; do ### Retrieve device bandwidth and, optionally, weight DEVTEMP=`echo "$DEVFIELDS"| sed -n "/^$dev,/ { s/$dev,//; p; q; }"` DEVBWDT=${DEVTEMP%%,*}; DEVWGHT=${DEVTEMP##*,} [ "$DEVBWDT" = "$DEVWGHT" ] && DEVWGHT=""
### Device bandwidth is required if [ -z "$DEVBWDT" ]; then cbq_message "could not determine bandwidth for device $dev!" cbq_failure "please set up the DEVICE fields properly!" fi
### Check if the device is there ip link show $dev &> /dev/null || cbq_fail_off "device $dev not found!"
### Remove old root qdisc from device cbq_device_off $dev
### Setup root qdisc + class for device tc qdisc add dev $dev root handle 1 cbq \ bandwidth $DEVBWDT avpkt 1000 cell 8
### Set weight of the root class if set [ -n "$DEVWGHT" ] && tc class change dev $dev root cbq weight $DEVWGHT allot 1514
[ "$1" = "compile" ] && echo done # dev
### Setup traffic classes for classfile in $CLASSLIST; do cbq_load_class $CBQ_PATH $classfile
### Create the class tc class add dev $DEVICE parent 1:$PARENT classid 1:$CLASS cbq \ bandwidth $BANDWIDTH rate $RATE weight $WEIGHT prio $PRIO \ allot 1514 cell 8 maxburst 20 avpkt 1000 $BOUNDED $ISOLATED || cbq_fail_off "failed to add class $CLASS with parent $PARENT on $DEVICE!"
### Create leaf qdisc if set if [ "$LEAF" = "tbf" ]; then tc qdisc add dev $DEVICE parent 1:$CLASS handle $CLASS tbf \ rate $RATE buffer $BUFFER limit $LIMIT mtu $MTU $PEAK elif [ "$LEAF" = "sfq" ]; then tc qdisc add dev $DEVICE parent 1:$CLASS handle $CLASS sfq \ $PERTURB $QUANTUM fi
### Create fw filter for MARK fields for mark in `echo "$CFILE"| sed -n '/^MARK/ { s/.*=//; p; }'`; do ### Attach fw filter to root class tc filter add dev $DEVICE parent 1:0 protocol ip \ prio $PRIO_MARK handle $mark fw classid 1:$CLASS done ### mark
### Create route filter for REALM fields for realm in `echo "$CFILE"| sed -n '/^REALM/ { s/.*=//; p; }'`; do ### Split realm into source & destination realms SREALM=${realm%%,*}; DREALM=${realm##*,} [ "$SREALM" = "$DREALM" ] && SREALM=""
### Convert asterisks to empty strings SREALM=${SREALM#\*}; DREALM=${DREALM#\*}
### Attach route filter to the root class tc filter add dev $DEVICE parent 1:0 protocol ip \ prio $PRIO_REALM route ${SREALM:+from $SREALM} \ ${DREALM:+to $DREALM} classid 1:$CLASS done ### realm
### Create u32 filter for RULE fields for rule in `echo "$CFILE"| sed -n '/^RULE/ { s/.*=//; p; }'`; do ### Split rule into source & destination SRC=${rule%%,*}; DST=${rule##*,} [ "$SRC" = "$rule" ] && SRC=""
### Split destination into address, port & mask fields DADDR=${DST%%:*}; DTEMP=${DST##*:} [ "$DADDR" = "$DST" ] && DTEMP=""
DPORT=${DTEMP%%/*}; DMASK=${DTEMP##*/} [ "$DPORT" = "$DTEMP" ] && DMASK="0xffff"
### Split up source (if specified) SADDR=""; SPORT="" if [ -n "$SRC" ]; then SADDR=${SRC%%:*}; STEMP=${SRC##*:} [ "$SADDR" = "$SRC" ] && STEMP=""
SPORT=${STEMP%%/*}; SMASK=${STEMP##*/} [ "$SPORT" = "$STEMP" ] && SMASK="0xffff" fi
### Convert asterisks to empty strings SADDR=${SADDR#\*}; DADDR=${DADDR#\*}
### Compose u32 filter rules u32_s="${SPORT:+match ip sport $SPORT $SMASK}" u32_s="${SADDR:+match ip src $SADDR} $u32_s" u32_d="${DPORT:+match ip dport $DPORT $DMASK}" u32_d="${DADDR:+match ip dst $DADDR} $u32_d"
### Uncomment the following if you want to see parsed rules #echo "$rule: $u32_s $u32_d"
### Attach u32 filter to the appropriate class tc filter add dev $DEVICE parent 1:0 protocol ip \ prio $PRIO_RULE u32 $u32_s $u32_d classid 1:$CLASS done ### rule
[ "$1" = "compile" ] && echo done ### classfile ;;
############################################################################# ################################# TIME CHECK ################################ #############################################################################
timecheck)
### Get time + weekday TIME_TMP=`date +%w/%k:%M` TIME_DOW=${TIME_TMP%%/*} TIME_NOW=${TIME_TMP##*/}
### Load DEVICES, DEVFIELDS and CLASSLIST cbq_init $CBQ_PATH
### Run through all classes for classfile in $CLASSLIST; do ### Gather all TIME rules from class config TIMESET=`sed -n 's/#.*//; s/[[:space:]]//g; /^TIME/ { s/.*=//; p; }' \ $CBQ_PATH/$classfile` [ -z "$TIMESET" ] && continue
MATCH=0; CHANGE=0 for timerule in $TIMESET; do TIME_ABS=`cbq_time2abs $TIME_NOW` ### Split TIME rule to pieces TIMESPEC=${timerule%%;*}; PARAMS=${timerule##*;} WEEKDAYS=${TIMESPEC%%/*}; INTERVAL=${TIMESPEC##*/} BEG_TIME=${INTERVAL%%-*}; END_TIME=${INTERVAL##*-}
### Check the day-of-week (if present) [ "$WEEKDAYS" != "$INTERVAL" -a \ -n "${WEEKDAYS##*$TIME_DOW*}" ] && continue
### Compute interval boundaries BEG_ABS=`cbq_time2abs $BEG_TIME` END_ABS=`cbq_time2abs $END_TIME`
### Midnight wrap fixup if [ $BEG_ABS -gt $END_ABS ]; then [ $TIME_ABS -le $END_ABS ] && TIME_ABS=$[TIME_ABS + 24*60]
END_ABS=$[END_ABS + 24*60] fi
### If the time matches, remember params and set MATCH flag if [ $TIME_ABS -ge $BEG_ABS -a $TIME_ABS -lt $END_ABS ]; then TMP_RATE=${PARAMS%%/*}; PARAMS=${PARAMS#*/} TMP_WGHT=${PARAMS%%/*}; TMP_PEAK=${PARAMS##*/}
[ "$TMP_PEAK" = "$TMP_WGHT" ] && TMP_PEAK="" TMP_PEAK=${TMP_PEAK:+peakrate $TMP_PEAK}
MATCH=1 fi done ### timerule
cbq_load_class $CBQ_PATH $classfile
### Get current RATE of CBQ class RATE_NOW=`tc class show dev $DEVICE| sed -n \ "/cbq 1:$CLASS / { s/.*rate //; s/ .*//; p; q; }"` [ -z "$RATE_NOW" ] && continue
### Time interval matched if [ $MATCH -ne 0 ]; then
### Check if there is any change in class RATE if [ "$RATE_NOW" != "$TMP_RATE" ]; then NEW_RATE="$TMP_RATE" NEW_WGHT="$TMP_WGHT" NEW_PEAK="$TMP_PEAK" CHANGE=1 fi
### Match not found, reset to default RATE if necessary elif [ "$RATE_NOW" != "$RATE" ]; then NEW_WGHT="$WEIGHT" NEW_RATE="$RATE" NEW_PEAK="$PEAK" CHANGE=1 fi
### If there are no changes, go for next class [ $CHANGE -eq 0 ] && continue
### Replace CBQ class tc class replace dev $DEVICE classid 1:$CLASS cbq \ bandwidth $BANDWIDTH rate $NEW_RATE weight $NEW_WGHT prio $PRIO \ allot 1514 cell 8 maxburst 20 avpkt 1000 $BOUNDED $ISOLATED
### Replace leaf qdisc (if any) if [ "$LEAF" = "tbf" ]; then tc qdisc replace dev $DEVICE handle $CLASS tbf \ rate $NEW_RATE buffer $BUFFER limit $LIMIT mtu $MTU $NEW_PEAK fi
cbq_message "$TIME_NOW: class $CLASS on $DEVICE changed rate ($RATE_NOW -> $NEW_RATE)" done ### class file ;;
############################################################################# ################################## THE REST ################################# #############################################################################
stop) cbq_off ;;
list) cbq_show ;;
stats) cbq_show -s ;;
restart) shift $0 stop $0 start "$@" ;;
*) echo "Usage: `basename $0` {start|compile|stop|restart|timecheck|list|stats}" esac
|
Титла: Traffic Shaper
Публикувано от: Unseen в Jul 20, 2004, 14:42
Какво съобщение ти изписва? Трябва да компилираш ядро с потдръжка на cbq,данеби да си пропуснал този момент? Самият файл (cbq) е и хелп разгледай го добре.Във него пише какво да съдържа конф-файла и в коя директория да го поставиш. Ако има нещо питай,но първо се опитай сам да се справиш все ще научиш нещо ново Пздрави..
Титла: Traffic Shaper
Публикувано от: в Jul 20, 2004, 15:49
точно този хелп разгледах и по него се ориентирвам
кънъла поддържа cbq и htb.
там пише да се сложи в
/var/cache/cbq.my_first_try
и след това да се стартира със cbq.my_first_try start и други опции за стартирване без кеширане и т.н.
Титла: Traffic Shaper
Публикувано от: Unseen в Jul 20, 2004, 20:54
Титла: Traffic Shaper
Публикувано от: в Jul 20, 2004, 21:18
ето за какво става въпрос направих си собствено cbq Примерен код | #MY cbq.init
DECICE=eth0:1,100Mbps,10Mbps RATE=128Kbps WEIGHT=200Kbps PRIO=5 RULE=192.168.0.2
|
сега ако може едно обяснение как да го пусна. стъпка по стъпка ако е възможно.
Титла: Traffic Shaper
Публикувано от: ivanatora в Jul 21, 2004, 08:54
Понеже със CBQ може да се контролира само скоростта на ъплоуд ти трябват две правила за всеки хост, като всяко от тях се 'закача' за една от лан картите на шлюза. Няма да е зле да намалиш скоростта (128кпбс) , защото ако интернета ти е слаб, това ограничение въобще няма да се усети и пак ще изяждаш целия канал. Ето ти двата примерни файла с правила: cbq-100: Примерен код | DEVICE=eth1,10Mbit,1Mbit RATE=40Kbit WEIGHT=4Kbit PRIO=5 RULE=10.10.10.2
|
cbq-101:
Примерен код | DEVICE=eth0,10Mbit,1Mbit RATE=40Kbit WEIGHT=4Kbit PRIO=5 RULE=10.10.10.2,
|
Имената на файловете са случайно избрани (макар че е хубаво да има някаква идеология в имената им ) При мен eth0 е външния интерфейс (към доставчика), а eth1 - към домашната мрежичка. Горното реже около скоростти 4KB/s. Гледай по принцип RATE=10xWEIGHT. Като си направиш файловете с правилата (забележи запетаята на края на втория, да не кажеш че са били еднакви ) ги бухаш в /etc/sysconfig/cbq (ако не си указал друга папка в скрипта) и правиш cbq.init compile cbq.init start cbq.init list Ако последното ти изкара редове с правила значи е добре. Дерзай
Титла: Traffic Shaper
Публикувано от: в Jul 21, 2004, 10:19
Ivanatore a ako startirash skripta (cbq.init start) bez kompilaciq (cbq.init compile)??? Kakva e razlikata shte mi obiasnish li??? Izviniavam se za latinicata.
Титла: Traffic Shaper
Публикувано от: mozly в Jul 21, 2004, 15:33
Цитат (ivanatora @ Юли 21 2004,11:54) | ги бухаш в /etc/sysconfig/cbq (ако не си указал друга папка в скрипта) и правиш cbq.init compile cbq.init start cbq.init list Ако последното ти изкара редове с правила значи е добре. Дерзай |
зa какъв скрипт става въпрос нещо хич ме няма
Титла: Traffic Shaper
Публикувано от: в Jul 21, 2004, 22:06
за кой скрипт говорим тук според теб? познай от три пъти 1.cbq.init 2.cbq.init или 3.cbq.init Ха сега да видим дали ще познаеш...
Титла: Traffic Shaper
Публикувано от: ivanatora в Jul 22, 2004, 09:11
Незнаен: мисля че compile чете конфигурациите, от тези конфигурации си прави tc командите и ги кешира някъде. После със всеки следващ start ги изпълнява. А инак ако нямаш compile при всеки start конфигурациите се обръщат наново в tc. Мисля че се ускорява старта, не знам точно. Не съм го пробвал до сега без compile.
Титла: Traffic Shaper
Публикувано от: в Jul 22, 2004, 23:09
в момента проблема е ,че след
cbq.init compile -bash: cbq.init: command not found
еи това става
Титла: Traffic Shaper
Публикувано от: в Jul 23, 2004, 02:29
човече аз не съм навътре в нещата но поне елементарните неща знам.Вземи прочети някоя книжка за Линукс.Защото се получава един такъв момент в който ти не разбираш какви съвети ти дават.
За да "намери командата" влизаш в дир. кадето ти е файла cbq.init и пишеш: ./cbq.init compile (или командата която искаш) Преди това трябва да го направиш изпълним.
Титла: Traffic Shaper
Публикувано от: mozly в Jul 23, 2004, 13:52
аааааааааааааааааа ясноо 10х как можах така да забравя 10ь мноо що се отнася до книжките прочел съм вече
|