Forum LinuxFr.questions [RESOLU][PROXY+bandwidth shaping]: iptables et connbytes

Posté par .
Tags : aucun
5
14
mar.
2011

Bonjour a tous,

Je dois installer un serveur proxy sur le réseau. Tous les utilisateurs devront utilisé le proxy pour pouvoir surfer sur Internet. La raison de l'installation de ce serveur est de pouvoir empêché qu'un utilisateur ne monopolisé la bande passante vers Internet pour des téléchargements inutiles.

EXISTANT:

  • Serveur proxy Squid tournant sur un serveur Linux Centos.
  • iptables 5.3.2.el5 fraichement installer avec le fichier .so pour connbytes qui va bien dans le dossier /lib64/iptables.

OBJECTIF:

Réduire le débits de téléchargements des utilisateurs qui télécharge un fichier de plus de 100MB. Le reste n'a pas de limite.

PRINCIPE:

Après de longue recherche j'ai trouvé que la meilleur façon de le faire était la suivante:

  1. Marqué tous les paquets en 0x10.

  2. Marqué tous les paquets issue d'un téléchargement de plus de 100MB en 0x20.

  3. En utilisant la commande tc, faire deux classes, une avec un débits trés grand,
    l'autre avec un débits plus petit.

  4. Faire en sorte que tous les paquets marqué 0x10 soit appliqué à la classe 10 (pas de limite) et tous les paquets marqué 0x20 à l'autre classe 20.

SOURCES:

C'est quoi connbytes ? ici

Commandes tc : ici

CONFIG:

$IPTABLES -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 10
# 50Mb = 52428800
#$IPTABLES -t mangle -A OUTPUT -p tcp -o eth0 --sport 3128 -j MARK --set-mark 20
$IPTABLES -t mangle -A OUTPUT -p tcp -o eth0 --sport 3128 -m connbytes --connbytes 5242880: --connbytes-dir both  --connbytes-mode bytes -j MARK --set-mark 20

tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1:1  classid 1:10 htb \
    rate 99999kbit ceil 9999999999kbit prio 1
tc class add dev eth0 parent 1:1  classid 1:20 htb \
    rate 80kbit ceil 80kbit prio 2
#tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
#tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 20
tc filter add dev eth0 parent 1:0 protocol ip handle 10 fw flowid 1:10
tc filter add dev eth0 parent 1:0 protocol ip handle 20 fw flowid 1:20

RESULTAT:

Aucune limitation ne se fait quand un utilisateur télécharge. Quand j'essaye la règle iptables sans les options connbytes, tous le trafic est réduit a +/- 80kbits. Ce qui n'est pas ce que je veux.

Donc a priori, les commande tc fonctionne correctement mais les options connbytes ne semble pas fonctionné :(

Donc,
Est ce que la logique est correct ?
Est ce que la règles iptables est correctement utilisé ? Est ce que c'est bien en OUPUT ?

Merci d'avance

  • # POSTROUTING à la place de OUTPUT

    Posté par . Évalué à 2.

    J'ai fait globalement la même chose et je suis partie de cet exemple:

    http://www.mail-archive.com/lartc@mailman.ds9a.nl/msg16330/traffic-shaper

    La modification dans ton script serait la suivante (sans certitude):

    iptables -t mangle -A POSTROUTING -p tcp -o eth0 --sport 3128 -m connbytes --connbytes 5242880: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 20
    
  • # Web

    Posté par (page perso) . Évalué à 2.

    Tous les utilisateurs devront utilisé le proxy pour pouvoir surfer sur Internet.

    Vu ce que tu décris après, je dirais plutôt que tes utilisateurs devront utiliser le proxy pour pouvoir surfer sur le web.

    Parce que si c'est un proxy Internet générique, que tu cherches, Squid ne fera pas l'affaire, il vaudrait mieux chercher des outils comme le protocole SOCKS.

  • # [RESOLU]

    Posté par . Évalué à 1.

    @seb: POSTROUTING à la place de OUTPUT ne change rien dans mon cas. C'est normal puisque POSTROUTING arrive après OUTPUT, si ça fonctionne pas avec OUTPUT ça marchera encore moins avec POSTROUTING sauf pour les paquets FORWARD biensur mais comme c'est l'upload du serveur proxy que je veux ralentir les paquets FORWARD ne m'intéresse pas dans mon cas. Néammoins merçi pour le lien je l'ai étudié en détails et trouvé la différence qui apparement était la cause de mon problème. J'utilisais la file htb a la place de hfsc. Maintenant ça fonctionne parfaitement.

    @Tanguy Ortolo: oui les utilisateurs devront utiliser le proxy pour pouvoir surfer sur le web.

    Voici mon script finale pour ceux que ça intéresse:

    #!/bin/sh
    
    start(){
        stop
        echo -e "    [TC]      : DEFAULT CLASS ROOT";
        tc qdisc add dev eth0 root handle 1: hfsc default 10
    
        tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate \
            999999999kbit ul rate 999999999kbit
    
        echo -e "    [TC]      : CLASS 10 SET SPEED 999999999kbit/s";
        tc class add dev eth0 parent 1:1  classid 1:10 hfsc \
        sc rate 999999999kbit ul rate 999999999kbit
    
        echo -e "    [IPTABLES]: DOWNLOAD > 100MB ==> MARK 0x14";
        echo -e "    [TC]      : CLASS 20 SET SPEED 9000kbit/s";
        tc class add dev eth0 parent 1:1  classid 1:20 hfsc \
            sc rate 9000kbit ul rate 9000kbit
    
        echo -e "    [TC]      : ASSOCIATE PKT MARK 0xa TO CLASS 10";
        tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
        echo -e "    [TC]      : ASSOCIATE PKT MARK 0x14 TO CLASS 20"; 
        tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
    }
    stop(){
        tc qdisc del dev eth0 root    2> /dev/null > /dev/null;
        tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null;
    } 
    
    case "$1" in
        start)
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            echo -e "\033[1;31mStarting bandwidth shaping ...\033[00m";
            start
            echo -e "\033[1;31m[DONE]\033[00m";
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            ;;
        stop)
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            echo -e "\033[1;31mStopping bandwidth shaping ...\033[00m";
            echo -e "    [TC]      : DELETE THE ROOT QDISC";
            stop
            echo -e "\033[1;31m[DONE]\033[00m";
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            ;;
        restart)
            $0 stop
            $0 start
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            ;;
    esac
    
    exit 0;
    
  • # [RESOLU]

    Posté par . Évalué à 0.

    @seb: POSTROUTING à la place de OUTPUT ne change rien dans mon cas. C'est normal puisque POSTROUTING arrive après OUTPUT, si ça fonctionne pas avec OUTPUT ça marchera encore moins avec POSTROUTING sauf pour les paquets FORWARD biensur mais comme c'est l'upload du serveur proxy que je veux ralentir les paquets FORWARD ne m'intéresse pas dans mon cas. Néammoins merçi pour le lien je l'ai étudié en détails et trouvé la différence qui apparement était la cause de mon problème. J'utilisais la file htb a la place de hfsc. Maintenant ça fonctionne parfaitement.

    @Tanguy Ortolo: oui les utilisateurs devront utiliser le proxy pour pouvoir surfer sur le web.

    Voici mon script finale pour ceux que ça intéresse: @seb: POSTROUTING à la place de OUTPUT ne change rien dans mon cas. C'est normal puisque POSTROUTING arrive après OUTPUT, si ça fonctionne pas avec OUTPUT ça marchera encore moins avec POSTROUTING sauf pour les paquets FORWARD biensur mais comme c'est l'upload du serveur proxy que je veux ralentir les paquets FORWARD ne m'intéresse pas dans mon cas. Néammoins merçi pour le lien je l'ai étudié en détails et trouvé la différence qui apparement était la cause de mon problème. J'utilisais la file htb a la place de hfsc. Maintenant ça fonctionne parfaitement.

    @Tanguy Ortolo: oui les utilisateurs devront utiliser le proxy pour pouvoir surfer sur le web.

    Voici mon script finale pour ceux que ça intéresse:

    #!/bin/sh
    
    start(){
        stop
        echo -e "    [TC]      : DEFAULT CLASS ROOT";
        tc qdisc add dev eth0 root handle 1: hfsc default 10
    
        tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate \
            999999999kbit ul rate 999999999kbit
    
        echo -e "    [TC]      : CLASS 10 SET SPEED 999999999kbit/s";
        tc class add dev eth0 parent 1:1  classid 1:10 hfsc \
        sc rate 999999999kbit ul rate 999999999kbit
    
        echo -e "    [IPTABLES]: DOWNLOAD > 100MB ==> MARK 0x14";
        echo -e "    [TC]      : CLASS 20 SET SPEED 9000kbit/s";
        tc class add dev eth0 parent 1:1  classid 1:20 hfsc \
            sc rate 9000kbit ul rate 9000kbit
    
        echo -e "    [TC]      : ASSOCIATE PKT MARK 0xa TO CLASS 10";
        tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
        echo -e "    [TC]      : ASSOCIATE PKT MARK 0x14 TO CLASS 20"; 
        tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
    }
    stop(){
        tc qdisc del dev eth0 root    2> /dev/null > /dev/null;
        tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null;
    } 
    
    case "$1" in
        start)
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            echo -e "\033[1;31mStarting bandwidth shaping ...\033[00m";
            start
            echo -e "\033[1;31m[DONE]\033[00m";
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            ;;
        stop)
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            echo -e "\033[1;31mStopping bandwidth shaping ...\033[00m";
            echo -e "    [TC]      : DELETE THE ROOT QDISC";
            stop
            echo -e "\033[1;31m[DONE]\033[00m";
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            ;;
        restart)
            $0 stop
            $0 start
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            ;;
    esac
    
    exit 0;
    
  • # [RESOLU]

    Posté par . Évalué à 0.

    @seb: POSTROUTING à la place de OUTPUT ne change rien dans mon cas. C'est normal puisque POSTROUTING arrive après OUTPUT, si ça fonctionne pas avec OUTPUT ça marchera encore moins avec POSTROUTING sauf pour les paquets FORWARD biensur mais comme c'est l'upload du serveur proxy que je veux ralentir les paquets FORWARD ne m'intéresse pas dans mon cas. Néammoins merçi pour le lien je l'ai étudié en détails et trouvé la différence qui apparement était la cause de mon problème. J'utilisais la file htb a la place de hfsc. Maintenant ça fonctionne parfaitement.

    @Tanguy Ortolo: oui les utilisateurs devront utiliser le proxy pour pouvoir surfer sur le web.

    Voici mon script finale pour ceux que ça intéresse:

    #!/bin/sh
    
    start(){
        stop
        echo -e "    [TC]      : DEFAULT CLASS ROOT";
        tc qdisc add dev eth0 root handle 1: hfsc default 10
    
        tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate \
            999999999kbit ul rate 999999999kbit
    
        echo -e "    [TC]      : CLASS 10 SET SPEED 999999999kbit/s";
        tc class add dev eth0 parent 1:1  classid 1:10 hfsc \
        sc rate 999999999kbit ul rate 999999999kbit
    
        echo -e "    [IPTABLES]: DOWNLOAD > 100MB ==> MARK 0x14";
        echo -e "    [TC]      : CLASS 20 SET SPEED 9000kbit/s";
        tc class add dev eth0 parent 1:1  classid 1:20 hfsc \
            sc rate 9000kbit ul rate 9000kbit
    
        echo -e "    [TC]      : ASSOCIATE PKT MARK 0xa TO CLASS 10";
        tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
        echo -e "    [TC]      : ASSOCIATE PKT MARK 0x14 TO CLASS 20"; 
        tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
    }
    stop(){
        tc qdisc del dev eth0 root    2> /dev/null > /dev/null;
        tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null;
    } 
    
    case "$1" in
        start)
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            echo -e "\033[1;31mStarting bandwidth shaping ...\033[00m";
            start
            echo -e "\033[1;31m[DONE]\033[00m";
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            ;;
        stop)
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            echo -e "\033[1;31mStopping bandwidth shaping ...\033[00m";
            echo -e "    [TC]      : DELETE THE ROOT QDISC";
            stop
            echo -e "\033[1;31m[DONE]\033[00m";
            echo -e "\033[1;31m-------------------------------------------------------------------------------\033[00m";
            ;;
        restart)
            $0 stop
            $0 start
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            ;;
    esac
    
    exit 0;
    

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.