#!/bin/sh

DEV=eth2

#reset
tc qdisc del dev $DEV root

# le trafic non classifie va vers la classe 20
tc qdisc add dev $DEV root handle 1: htb default 20

# la classe parente, Xmbps doit etre environ 5-10% en dessous du debit max reel
tc class add dev $DEV classid 1:1 root htb rate 12mbps ceil 12mbps quantum 50000
# traffic prio (dns, syn/ack)
tc class add dev $DEV classid 1:10 parent 1:1 htb prio 1 rate 16kbps ceil 32kbps
# traffic normal
tc class add dev $DEV classid 1:20 parent 1:1 htb prio 2 rate 10mbps ceil 12mbps quantum 50000

# ajout des disciplines de file aux classes
# sfq convient pour la majorite des cas
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10

# deplacer le trafic marque par iptables vers les classes correspondantes
tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:20

# supprimer les regles existantes
iptables -t mangle -F PREROUTING 

# marquer different types de trafic, certains logiciels reglent le champ en fonction du type de trafic (ssh par exemple)
# ce n'est pas forcement bien niveau securite, le champ tos est regle par le client distant
# mais le risque est faible et les consequences ne sont pas trop graves
iptables -t mangle -A PREROUTING -i $DEV -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING -i $DEV -m tos --tos Minimize-Delay -j RETURN
iptables -t mangle -A PREROUTING -i $DEV -m tos --tos Minimize-Cost -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -i $DEV -m tos --tos Minimize-Cost -j RETURN
iptables -t mangle -A PREROUTING -i $DEV -m tos --tos Maximize-Throughput -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING -i $DEV -m tos --tos Maximize-Throughput -j RETURN

# les paquets recoivent la marque associee a la connexion si il n'ont pas encore de marque
iptables -t mangle -A PREROUTING -i $DEV -m mark --mark 0x0 -j CONNMARK --restore-mark

# les petits paquets DNS sont prioritaires
iptables -t mangle -A PREROUTING -i $DEV -p udp -m length --length 0:128 --dport 53 -j MARK --set-mark 0x1
# les petits paquets de controle de tcp sont prioritaires
iptables -t mangle -A PREROUTING -i $DEV -p tcp -m length --length 0:128 -m tcp --tcp-flags SYN,RST,ACK ACK -j MARK --set-mark 0x1
# le trafic ssh est prioritaire
iptables -t mangle -A PREROUTING -i $DEV -p tcp --dport 22 -j MARK --set-mark 0x1

# associer la marque a la connexion
iptables -t mangle -A PREROUTING -i $DEV -j CONNMARK --save-mark

