<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#ffffff">
    Bonjour Laurent,<br>
    <br>
    Merci pour ton travail.<br>
    <br>
    Si je comprend bien :<br>
    <ul>
      <li>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 ?<br>
      </li>
    </ul>
    <ul>
      <li>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 ?<br>
      </li>
    </ul>
    <br>
    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.<br>
    Je le met en fin de mail, pour toutes fins utiles.<br>
    <br>
    Sinon, est-t-il possible de flusher toutes les règles TC ?<br>
    Ce serait intéressant pour mon script.<br>
    <br>
    Petite remarque :<br>
    Pour tapstg tu as mis "RATE=11000kbit" et pour les autres
    "DOWN=5500kbit", sans doute une erreur ?<br>
    <br>
    <br>
    -----<br>
    <br>
    Script :<br>
    <br>
    #!/bin/bash<br>
    <br>
    IPTABLES=/sbin/iptables<br>
    ID_IP_QOS=1<br>
    <br>
    function init_setup<br>
    {<br>
            ip route add 10.0.0.0/24 dev eth0 table 200<br>
            ip route add default via 10.0.0.253 table 200<br>
            ip route add 91.224.148.1/32 via 10.0.0.253<br>
    <br>
            openvpn --mktun --dev-type tap --dev tapstg<br>
            ip link set tapstg up<br>
            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<br>
            #--log /dev/shm/vpn-65005.log<br>
            ip addr add 91.224.148.7/31 dev tapstg<br>
    <br>
            echo 1 > /proc/sys/net/ipv4/ip_forward<br>
            ip r add 0/1 via 91.224.148.6<br>
            ip r add 128/1 via 91.224.148.6<br>
    }<br>
    <br>
    function flush<br>
    {<br>
            # Flush table NAT<br>
            /sbin/iptables -t nat -F<br>
    <br>
            # Reset table conntrack<br>
            /usr/sbin/conntrack -F<br>
    <br>
            # Vide la conf DHCP<br>
            echo '' > /root/dhcp-list.conf<br>
            echo '' > /var/www/ip2monitor.list<br>
            echo '' > /etc/hosts_tetaneutral<br>
    }<br>
    <br>
    function ip_mapping<br>
    {<br>
            local ip_private=$1<br>
            local ip_public=$2<br>
            local mac_src=$3<br>
            local description=$4<br>
            local monitor=$5<br>
    <br>
            # Routage<br>
            ip a add $ip_public/32 dev tapstg<br>
            iptables -t nat -A PREROUTING -d $ip_public -j DNAT
    --to-destination $ip_private<br>
            iptables -t nat -A POSTROUTING -s $ip_private -j SNAT
    --to-source $ip_public<br>
    <br>
            # Ecriture de la config DHCP    <br>
            {<br>
                    echo "host $description {"<br>
                    echo "  hardware ethernet $mac_src;"<br>
                    echo "  fixed-address $ip_private;"<br>
                    echo "}"<br>
            } >> /root/dhcp-list.conf<br>
    <br>
            # Ecriture dans la lite des IP � monitorer<br>
            if [ $monitor = "yes" ]; then<br>
                    echo $ip_private >> /var/www/ip2monitor.list<br>
            fi<br>
    <br>
            # Ecriture du fichier hosts temporaire<br>
            {<br>
                    echo "$ip_public $description"<br>
            } >> /etc/hosts_tetaneutral<br>
    <br>
            # Ajout de la QoS<br>
            qos_by_ip_add_ip $ID_IP_QOS $ip_public 'src' 'tapstg'
    '700kbit'<br>
            export ID_IP_QOS=$((ID_IP_QOS + 1))<br>
    }<br>
    <br>
    function create_node<br>
    {<br>
            local ip_local=$1<br>
            local mac=$2<br>
            local description=$3<br>
            local monitor=$4<br>
    <br>
            # Ecriture de la config DHCP<br>
            {<br>
                    echo "host node-$description {"<br>
                    echo "  hardware ethernet $mac;"<br>
                    echo "  fixed-address $ip_local;"<br>
                    echo "}"<br>
            } >> /root/dhcp-list.conf<br>
    <br>
            # Ecriture dans la lite des IP � monitorer<br>
            if [ $monitor = "yes" ]; then<br>
                    echo $ip_local >> /var/www/ip2monitor.list<br>
            fi<br>
    }<br>
    <br>
    function dhcp_write_conf<br>
    {<br>
            {<br>
                    echo "ddns-update-style none;"<br>
                    echo "default-lease-time 600;"<br>
                    echo "max-lease-time 86400;"<br>
                    echo "log-facility local7;"<br>
                    echo "subnet 172.16.0.0 netmask 255.255.0.0 {"<br>
                    echo "  option domain-name \"tetaneutral.net\";"<br>
                    echo "  option domain-name-servers 8.8.8.8;"<br>
                    echo "  option routers 172.16.0.254;"<br>
                    echo "  $(cat /root/dhcp-list.conf)";<br>
                    echo "}"<br>
            } > /etc/dhcp/dhcpd.conf<br>
    <br>
            /etc/init.d/isc-dhcp-server restart<br>
    }<br>
    <br>
    function qos_by_ip_init {<br>
            local dev=$1<br>
            local rate=$2<br>
    <br>
            tc qdisc add dev $dev root handle 1: htb default 1<br>
            tc class add dev $dev parent 1: classid 1:1 htb rate $rate<br>
    }<br>
    <br>
    function qos_by_ip_add_ip {<br>
            local id_host=$1<br>
            local ip=$2<br>
            local dir=$3<br>
            local dev=$4<br>
            local rate=$5<br>
    <br>
            echo "QoS IP $ip (id : $id_host) : $rate sur $dev";<br>
            tc class add dev $dev parent 1: classid 1:$id_host htb rate
    $rate<br>
            tc filter add dev $dev protocol ip parent 1:0 prio 1 u32
    match ip $dir $ip flowid 1:$id_host<br>
    }<br>
    <br>
    function maj_hosts<br>
    {<br>
            {<br>
                    cat /etc/hosts_system<br>
                    cat /etc/hosts_tetaneutral<br>
            } > /etc/hosts<br>
    }<br>
    <br>
    # Parsing des arguments<br>
    if [ "--setup"  = "$1" ]<br>
    then    init_setup<br>
    fi<br>
    <br>
    # Flush<br>
    flush<br>
    <br>
    # Init la file QoS<br>
    qos_by_ip_init 'tapstg' '700kbit'<br>
    <br>
    # Appel de la config<br>
    source /root/config.sh<br>
    <br>
    # Ecriture de la config<br>
    dhcp_write_conf<br>
    <br>
    # Ecriture du fichier hosts<br>
    maj_hosts<br>
    <br>
    <br>
    <br>
    <br>
    <br>
    Le 04/12/2011 22:12, Laurent GUERBY a écrit :
    <blockquote cite="mid:1323033153.3006.779.camel@pc2" type="cite">
      <pre wrap="">Bonsoir,

Comme expliqué ici :

<a class="moz-txt-link-freetext" href="http://lists.tetalab.org/pipermail/tetaneutral/2011-April/000129.html">http://lists.tetalab.org/pipermail/tetaneutral/2011-April/000129.html</a>

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 :

<a class="moz-txt-link-freetext" href="http://chiliproject.tetaneutral.net/projects/tetaneutral/wiki/Buffer_Bloat">http://chiliproject.tetaneutral.net/projects/tetaneutral/wiki/Buffer_Bloat</a>

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
</pre>
      <blockquote type="cite">
        <blockquote type="cite">
          <pre wrap="">
</pre>
        </blockquote>
      </blockquote>
      <pre wrap="">
Commentaires et suggestions bienvenus,

Sincèrement,

Laurent


_______________________________________________
technique mailing list
<a class="moz-txt-link-abbreviated" href="mailto:technique@lists.tetaneutral.net">technique@lists.tetaneutral.net</a>
<a class="moz-txt-link-freetext" href="http://lists.tetaneutral.net/listinfo/technique">http://lists.tetaneutral.net/listinfo/technique</a>
</pre>
    </blockquote>
  </body>
</html>