Limiter Bande passante avec Iptable et TC

Bonjour

j’essaye de limiter les bandes passantes de certains PC sur mon réseau en les identifiants via leur adresse mac.

J’ai donc ajouté à ma regle iptable les lignes suivantes

# je marque les paquets pour qos par adresse mac a controler
iptables -t mangle -A PREROUTING -i eth2 -m mac --mac-source 1C-65-9D-BC-9B-C5 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth2 -m mac --mac-source 1C-65-9D-BC-9C-67 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -i eth2 -m mac --mac-source 1C-65-9D-BC-9C-D5 -j MARK --set-mark 1

# voila les regles QOS
tc qdisc add dev eth2 root handle 1: cbq bandwidth 100Mbit cell 8 avpkt 1000 mpu 64
tc class add dev eth2 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 800Kbit avpkt 1000 prio 5 bounded isolated allot 1514 weight 1 maxburst 21
tc filter add dev eth2 parent 1:0 protocol ip handle 1 fw flowid 1:1

Hors ce n’est pas efficace et je n’arrive pas a voir ou j’ai pu faire des erreurs.

Pour info eth0 relie le serveur/routeur au net et eth2 est l’interface ou sont connectés les pc à surveiller.

Merci pour vos lumieres concernant cette partie bien spécifique de iptables que je découvre completement.

J’ai trouvé ça un script de fran.b c’est ce que tu cherches ?

Un petit commentaire : tes règles iptables concernent les paquets qui entrent par eth2, alors que les règles tc concernent les paquets qui sortent par eth2. Forcément, ça ne peut pas marcher. Tu veux limiter le débit du trafic émis par ces machines ou envoyé à celles-ci ?

Merci pour le coup de main :wink:

Je veux limiter les deux, mais prioritairement le download sauvage

Pour limiter le débit montant, il faut mettre la QoS sur l’interface de sortie, ici eth0.

Par contre tu ne pourras pas limiter le débit descendant en te basant directement sur l’adresse MAC source des paquets puisque ceux-ci ne sont pas émis depuis ces adresses MAC mais celle du routeur internet. Une possibilité serait d’utiliser la cible CONNMARK d’iptables pour marquer les connexions en fonction de l’adresse MAC source puis appliquer la marque de connexion aux paquets. Ainsi tout paquet descendant identifié comme une réponse à un paquet émis depuis une des adresses MAC serait marqué.

merci

un ami m’a fait un petit script et on a décidé de limiter par les adresses ip puisque mangle ne permet pas de limiter par les adresses mac.

J’ai ensuite bidouillé le dhcp pour que chaque adresse mac ait toujours la même IP.

#!/bin/bash
 
tc_start() {

# On marque les paquets des IP a brider

#iptables -t mangle -A FORWARD ! -s  192.168.xxx.0/24 -d 192.168.xxx.xxx -j MARK --set-mark 1
iptables -t mangle -A FORWARD ! -s  192.168.xxx.0/24 -d 192.168.xxxx.xxx -j MARK --set-mark 1
iptables -t mangle -A FORWARD ! -s  192.168.xxx.0/24 -d 192.168.xxx.xxx -j MARK --set-mark 1
iptables -t mangle -A FORWARD ! -s  192.168.xxx.0/24 -d 192.168.xxx.xxx -j MARK --set-mark 1
iptables -t mangle -A FORWARD ! -s  192.168.xxx.0/24 -d 192.168.xxx.xxx -j MARK --set-mark 1
iptables -t mangle -A FORWARD ! -s  192.168.xxx.0/24 -d 192.168.xxx.xxx -j MARK --set-mark 1


# On applique la limitation de BP avec tc

tc qdisc add dev eth2 root handle 1: cbq bandwidth 100Mbit avpkt 1000 mpu 64
tc class add dev eth2 parent 1:0 classid 1:1 cbq rate 3200Kbit allot 1514 prio 1 avpkt 1000 bounded
tc filter add dev eth2 parent 1:0 protocol ip handle 1 fw flowid 1:1

}

tc_stop() {

#on delete le qdisc root

tc qdisc del dev eth2 root

#On vide la table MANGLE pour ne plus marquer les paquets

iptables -t mangle -F FORWARD

}

tc_restart() {

    tc_stop
    sleep 1
    tc_start

}

tc_show() {

    echo "eth2:"
    tc qdisc show dev eth2
    tc class show dev eth2
    tc filter show dev eth2
    echo ""

}

case "$1" in

  start)

    echo -n "Starting QOS : "
    tc_start
    echo "done"
    ;;

  stop)

    echo -n "Stopping QOS : "
    tc_stop
    echo "done"
    ;;

    echo "done"
    ;;

  restart)

    echo -n "Restarting QOS : "
    tc_restart
    echo "done"
    ;;

  show)
    
    tc_show
    ;;

  *)

    echo "Usage: qos.sh {start|stop|restart|show}"
    ;;

esac

exit 0

Ca fonctionne bien comme cela

Salut, SVP es ce que tu pourrait avoir le même code source mais de telle sorte que cela génère automatiquement les adresses mac qui utilisent trop de bande passante dans un réseau local. Au faite avoir deux fonctions, une qui va récupérer les adresses mac qui bouffe la bande passante et l’autre qui va servir a limité la bande passante de ses derniers . Sincèrement votre aide me serait très utile.