Controlar el ancho de banda: shaper, netfilter, tc.

Por Paco Aldarias Raya

Impreso: 20 de marzo 2005

Email: pacolinux arroba inicia punto es

Web: http://aldarias.es/pacodebian

Con Linux Debian. En Valencia (España)

El documento tiene version .html, y .pdf, cambiando en el navegador la parte final podrás acceder a ambos.

Este documento es de libre reproducción siempre que se cite su fuente.

Realizado con: LATEX

Índice General

1 Introducción

Vamos ver como podemos controlar el ancho de banda, por servicio o por ips.

2 Controlar la velocidad del servidor web: shaper

Traffic Shaper.

1.- Compilar el kernel con soporte de NETLINK y NETRTLINK y con estos módulos:

Module                  Size  Used by    Tainted: P  
  cls_u32                 4484   1
  sch_prio                2240   0 (unused)
  sch_sfq                 3328   0 (unused)
  sch_tbf                 2272   1
  sch_cbq                11552   1
  sch_gred                4448   0 (unused)
  sch_red                 2240   0 (unused)
  sch_teql                3328   0 (unused)
  sch_dsmark              3712   0 (unused)
  netlink_dev             1728   0 (unused)
  ip_queue                5140   0 (unused)

(y las opciones de kernel necesarias para poder marcarlos, como QoS y demás).

2.- Instalar el paquete SHAPER de debian, así como iproute:

apt-get install shaper iproute

3.- Crear el fichero /etc/shaper/cbq-10.http.network con este contenido:

   DEVICE=eth1,300Kbit,30Kbit
   RATE=80Kbit
   WEIGHT=8Kbit
   PRIO=4
   RULE=AQUI_MI_IP:80,

4.- Reiniciar shaper (/etc/init.d/shaper restart) y comprobar que va la web.

Como véis, de los 300Kbit que tengo le asigno 80Kbit (10KB/seg) al tráfico Web. Lo he probado y funciona perfectamente (más o menos). Si descargo yo un fichero voy a 10KB/seg. Si otra persona lo descarga simul- táneamente ambos bajamos a aprox 5KB/seg . Esto me deja libre otro ancho de banda para otros servicios :-)

Además se pueden poner reglas según la hora con TIME (en el fichero).

2.1 Script para shaper

Automatizarlo para que ono se pueda usar en ono:

cat shaper.sh

for l in \
cls_u32 \
sch_prio \
sch_sfq \
sch_tbf \
sch_cbq \
sch_gred \
sch_red \
sch_teql \
sch_dsmark \
netlink_dev \
ip_queue
do
/sbin/modprobe $l
done

#Saber la ip externa de Ono
INET_IP=`/sbin/ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -c  6-`

#Fichero Destino
f=/etc/shaper/cbq-10.http.network

#Contenido
echo DEVICE=eth0,600Kbit,30Kbit >$f
echo RATE=80Kbit >>$f
echo WEIGHT=8Kbit >>$f
echo PRIO=4 >>$f
echo RULE=$INET_IP:80, >>$f

/etc/init.d/shaper restart

2.2 Estado de shaper: /etc/init.d/shaper

/etc/init.d/shaper status

/etc/init.d/shaper compile

/sbin/tc qdisc del dev eth0 root
/sbin/tc qdisc add dev eth0 root handle 1 cbq bandwidth 600Kbit avpkt 1000 cell 8
/sbin/tc class change dev eth0 root cbq weight 30Kbit allot 1514

/sbin/tc class add dev eth0 parent 1: classid 1:10 cbq bandwidth 600Kbit rate 80Kbit weight 8Kbit prio 4 allot 1514 cell 8maxburst 20 avpkt 1000 bounded
/sbin/tc qdisc add dev eth0 parent 1:10 handle 10 tbf rate 80Kbit buffer 10Kb/8 limit 15Kb mtu 1500
/sbin/tc filter add dev eth0 parent 1:0 protocol ip prio 100 u32 match ip src 81.202.240.62 match ip sport 80 0xffff classid 1:10

Para la gente que se encuentra con el siguiente error "RTNETLINK answers: File exists ".Esto se da por que estan queriendo ingresar una banda ya ingresada. Deben borrar todo ,con el siguiente comando "tc qdisc del dev ethX root", donde X es la interfaz.

3 Control de ancho de banda dando prioridad al puerto 22: Netfilter

cat netfilter.sh

#!/bin/bash -x
# http://bulma.net/body.phtml?nIdNoticia=1727
# Creación del árbol de bandas

KbTotal=600
Kbssh=400
Kbresto=200

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: htb default 1 # Por defecto toda la información irá a la banda 1:1
tc class add dev eth0 parent 1: classid 1:1 htb rate 600kbps ceil 600kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 400kbps ceil 600kbps
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 200kbps ceil 600kbps prio 1 # Esta banda tiene menor prioridad y me$

# Asociación de colas sfq con bandas

tc qdisc add dev eth0 parent 1:10 handle 10: sfq
tc qdisc add dev eth0 parent 1:20 handle 20: sfq

# Se asocia la marca 1 con la banda 10

tc filter add dev eth0 protocol ip parent 1: handle 1 fw classid 1:10
tc filter add dev eth0 protocol ip parent 1: handle 1 fw classid 1:20


# Reglas de filtrado (se marca con un 1 a todos los paquetes destinados a un ftp)

iptables -A FORWARD -i eth0 -o eth0 -p tcp --dport 22 -t mangle -j MARK --set-mark 1
iptables -A FORWARD -i eth0 -o eth0 -p tcp --dport 1:100 -t mangle -j MARK --set-mark 2 # Se marca con 1 todos los paquete$

#iptables -A FORWARD -s 192.168.0.1 -i $DEV -t mangle -j MARK --set-mark 5

4 Control del ancho de banda: Minilancontrol

#!/bin/bash
#minilancontrol
#scrip para la gestion del ancho de banda en una minilan(256/128) por wless
#http://bulma.net/body.phtml?nIdNoticia=1727

DEV=eth1
RATEUP=160

case "$1" in
 start)
 #creaciuon del arbol de bandas
 tc qdisc add dev $DEV root handle 2: htb default 60
 tc class add dev $DEV parent 2: classid 2:1 htb rate 120kbps ceil ${RATEUP}kbps
 tc class add dev $DEV parent 2:5 classid 2:50 htb rate $[50*$RATEUP/100]kbps ceil ${RATEUP}kbps
 tc class add dev $DEV parent 2:6 classid 2:60 htb rate $[50*$RATEUP/100]kbps ceil ${RATEUP}kbps prio 1

 #tc class add dev $DEV parent 2:7 classid 2:70 htb rate $[4*$RATEUP/100]kbps ceil ${RATEUP}kbps prio 2

 #asociacion de colas sfq con bandas
 tc qdisc add dev $DEV parent 2:50 handle 50: sfq
 tc qdisc add dev $DEV parent 2:60 handle 60: sfq

 #tc qdisc add dev $DEV parent 3:70 handle 70: sfq

 #se asocian marcas con bandas
 tc filter add dev $DEV protocol ip parent 2: handle 5 fw classid 2:50
 tc filter add dev $DEV protocol ip parent 2: handle 6 fw classid 2:60

 #tc filter add dev $DEV protocol ip parent 3: handle 7 fw classid 3:70

 #reglas de filtrado
 iptables -A FORWARD -s 192.168.0.1 -i $DEV -t mangle -j MARK --set-mark 5
 iptables -A FORWARD -s 192.168.0.2 -i $DEV -t mangle -j MARK --set-mark 6

 #iptables -A FORWARD -s 192.168.1.0/24 -i $DEV -t mangle -j MARK --set-mark 7
 echo "MiniLanControl started"
 ;;
 stop)
 # borro la reglas de filtrado
 iptables -t mangle -F FORWARD 2> /dev/null > /dev/null
 iptables -t mangle -X FORWARD 2> /dev/null > /dev/null
 # borro las bandas
 tc qdisc del dev $DEV root 2> /dev/null > /dev/null
 tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null
 tc qdisc del dev $DEV root 2> /dev/null > /dev/null
 echo "MiniLanControl stoped"
 ;;
 restart)
 $0 stop
 $0 start
 ;;

 status)
 # muestro datos interesantes
 echo "[qdisc]"
 tc -s qdisc show dev $DEV
 echo "[class]"
 tc -s class show dev $DEV
 echo "[filter]"
 tc -s filter show dev $DEV
 echo " "
 echo "[iptables]"
 iptables -t mangle -L FORWARD -xnv
 exit
 ;;
 *)
 echo "Use: $0 {start|stop|restart|status}"
 ;;
 esac

 #fin

5 Bibliografia

  1. Método para la ecualización del ancho de banda
    http://bulma.net/body.phtml?nIdNoticia=1727
  2. Linux Advanced Routing & Traffic Control HOWTO
    http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/index.html

Índice de Materias

Sobre este documento...

Controlar el ancho de banda: shaper, netfilter, tc.

This document was generated using the LaTeX2HTML translator Version 2002-2-1 (1.70)

Copyright © 1993, 1994, 1995, 1996, Nikos Drakos, Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999, Ross Moore, Mathematics Department, Macquarie University, Sydney.

The command line arguments were:
latex2html anchobanda -split 0 -local_icons 1 -show_section_numbers -no_auto_link -no_navigation

The translation was initiated by on 2005-03-20


2005-03-20