[technique] Partage de bande passante sur ligne ADSL

Cyril popolinux at gmail.com
Lun 5 Déc 10:52:01 CET 2011


Bonjour Laurent,

Merci pour ton travail.

Si je comprend bien :

    * La QoS sur le débit descendant est en place sur Paris car c'est le
      routeur Parisien qui collecte le flux et le renvoi par le biais du
      tunnel VPN ?

    * La QoS sur le débit descendant n'est pas encore gérée et doit être
      placée sur le serveur de routage local qui envoi le flux de
      données sur le GW à Paris ?


Dans le cas de St Gaudens, j'ai adapté un chouilla la syntaxe du script 
pour garder une cohérence avec ceux déjà en place.
Je le met en fin de mail, pour toutes fins utiles.

Sinon, est-t-il possible de flusher toutes les règles TC ?
Ce serait intéressant pour mon script.

Petite remarque :
Pour tapstg tu as mis "RATE=11000kbit" et pour les autres 
"DOWN=5500kbit", sans doute une erreur ?


-----

Script :

#!/bin/bash

IPTABLES=/sbin/iptables
ID_IP_QOS=1

function init_setup
{
         ip route add 10.0.0.0/24 dev eth0 table 200
         ip route add default via 10.0.0.253 table 200
         ip route add 91.224.148.1/32 via 10.0.0.253

         openvpn --mktun --dev-type tap --dev tapstg
         ip link set tapstg up
         openvpn --dev-type tap --dev tapstg --comp-lzo yes --cipher 
none --proto udp  --verb 3 --daemon --keepalive 10 30 --persist-tun 
--local 10.0.0.221 --remote 91.224.148.1 65005 --secret 
/root/static-65005.key --log-append /root/vpn-tapstg.log --mssfix 1400 
--fragment 1400
         #--log /dev/shm/vpn-65005.log
         ip addr add 91.224.148.7/31 dev tapstg

         echo 1 > /proc/sys/net/ipv4/ip_forward
         ip r add 0/1 via 91.224.148.6
         ip r add 128/1 via 91.224.148.6
}

function flush
{
         # Flush table NAT
         /sbin/iptables -t nat -F

         # Reset table conntrack
         /usr/sbin/conntrack -F

         # Vide la conf DHCP
         echo '' > /root/dhcp-list.conf
         echo '' > /var/www/ip2monitor.list
         echo '' > /etc/hosts_tetaneutral
}

function ip_mapping
{
         local ip_private=$1
         local ip_public=$2
         local mac_src=$3
         local description=$4
         local monitor=$5

         # Routage
         ip a add $ip_public/32 dev tapstg
         iptables -t nat -A PREROUTING -d $ip_public -j DNAT 
--to-destination $ip_private
         iptables -t nat -A POSTROUTING -s $ip_private -j SNAT 
--to-source $ip_public

         # Ecriture de la config DHCP
         {
                 echo "host $description {"
                 echo "  hardware ethernet $mac_src;"
                 echo "  fixed-address $ip_private;"
                 echo "}"
         } >> /root/dhcp-list.conf

         # Ecriture dans la lite des IP ? monitorer
         if [ $monitor = "yes" ]; then
                 echo $ip_private >> /var/www/ip2monitor.list
         fi

         # Ecriture du fichier hosts temporaire
         {
                 echo "$ip_public $description"
         } >> /etc/hosts_tetaneutral

         # Ajout de la QoS
         qos_by_ip_add_ip $ID_IP_QOS $ip_public 'src' 'tapstg' '700kbit'
         export ID_IP_QOS=$((ID_IP_QOS + 1))
}

function create_node
{
         local ip_local=$1
         local mac=$2
         local description=$3
         local monitor=$4

         # Ecriture de la config DHCP
         {
                 echo "host node-$description {"
                 echo "  hardware ethernet $mac;"
                 echo "  fixed-address $ip_local;"
                 echo "}"
         } >> /root/dhcp-list.conf

         # Ecriture dans la lite des IP ? monitorer
         if [ $monitor = "yes" ]; then
                 echo $ip_local >> /var/www/ip2monitor.list
         fi
}

function dhcp_write_conf
{
         {
                 echo "ddns-update-style none;"
                 echo "default-lease-time 600;"
                 echo "max-lease-time 86400;"
                 echo "log-facility local7;"
                 echo "subnet 172.16.0.0 netmask 255.255.0.0 {"
                 echo "  option domain-name \"tetaneutral.net\";"
                 echo "  option domain-name-servers 8.8.8.8;"
                 echo "  option routers 172.16.0.254;"
                 echo "  $(cat /root/dhcp-list.conf)";
                 echo "}"
         } > /etc/dhcp/dhcpd.conf

         /etc/init.d/isc-dhcp-server restart
}

function qos_by_ip_init {
         local dev=$1
         local rate=$2

         tc qdisc add dev $dev root handle 1: htb default 1
         tc class add dev $dev parent 1: classid 1:1 htb rate $rate
}

function qos_by_ip_add_ip {
         local id_host=$1
         local ip=$2
         local dir=$3
         local dev=$4
         local rate=$5

         echo "QoS IP $ip (id : $id_host) : $rate sur $dev";
         tc class add dev $dev parent 1: classid 1:$id_host htb rate $rate
         tc filter add dev $dev protocol ip parent 1:0 prio 1 u32 match 
ip $dir $ip flowid 1:$id_host
}

function maj_hosts
{
         {
                 cat /etc/hosts_system
                 cat /etc/hosts_tetaneutral
         } > /etc/hosts
}

# Parsing des arguments
if [ "--setup"  = "$1" ]
then    init_setup
fi

# Flush
flush

# Init la file QoS
qos_by_ip_init 'tapstg' '700kbit'

# Appel de la config
source /root/config.sh

# Ecriture de la config
dhcp_write_conf

# Ecriture du fichier hosts
maj_hosts





Le 04/12/2011 22:12, Laurent GUERBY a écrit :
> Bonsoir,
>
> Comme expliqué ici :
>
> http://lists.tetalab.org/pipermail/tetaneutral/2011-April/000129.html
>
> L'algorithme de gestion de file d'attente par défaut va equitablement
> repartir la bande passante par flux. Lors du partage d'une ligne ADSL
> par plusieurs utilisateurs un utilisateur ouvrant plus de connexions
> simultanées aura plus de flux et donc plus de bande passante, ce qui
> n'est pas tres "juste".
>
> De plus sur une ligne ADSL dépasser la capacité en bande passante va
> entrainer un ping tres elevé a cause des buffer des modems et routeurs,
> il est donc plus judicieux de limiter a la source le debit a une valeur
> legerement inferieure a la capacité de la ligne.
>
> Sur une ligne ADSL normale l'utilisateur va pouvoir controler facilement
> le debit montant mais plus difficilement le débit descendant qui depends
> de la politique de son FAI. Dans le cas de tetaneutral.net l'integralité
> du traffic descendant passe par notre routeur a Paris qui l'envoie dans
> un tunnel openvpn tap vers l'ADSL, nous pouvons donc le controler
> finement.
>
> J'ai mis quelques liens ici :
>
> http://chiliproject.tetaneutral.net/projects/tetaneutral/wiki/Buffer_Bloat
>
> Je propose d'appliquer le script suivant sur gw a Paris sur les trois
> tunnels (tapstg = Saint-Gaudens, tapthd = trebons.net, tapmon = Mones),
> et en changeant DIR et RATE sur les machines locales (upload
> a determiner).
>
> La seule astuce est l'utilisation du dernier octet de l'IP pour le
> classid (un nombre incrémenté aurait aussi fonctionné). Le script
> est relativement simple car la qdisc s'applique dans les deux
> sens sur les IP publiques directement (sauf erreur).
>
> <<
> function do_qos {
>    tc qdisc add dev $DEV root handle 1: htb default 1
>    tc class add dev $DEV parent 1: classid 1:1 htb rate $RATE
>    for IP in $IP_LIST; do
>      tc class add dev $DEV parent 1: classid 1:$IP htb rate $RATE
>      tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip $DIR 91.224.148.$IP flowid 1:$IP
>    done
> }
>
> DIR=dst #on gw then RATE= ADSL download speed
> #DIR=src #on local machine then RATE= ADSL upload speed
>
> DEV=tapstg
> RATE=11000kbit
> IP_LIST=$(seq 129 144)
> do_qos
>
> DEV=tapthd
> DOWN=5500kbit
> IP_LIST=$(seq 194 207)
> do_qos
>
> DEV=tapmon
> DOWN=600kbit
> IP_LIST=$(seq 114 115)
> do_qos
> Commentaires et suggestions bienvenus,
>
> Sincèrement,
>
> Laurent
>
>
> _______________________________________________
> technique mailing list
> technique at lists.tetaneutral.net
> http://lists.tetaneutral.net/listinfo/technique
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://lists.tetaneutral.net/pipermail/technique/attachments/20111205/106ea2fd/attachment.htm>


Plus d'informations sur la liste de diffusion technique