yKpon Posted March 6, 2008 Posted March 6, 2008 Здравствуйте уважаемые коллеги! Есть сервер под Linux с 3-мя интерфейсами (eth0, eth1 и eth2), к 2 интерфейсу подключены клиенты (192.168.0.0/24), направления разруливаются в 2 городские сети и направляются в интерфейсы 0 и 1. Часть клиентов работают через wi-fi, вот им надо ограничить исходящщий траффик приблизительно 128-256 килобит дабы не загружать им беспроводную сеть и таким образом сделать приоритет входящему траффику. Как это можно реализовать максимально просто без лишних наворотов? Жду Ваших советов! Вставить ник Quote
Ivan Rostovikov Posted March 6, 2008 Posted March 6, 2008 (edited) Надо понимать, что Вы не можете ограничить скорость, с которой абонент передает данные со своего wifi адаптера. Вы только можете ограничить скорость с которой данные полученые от абонента будут исходить c Вашего интерфейса. Если необходимо именно это. Используйте HTB дисциплину и маркируйте нужные пакеты с помощью iptables. Можно использовать U32. Неплохой пример есть тут:http://www.lan-net.ru/modules.php?name=News&file=article&sid=11 Edited March 6, 2008 by Ivan Rostovikov Вставить ник Quote
yKpon Posted March 6, 2008 Author Posted March 6, 2008 (edited) Ivan Rostovikov, совершенно верно, нужно проще говоря ограничить траффик исходящий в городские сети непосредственно на сервере который осуществляет маршрутизацию, а именно "достаёт" исходящий DC траффик (: Нашёл про HTB вот здесь http://blog.kovyrin.net/2006/04/06/5min-gu...ng-htb/lang/ru/ , сделал всё по инструкции запускаю и вижу [root@boss sbin][root@boss sbin]# /sbin/htb.init start : bad interpreter: Нет такого файла или каталога в чём грабли не могу найти... В htb.init не нужно ничего редактировать? Edited March 6, 2008 by yKpon Вставить ник Quote
user_anonymous Posted March 6, 2008 Posted March 6, 2008 Нужно почитать LARTCH Поиск в Google по LARTC Вставить ник Quote
Ivan Rostovikov Posted March 7, 2008 Posted March 7, 2008 Если Вы хотите использовать скрипт htb.init, посмотрите, что написано в 1-й строке. Вероятно У Вас интерпретатор находится в другом каталоге. Вставить ник Quote
yKpon Posted March 11, 2008 Author Posted March 11, 2008 была ошибка что не полностью скрипт скачан, качал правильно, теперь вот что [root@boss init.d]# ./htb.init start ./htb.init: line 758: /var/cache/htb.init: Is a directory **HTB: failed to compile HTB configuration! вот сам htb.init #!/bin/bash # # htb.init v0.8.5 # Copyright (C) 2002-2004 Lubomir Bulej <pallas@kadan.cz> # # chkconfig: 2345 11 89 # description: script to set up HTB traffic control # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # To get the latest version, check on Freshmeat for actual location: # #http://freshmeat.net/projects/htb.init # # # VERSION HISTORY # --------------- # v0.8.5- Nathan Shafer <nicodemus at users.sourceforge.net> # - allow symlins to class files #- Seth J. Blank <antifreeze at users.sourceforge.net> # - replace hardcoded ip/tc location with variables #- Mark Davis <mark.davis at gmx.de> # - allow setting of PRIO_{MARK,RULE,REALM} in class file # v0.8.4- Lubomir Bulej <pallas at kadan.cz> # - fixed small bug in RULE parser to correctly parse # rules with identical source and destination fields # - removed the experimental INJECT keyword # - ignore *~ backup files when looking for classes #- Mike Boyer <boyer at administrative.com> # - fix to allow arguments to be passed to "restart" command #- <face at pos.sk> # - fix to preserve class priority after timecheck # v0.8.3- Lubomir Bulej <pallas at kadan.cz> # - use LC_COLLATE="C" when sorting class files #- Paulo Sedrez # - fix time2abs to allow hours with leading zero in TIME rules # v0.8.2- Lubomir Bulej <pallas at kadan.cz> # - thanks to Hasso Tepper for reporting the following problems # - allow dots in interface names for use with VLAN interfaces # - fixed a thinko resulting from "cosmetic overdosage" :) # v0.8.1- Lubomir Bulej <pallas at kadan.cz> # - added function alternatives for sed/find with less features. To # enable them, you need to set HTB_BASIC to nonempty string. # - added posibility to refer to RATE/CEIL of parent class when # setting RATE/CEIL for child class. Look for "prate" or "pceil" # in the documentation. # - fixed broken "timecheck" invocation # v0.8- Lubomir Bulej <pallas at kadan.cz> # - simplified and converted CBQ.init 0.7 into HTB.init # - changed configuration file naming conventions # - lots of HTB specific changes # # # INTRODUCTION # ------------ # # This script is a clone of CBQ.init and is meant to simplify setup of HTB # based traffic control. HTB setup itself is pretty simple compared to CBQ, # so the purpose of this script is to allow the administrator of large HTB # configurations to manage individual classes using simple, human readable # files. # # The "H" in HTB stands for "hierarchical", so while many people did not use # (or know about) the possibility to build hierarchical structures using # CBQ.init, it should be obvious thing to expect from HTB.init :-) # # In HTB.init this is done differently, compared to CBQ.init: the usage of # PARENT keyword was dropped and instead, class file naming convetion was # introduced. This convention allows the child class to determine ID of its # parent class from the filename and also (if not abused :) enforces file # ordering so that the parent classes are created before their children. # # HTB.init uses simple caching mechanism to speed up "start" invocation if the # configuration is unchanged. When invoked for the first time, it compiles the # configuration files into simple shell script containing the sequence of "tc" # commands required to setup the traffic control. This cache-script is stored # in /var/cache/htb.init by default and is invalidated either by presence of # younger class config file, or by invoking HTB.init with "start invalidate". # # If you want to HTB.init to setup the traffic control directly without the # cache, invoke it with "start nocache" parameters. Caching is also disabled # if you have logging enabled (ie. HTB_DEBUG is not empty). # # If you only want HTB.init to translate your configuration to "tc" commands, # invoke it using the "compile" command. Bear in mind that "compile" does not # check if the "tc" commands were successful - this is done (in certain places) # only when invoked with "start nocache" command. When you are testing your # configuration, you should use it to check whether it is completely valid. # # In case you are getting strange sed/find errors, try to uncomment line with # HTB_BASIC setting, or set the variable to nonempty string. This will enable # function alternatives which require less advanced sed/find functionality. As # a result, the script will run slower but will probably run. Also the caching # will not work as expected and you will have to invalidate the cache manually # by invoking HTB.init with "start invalidate". # # # CONFIGURATION # ------------- # # Every traffic class is described by a single file in placed in $HTB_PATH # directory, /etc/sysconfig/htb by default. The naming convention is different # compared to CBQ.init. First notable change is missing 'htb-' prefix. This # was replaced by interface name to improve human readability and to separate # qdisc-only configuration. # # Global qdisc options are placed in $HTB_PATH/<ifname>, where <ifname> is # (surprisingly) name of the interface, made of characters and numbers. This # file must be present if you want to setup HTB on that interface. If you # don't have any options to put into it, leave it empty, but present. # # Class options belong to files with names matching this expression: # $HTB_PATH/<ifname>-<clsid>(:<clsid>)*<description> # # <clsid> is class ID which is hexadecimal number in range 0x2-0xFFFF, without # the "0x" prefix. If a colon-delimited list of class IDs is specified, the # last <clsid> in the list represents ID of the class in the config file. # # <clsid> preceding the last <clsid> is class ID of the parent class. To keep # ordering so that parent classes are always created before their children, it # is recommended to include full <clsid> path from root class to the leaf one. # # <description> is (almost) arbitrary string where you can put symbolic # class names for better readability. # # Examples of valid names: # #eth0-2root class with ID 2, on device eth0 #eth0-2:3child class with ID 3 and parent 2, on device eth0 #eth0-2:3:4child class with ID 4 and parent 3, on device eth0 #eth1-2.rootroot class with ID 2, on device eth1 # # # The configuration files may contain the following parameters. For detailed # description of HTB parameters see http://luxik.cdi.cz/~devik/qos/htb. # ### HTB qdisc parameters # # The following parameters apply to HTB root queuening discipline only and # are expected to be put into $HTB_PATH/<ifname> files. These files must # exist (even empty) if you want to configure HTB on given interface. # # DEFAULT=<clsid>optional, default 0 # DEFAULT=30 # #<dclsid> is ID of the default class where UNCLASSIFIED traffic goes. #Unlike HTB qdisc, HTB.init uses 0 as default class ID, which is #internal FIFO queue that will pass packets along at FULL speed! # #If you want to avoid surprises, always define default class and #allocate minimal portion of bandwidth to it. # # R2Q=<number>optional, default 10 # R2Q=100 # #This allows you to set coefficient for computing DRR (Deficit #Round Robin) quanta. The default value of 10 is good for rates #from 5-500kbps and should be increased for higher rates. # # DCACHE=yes|nooptional, default "no" # #This parameters turns on "dequeue cache" which results in degraded #fairness but allows HTB to be used on very fast network devices. #This is turned off by default. # ### HTB class parameters # # The following are parameters for HTB classes and are expected # to be put into $HTB_PATH/<ifname>-<clsid>(:<clsid>)*.* files. # # RATE=<speed>|prate|pceilmandatory # RATE=5Mbit # #Bandwidth allocated to the class. Traffic going through the class is #shaped to conform to specified rate. You can use Kbit, Mbit or bps, #Kbps and Mbps as suffices. If you don't specify any unit, bits/sec #are used. Also note that "bps" means "bytes per second", not bits. # #The "prate" or "pceil" values will resolve to RATE or CEIL of parent #class. This feature is meant to help humans to keep configuration #files consistent. # # CEIL=<speed>|prate|pceiloptional, default $RATE # CEIL=6MBit # #The maximum bandwidth that can be used by the class. The difference #between CEIL and RATE amounts to bandwidth the class can borrow, if #there is unused bandwidth left. # #By default, CEIL is equal to RATE so the class cannot borrow bandwidth #from its parent. If you want the class to borrow unused bandwidth, you #must specify the maximal amount it can use, if available. # #When several classes compete for the unused bandwidth, each of the #classes is given share proportional to their RATE. # # BURST=<bytes>optional, default computed # BURST=10Kb # # CBURST=<bytes>optional, default computed # CBURST=2Kb # #BURST and CBURST parameters control the amount of data that can #be sent from one class at maximum (hardware) speed before trying #to service other class. # #If CBURST is small (one packet size) it shapes bursts not to #exceed CEIL rate the same way PEAK works for TBF. # # PRIO=<number>optional, default 0 # PRIO=5 # #Priority of class traffic. The higher the number, the lesser the #priority. Also, classes with higher priority are offered excess #bandwidth first. # # LEAF=none|sfq|pfifo|bfifooptional, default "none" # #Tells the script to attach specified leaf queueing discipline to HTB #class. By default, no leaf qdisc is used. # #If you want to ensure (approximately) fair sharing of bandwidth among #several hosts in the same class, you should specify LEAF=sfq to attach #SFQ as leaf queueing discipline to the class. # # MTU=<bytes> optional, default "1600" # #Maximum packet size HTB creates rate maps for. The default should #be sufficient for most cases, it certainly is for Ethernet. # ### SFQ qdisc parameters # # The SFQ queueing discipline is a cheap way to fairly share class bandwidth # among several hosts. The fairness is approximate because it is stochastic, # but is not CPU intensive and will do the job in most cases. If you desire # real fairness, you should probably use WRR (weighted round robin) or WFQ # queueing disciplines. Note that SFQ does not do any traffic shaping - the # shaping is done by the HTB class the SFQ is attached to. # # QUANTUM=<bytes>optional, qdisc default # #Amount of data in bytes a stream is allowed to dequeue before next #queue gets a turn. Defaults to one MTU-sized packet. Do not set #this parameter below the MTU! # # PERTURB=<seconds>optional, default "10" # #Period of hash function perturbation. If unset, hash reconfiguration #will never take place which is what you probably don't want. The #default value of 10 seconds is probably a good value. # ### PFIFO/BFIFO qdisc parameters # # Those are simple FIFO queueing disciplines. They only have one parameter # which determines their length in bytes or packets. # # LIMIT=<packets>|<bytes>optional, qdisc default # LIMIT=1000 # #Number of packets/bytes the queue can hold. The unit depends on #the type of queue used. # ### Filtering parameters # # RULE=[[saddr[/prefix]][:port[/mask]],][daddr[/prefix]][:port[/mask]] # #These parameters make up "u32" filter rules that select traffic for #each of the classes. You can use multiple RULE fields per config. # #The optional port mask should only be used by advanced users who #understand how the u32 filter works. # # Some examples: # #RULE=10.1.1.0/24:80 #selects traffic going to port 80 in network 10.1.1.0 # #RULE=10.2.2.5 #selects traffic going to any port on single host 10.2.2.5 # #RULE=10.2.2.5:20/0xfffe #selects traffic going to ports 20 and 21 on host 10.2.2.5 # #RULE=:25,10.2.2.128/26:5000 #selects traffic going from anywhere on port 50 to #port 5000 in network 10.2.2.128 # #RULE=10.5.5.5:80, #selects traffic going from port 80 of single host 10.5.5.5 # # # # REALM=[srealm,][drealm] # #These parameters make up "route" filter rules that classify traffic #according to packet source/destination realms. For information about #realms, see Alexey Kuznetsov's IP Command Reference. This script #does not define any realms, it justs builds "tc filter" commands #for you if you need to classify traffic this way. # #Realm is either a decimal number or a string referencing entry in #/etc/iproute2/rt_realms (usually). # # Some examples: # #REALM=russia,internet #selects traffic going from realm "russia" to realm "internet" # #REALM=freenet, #selects traffic going from realm "freenet" # #REALM=10 #selects traffic going to realm 10 # # # # MARK=<mark> # #These parameters make up "fw" filter rules that select traffic for #each of the classes accoring to firewall "mark". Mark is a decimal #number packets are tagged with if firewall rules say so. You can #use multiple MARK fields per config. # # # Note:Rules for different filter types can be combined. Attention must be #paid to the priority of filter rules, which can be set below through #the PRIO_{RULE,MARK,REALM} variables. # ### Time ranging parameters # # TIME=[<dow><dow>.../]<from>-<till>;<rate>[/<burst>][,<ceil>[/<cburst>]] # TIME=60123/18:00-06:00;256Kbit/10Kb,384Kbit # TIME=18:00-06:00;256Kbit # #This parameter allows you to change class bandwidth during the day or #week. You can use multiple TIME rules. If there are several rules with #overlapping time periods, the last match is taken. The <rate>, <burst>, #<ceil> and <cburst> fields correspond to parameters RATE, BURST, CEIL #and CBURST. # #<dow> is single digit in range 0-6 and represents day of week as #returned by date(1). To specify several days, just concatenate the #digits together. # # # # TRIVIAL EXAMPLE # --------------- # # Consider the following example: # (taken from Linux Advanced Routing & Traffic Control HOWTO) # # You have a Linux server with total of 5Mbit available bandwidth. On this # machine, you want to limit webserver traffic to 5Mbit, SMTP traffic to 3Mbit # and everything else (unclassified traffic) to 1Kbit. In case there is unused # bandwidth, you want to share it between SMTP and unclassified traffic. # # The "total bandwidth" implies one top-level class with maximum bandwidth # of 5Mbit. Under the top-level class, there are three child classes. # # First, the class for webserver traffic is allowed to use 5Mbit of bandwidth. # # Second, the class for SMTP traffic is allowed to use 3Mbit of bandwidth and # if there is unused bandwidth left, it can use it but must not exceed 5Mbit # in total. # # And finally third, the class for unclassified traffic is allowed to use # 1Kbit of bandwidth and borrow unused bandwith, but must not exceed 5Mbit. # # If there is demand in all classes, each of them gets share of bandwidth # proportional to its default rate. If there unused is bandwidth left, they # (again) get share proportional to their default rate. # # Configuration files for this scenario: # --------------------------------------------------------------------------- # eth0eth0-2.rooteth0-2:10.wwweth0-2:20.smtpeth0-2:30.dfl # ------------------------------------------------------- # DEFAULT=30RATE=5MbitRATE=5MbitRATE=3MbitRATE=1Kbit #BURST=15kBURST=15kCEIL=5MbitCEIL=5Mbit #LEAF=sfqBURST=15kBURST=15k #RULE=*:80,LEAF=sfqLEAF=sfq #RULE=*:25 # --------------------------------------------------------------------------- # # Remember that you can only control traffic going out of your linux machine. # If you have a host connected to network and want to control its traffic on # the gateway in both directions (with respect to the host), you need to setup # traffic control for that host on both (or all) gateway interfaces. # # Enjoy. # ############################################################################# 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 HTB_PATH & HTB_CACHE settings HTB_PATH=${HTB_PATH:-/etc/sysconfig/htb} HTB_CACHE=${HTB_CACHE:-/var/cache/htb.init} ### Uncomment for sed/find with less features (useful for busybox) #HTB_BASIC="yes" ### Uncomment to enable logfile for debugging #HTB_DEBUG="/var/run/htb-$1" ### Modules to probe for. Uncomment the last HTB_PROBE ### line if you have QoS support compiled into kernel HTB_PROBE="sch_htb sch_sfq cls_fw cls_u32 cls_route" #HTB_PROBE="" ### Config keywords HTB_QDISC="DEFAULT\|DCACHE\|R2Q" HTB_CLASS="RATE\|CEIL\|BURST\|CBURST\|PRIO\|LEAF\|MTU" HTB_CLASS="$HTB_CLASS\|PRIO_RULE\|PRIO_MARK\|PRIO_REALM" HTB_CLASS="$HTB_CLASS\|LIMIT\|QUANTUM\|PERTURB" ############################################################################# ############################# SUPPORT FUNCTIONS ############################# ############################################################################# if [ -z "$HTB_BASIC" ]; then ### List of network devices all_device_list () { ip link show \ | sed -n "/^[0-9]/ { s/[[:space:]]//g; \ s/^[0-9]\+:\([^@-]\+\)\(@.\+\)\?:<.*/\1/; p; }" } # all_device_list ### Load & filter file $HTB_PATH/$1 htb_filter_file () { sed -n "s/#.*//; s/[^a-zA-Z0-9.,;:=/*-_]\+//g; \ /^[a-zA-Z0-9]\+=[a-zA-Z0-9.,:;/*-_]\+$/ p" $HTB_PATH/$1 } # htb_filter_file ### Parse class ID chain from file name htb_clsid_chain () { echo "${1#*-}" \ | sed -n "/^[0-9a-fA-F]/ { s/^\([0-9a-fA-F:]\+\).*/\1/; \ s/::/:/g; s/:$//; p; }" } # htb_clsid_chain ### List of classes in $HTB_PATH htb_class_list () { for dev in `htb_device_list`; do find $HTB_PATH \( -type f -or -type l \) \ -name "$dev-*" -not -name '*~' -maxdepth 1 \ -printf "%f\n"| sort done } # htb_class_list ### Gather $1 rules from $CFILE htb_cfile_rules () { echo "$CFILE"| sed -n "/^$1=/ { s/.*=//; p; }" } # htb_cfile_rules ### Validate cache against config files htb_valid_cache () { for dev in `htb_device_list`; do [ `find $HTB_PATH \( -type f -or -type l \) \ -name "$dev*" -maxdepth 1 -newer $HTB_CACHE| \ wc -l` -gt 0 ] && VALID=0 [ $VALID -ne 1 ] && break done } # htb_valid_cache ### Find class config for device $1, which is newer than cache htb_cache_older () { [ `find $HTB_PATH -type f -name "$1*" -maxdepth 1 \ -newer $HTB_CACHE| wc -l` -gt 0 ] && return 0 return 1 } # htb_cache_older ### Get current RATE and CEIL htb_class_state () { tc class show dev $1 \ | sed -n "s/[[:space:]]\+/ /g; /^class htb 1:$2 / \ { s/.*rate \(.\+\) burst.*/\1/; p; q; }" } # htb_class_state else ### Less feature-hungry versions of above functions all_device_list () { ip link show \ | grep "^[0-9]" \ | sed "s/[[:space:]]//g; \ s/^[0-9]\+:\([^@-]\+\)\(@.\+\)\?:<.*/\1/" } # all_device_list htb_filter_file () { sed 's/#.*//; s/[^a-zA-Z0-9.,;:=/*-_]\+//g' $HTB_PATH/$1 \ | grep '^[a-zA-Z0-9]\+=[a-zA-Z0-9.,;:/*-_]\+$' } # htb_filter_file htb_clsid_chain () { echo "${1#*-}" \ | grep '^[a-fA-F0-9]' \ | sed 's/^\([a-fA-F0-9:]\+\).*/\1/; s/::/:/g; s/:$//' } # htb_clsid_chain htb_class_list () { PFX=`echo "$HTB_PATH"| sed 's/\//\\\\\//g'` for dev in `htb_device_list`; do find $HTB_PATH -type f -name "$dev-*" \ | grep "^$HTB_PATH/$dev-[^/]\+[^~]$" \ | sed "s/$PFX\///" \ | sort done } # htb_class_list htb_cfile_rules () { echo "$CFILE"| grep "^$1="| cut -d"=" -f2 } # htb_cfile_rules htb_cache_older () { ### cache is always up-to-date return 1 } # htb_cache_older htb_class_state () { tc class show dev $1 \ | sed 's/[[:space:]]\+/ /g' \ | grep "^class htb 1:$2 " \ | sed 's/.*rate \(.\+\) burst.*/\1/' } # htb_class_state fi # HTB_BASIC ### List of HTB devices htb_device_list () { for dev in `all_device_list`; do [ -f $HTB_PATH/$dev ] && echo $dev done } # htb_device_list ### Remove root class from device $1 htb_device_off () { tc qdisc del dev $1 root 2> /dev/null } # htb_device_off ### Remove HTB from all devices htb_off () { for dev in `htb_device_list`; do htb_device_off $dev done } # htb_off ### Prefixed message htb_message () { echo -e "**HTB: $@" } # htb_message ### Failure message htb_failure () { htb_message "$@" exit 1 } # htb_failure ### Failure w/htb_off htb_fail_off () { htb_message "$@" htb_off exit 1 } # htb_fail_off ### Convert time to absolute value htb_time2abs () { local min=${1##*:}; min=${min##0} local hrs=${1%%:*}; hrs=${hrs##0} echo $[hrs*60 + min] } # htb_time2abs ### Display traffic control setup htb_show () { for dev in `all_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 } # htb_show ### Derive DEVICE, CLASS and PARENT from $1 ### Check validity of CLASS and PARENT class IDs ### Load class configuration from $HTP_PATH/$1 ### Configure class parameters from CFILE htb_load_class () { DEVICE=${1%%-*} CLSIDS=`htb_clsid_chain $1` CLASS=${CLSIDS##*:}; [ -z "$CLASS" ] && htb_fail_off "$1 has invalid class ID!" [ $[0x$CLASS] -lt 2 -o $[0x$CLASS] -gt 65535 ] && htb_fail_off "class ID of $1 must be in range 0x2-0xFFFF!" CLSIDS=${CLSIDS%$CLASS}; CLSIDS=${CLSIDS%:} PARENT=${CLSIDS##*:}; [ -n "$PARENT" ] && [ $[0x$PARENT] -lt 2 -o $[0x$PARENT] -gt 65535 ] && htb_fail_off "parent ID of $1 must be in range 0x2-0xFFFF!" CFILE=`htb_filter_file $1` ### Set defaults & load class MTU=""; LEAF=none; PERTURB=10 RATE=""; BURST=""; CEIL=""; CBURST="" PRIO=""; LIMIT=""; QUANTUM="" PRIO_RULE=$PRIO_RULE_DEFAULT PRIO_MARK=$PRIO_MARK_DEFAULT PRIO_REALM=$PRIO_REALM_DEFAULT eval `echo "$CFILE"| grep "^\($HTB_CLASS\)="` RNAME=""; CNAME="" ### Resolve RATE if needed [ "$RATE" = "prate" ] && RNAME=RATE_$PARENT [ "$RATE" = "pceil" ] && RNAME=CEIL_$PARENT [ -n "$RNAME" ] && RATE=${!RNAME} ### RATE is required [ -z "$RATE" ] && htb_fail_off "missing or unresolvable RATE in $1!" ### Resolve CEIL if needed [ "$CEIL" = "prate" ] && CNAME=RATE_$PARENT [ "$CEIL" = "pceil" ] && CNAME=CEIL_$PARENT [ -n "$CNAME" ] && CEIL=${!CNAME} ### Store CEIL & RATE for children eval RATE_$CLASS=$RATE eval CEIL_$CLASS=${CEIL:-$RATE} } # htb_load_class ############################################################################# #################################### INIT ################################### ############################################################################# ### Check iproute2 tools [ -x $TC -a -x $IP ] || htb_failure "iproute2 utilities not installed or executable!" ### Check $HTB_PATH directory [ -d $HTB_PATH -a -r $HTB_PATH -a -x $HTB_PATH ] || htb_failure "$HTB_PATH does not exist or is not readable!" ### ip/tc wrappers if [ "$1" = "compile" ]; then ### no module probing HTB_PROBE="" ip () { $IP "$@" } # ip ### echo-only version of "tc" command tc () { echo "$TC $@" } # tc elif [ -n "$HTB_DEBUG" ]; then echo -e "# `date`" > $HTB_DEBUG ### Logging version of "ip" command ip () { echo -e "\n# ip $@" >> $HTB_DEBUG $IP "$@" 2>&1 | tee -a $HTB_DEBUG } # ip ### Logging version of "tc" command tc () { echo -e "\n# tc $@" >> $HTB_DEBUG $TC "$@" 2>&1 | tee -a $HTB_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 $HTB_PROBE; do $MP $module || htb_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 "$HTB_DEBUG" ]; then VALID=1 ### validate the cache [ "$2" = "invalidate" -o ! -f $HTB_CACHE ] && VALID=0 [ $VALID -eq 1 ] && for dev in `htb_device_list`; do htb_cache_older $dev && VALID=0 [ $VALID -ne 1 ] && break done ### compile the config if the cache is invalid if [ $VALID -ne 1 ]; then $0 compile > $HTB_CACHE || htb_fail_off "failed to compile HTB configuration!" fi ### run the cached commands exec /bin/sh $HTB_CACHE 2> /dev/null fi ### Setup root qdisc on all configured devices DEVICES=`htb_device_list` [ -z "$DEVICES" ] && htb_failure "no configured devices found!" for dev in $DEVICES; do ### Retrieve root qdisc options DEFAULT=""; DCACHE=""; R2Q="" eval `htb_filter_file $dev| grep "^\($HTB_QDISC\)="` [ "$DCACHE" = "yes" ] && DCACHE="dcache" || DCACHE="" ### Remove old root qdisc from device htb_device_off $dev ### Setup root qdisc for the device tc qdisc add dev $dev root handle 1 htb \ default ${DEFAULT:-0} ${R2Q:+r2q $R2Q} $DCACHE || htb_fail_off "failed to set root qdisc on $dev!" [ "$1" = "compile" ] && echo done # dev ### Setup traffic classes (if configured) for classfile in `htb_class_list`; do htb_load_class $classfile ### Create the class tc class add dev $DEVICE parent 1:$PARENT classid 1:$CLASS \ htb rate $RATE ${CEIL:+ceil $CEIL} ${BURST:+burst $BURST} \ ${PRIO:+prio $PRIO} ${CBURST:+cburst $CBURST} ${MTU:+mtu $MTU} || htb_fail_off "failed to add class $CLASS with parent $PARENT on $DEVICE!" ### Create leaf qdisc if set if [ "$LEAF" != "none" ]; then if [ "$LEAF" = "sfq" ]; then LEAFPARM="${PERTURB:+perturb $PERTURB} ${QUANTUM:+quantum $QUANTUM}" elif [ "$LEAF" = "pfifo" -o "$LEAF" = "bfifo" ]; then LEAFPARM="${LIMIT:+limit $LIMIT}" else htb_fail_off "unknown leaf qdisc ($LEAF) in $classfile!" fi tc qdisc add dev $DEVICE \ parent 1:$CLASS handle $CLASS $LEAF $LEAFPARM || htb_fail_off "failed to add leaf qdisc to class $CLASS on $DEVICE!" fi ### Create fw filter for MARK fields for mark in `htb_cfile_rules MARK`; 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 `htb_cfile_rules REALM`; 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 `htb_cfile_rules RULE`; 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##*/} TIME_ABS=`htb_time2abs $TIME_NOW` ### Check all classes (if configured) for classfile in `htb_class_list`; do ### Load class and gather all TIME rules htb_load_class $classfile TIMESET=`htb_cfile_rules TIME` [ -z "$TIMESET" ] && continue MATCH=0; CHANGE=0 for timerule in $TIMESET; do ### 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=`htb_time2abs $BEG_TIME` END_ABS=`htb_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 time period matches, remember params and set MATCH flag if [ $TIME_ABS -ge $BEG_ABS -a $TIME_ABS -lt $END_ABS ]; then RATESPEC=${PARAMS%%,*}; CEILSPEC=${PARAMS##*,} [ "$RATESPEC" = "$CEILSPEC" ] && CEILSPEC="" NEW_RATE=${RATESPEC%%/*}; NEW_BURST=${RATESPEC##*/} [ "$NEW_RATE" = "$NEW_BURST" ] && NEW_BURST="" NEW_CEIL=${CEILSPEC%%/*}; NEW_CBURST=${CEILSPEC##*/} [ "$NEW_CEIL" = "$NEW_CBURST" ] && NEW_CBURST="" MATCH=1 fi done ### timerule ### Get current RATE and CEIL of a class read RATE_NOW JUNK CEIL_NOW <<-EOT `htb_class_state $DEVICE $CLASS` EOT [ -z "$RATE_NOW" -o -z "$CEIL_NOW" ] && continue ### Fill empty values if matched if [ $MATCH -ne 0 ]; then NEW_RATE=${NEW_RATE:-$RATE_NOW} NEW_CEIL=${NEW_CEIL:-$CEIL_NOW} NEW_BURST=${NEW_BURST:-$BURST} NEW_CBURST=${NEW_CBURST:-$CBURST} ### Force configured values if not matched else NEW_RATE=$RATE; NEW_CEIL=$CEIL NEW_BURST=$BURST; NEW_CBURST=$CBURST fi ### Check for RATE and CEIL changes [ "$RATE_NOW" != "$NEW_RATE" ] && CHANGE=1 [ "$CEIL_NOW" != "$NEW_CEIL" ] && CHANGE=1 ### If there are no changes, go for next class [ $CHANGE -eq 0 ] && continue ### Replace HTB class tc class change dev $DEVICE classid 1:$CLASS htb \ prio $PRIO rate $NEW_RATE ${NEW_CEIL:+ceil $NEW_CEIL} \ ${NEW_BURST:+burst $NEW_BURST} ${NEW_CBURST:+cburst $NEW_CBURST} htb_message "$TIME_NOW: change on $DEVICE:$CLASS ($RATE_NOW/$CEIL_NOW -> $NEW_RATE/$NEW_CEIL)" done ### class file ;; ############################################################################# ################################## THE REST ################################# ############################################################################# stop) htb_off ;; list) htb_show ;; stats) htb_show -s ;; restart) shift $0 stop $0 start "$@" ;; *) echo "Usage: `basename $0` {start|compile|stop|restart|timecheck|list|stats}" esac Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.