# Constantes                                                                                                                                                                                                   
LOCALNET="x.x.x.x/255.255.255.255"
MARKPRIO1="1"
MARKPRIO2="2"
MARKPRIO3="3"
MARKPRIO4="4"

##definitiondesconstantespourTC                                                                                                                                                                            

IFACE=eth0

#Taux                                                                                                                                                                                                          

UPRATE="20mbit"
PRIORATE1="10mbit"
PRIORATE2="10mbit"
PRIORATE3="7mbit"
PRIORATE4="2mbit"

# Quanta Les quanta decrivent comment la bande passante est repartie entre #qdiscs.                                                                                                                              

QUANTUM1="12187"
QUANTUM2="8625"
QUANTUM3="5062"
QUANTUM4="1500"

## #Burst                                                                                                                                                                                                        
## bursts determinent de combien de octets un qdsic peut depasser le taux avant d etre #arrete                                                                                                                   

BURST1="1000k"
BURST2="400k"
BURST3="200k"
BURST4="10k"

## Le cburst sert a savoir de combien on a le droit de continuer avant que la connexion ne #stop.                                                                                                                

CBURST1="3000k"
CBURST2="2000k"
CBURST3="100k"
CBURST4="10k"

# politique de base. iptables #!                                                                                                                                                                                 

 iptables -P INPUT ACCEPT
 iptables -P OUTPUT ACCEPT
 iptables -P FORWARD ACCEPT

# Purger toutes les #tables                                                                                                                                                                                      

iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t mangle -F OUTPUT
iptables -t mangle -F FORWARD

# Definition des #priorites                                                                                                                                                                                      

# Prio 1, les services #prioritaires.                                                                                                                                                                            
# icmp                                                                                                                                                                                                          

iptables -t mangle -A FORWARD -p icmp -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p icmp -j MARK --set-mark $MARKPRIO1

# ssh (afin de ne pas laguer sur le ssh en #input)                                                                                                                                                               

iptables -t mangle -A FORWARD -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A INPUT -p tcp --dport 22 -j MARK --set-mark $MARKPRIO1

 # non tcp (pour ne pas avoir de soucis avec la resolution #dns)                                                                                                                                                 

iptables -t mangle -A INPUT -p ! tcp -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A FORWARD -p ! tcp -j MARK --set-mark $MARKPRIO1
iptables -t mangle -A OUTPUT -p ! tcp -j MARK --set-mark $MARKPRIO1

 # Prio #2                                                                                                                                                                                                       

 # #smtp                                                                                                                                                                                                         
iptables -t mangle -A FORWARD -p tcp --dport 25 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark $MARKPRIO3

 # Prio #3                                                                                                                                                                                                       

# http | appriori pas besoin de brider l #input                                                                                                                                                                  

iptables -t mangle -A FORWARD -p tcp --dport 80 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark $MARKPRIO3

 # #https                                                                                                                                                                                                        

iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark $MARKPRIO3

 # ftp # pas besoin de brider l #input.                                                                                                                                                                          

iptables -t mangle -A FORWARD -p tcp --dport 21 -j MARK --set-mark $MARKPRIO3
iptables -t mangle -A OUTPUT -p tcp --dport 21 -j MARK --set-mark $MARKPRIO3

  # Prio #4                                                                                                                                                                                                      
 # packets > 1024 bytes                                                                                                                                                                                         

iptables -t mangle -A FORWARD -p tcp -m length --length 1024: -j MARK --set-mark $MARKPRIO4



## definition des regles de traffic #shaping.                                                                                                                                                                    

## longueur de la queue pour #eth0                                                                                                                                                                               
ifconfig $IFACE txqueuelen 128

## on defini la class root ! et sa file d #attente                                                                                                                                                               

tc qdisc add dev $IFACE root handle 1:0 htb default 103 r2q 1
tc class add dev $IFACE parent 1:0 classid 1:1 htb rate $UPRATE burst $BURST1 cburst $CBURST1


## les sous #classes                                                                                                                                                                                             

tc class add dev $IFACE parent 1:1 classid 1:101 htb rate $PRIORATE1 ceil $UPRATE quantum $QUANTUM1 burst $BURST1 cburst $CBURST1 prio 0
tc class add dev $IFACE parent 1:1 classid 1:102 htb rate $PRIORATE2 ceil $UPRATE quantum $QUANTUM2 burst $BURST2 cburst $CBURST2 prio 1
tc class add dev $IFACE parent 1:1 classid 1:103 htb rate $PRIORATE3 ceil $UPRATE quantum $QUANTUM3 burst $BURST3 cburst $CBURST3 prio 2
tc class add dev $IFACE parent 1:1 classid 1:104 htb rate $PRIORATE4 ceil $P2PRATE quantum $QUANTUM4 burst $BURST4 cburst $CBURST4 prio 3

## filtrage des packets marke grace a #iptables.                                                                                                                                                                 

tc filter add dev $IFACE parent 1:0 protocol ip prio 0 handle $MARKPRIO1 fw classid 1:101
tc filter add dev $IFACE parent 1:0 protocol ip prio 1 handle $MARKPRIO2 fw classid 1:102
tc filter add dev $IFACE parent 1:0 protocol ip prio 2 handle $MARKPRIO3 fw classid 1:103
tc filter add dev $IFACE parent 1:0 protocol ip prio 3 handle $MARKPRIO4 fw classid 1:104

## regles de file de #attente                                                                                                                                                                                    

tc qdisc add dev $IFACE parent 1:101 sfq perturb 16 quantum $QUANTUM1
tc qdisc add dev $IFACE parent 1:102 sfq perturb 16 quantum $QUANTUM2
tc qdisc add dev $IFACE parent 1:103 sfq perturb 16 quantum $QUANTUM3
tc qdisc add dev $IFACE parent 1:104 sfq perturb 16 quantum $QUANTUM4