# [IPTABLES] NAT et QoS : un coup de main ?

## CryoGen

Bonjour @tous,

Je refais actuellement mes règles poussiéreuses d'iptables avec lesquelles "ca marche, mais c'est pas top" et je voudrai y ajouter un peu de QoS  :Smile: 

Évidement je ne touche à iptables que très rarement et j'ai donc un peu de mal à me dépatouiller de tous ca   :Rolling Eyes: 

Voici les infos:

Internet <-> ppp0 +SERVEUR+ eth0 <-> LAN

Mon Lan est en 192.168.0.0/24

-Il y a un serveur apache sur mon serveur qui doit etre accessible de l'extérieur.

-Les applications p2p mldonkey et rtorrent sont sur mon serveur (piloté respectivement via Webgui et ssh/screen)

-Sur les PC de mon LAN il faut pouvoir surfer, envoyer/recevoir ses mails, msn, IRC, skype. 

Ce que je voudrais :

- Etre sécurisé (pas non plus comme le pentagone  :Laughing: ,  mais assez pour résister à des scripts kiddies "évolués" XD)

- Mettre des priorités (QoS) afin d'être un peu moins gêné par le p2p

Je me suis donc inspiré du wiki Howto Packet Shaping et j'ai déjà pondu ceci:

```
VOIR POST SUIVANT
```

Je ne l'ai pas encore testé  :Embarassed:  je voudrais d'abord vos avis dessus  :Smile: 

Je sais qu'il manque la partie nat, et pour cause  :Laughing:  je ne l'ai pas encore réalisé... (à part le masquerading, mais je ne pense pas que cela suffise...)

Merci  :Smile: 

EDIT : Hum je pense aussi que j'ai pas ouvert les ports .... en gros je ne sais pas trop où j'en suis XD

----------

## CryoGen

Bon j'ai un peu continué et je l'ai testé, c'est une horreur   :Laughing: 

J'ai perdu ma connexion ssh, impossible à partir du serveur d'envoyer des ping vers l'exterieur, resolution dns impossible ... bref, un brin trop puissant   :Embarassed: 

Voici le script actuel, il devrait normalement me laisser tout faire en LAN -> serveur (pas encore testé) par contre je ne sais pas encore où est le probleme qui m'empeche de sortir (ping, resolution dns..)

```
VOIR POST SUIVANT -_-"
```

En avant ! 

Merci  :Smile: 

----------

## CryoGen

Bon je continue ... tout seul  :Sad: 

Alors maintenant je ne perds plus la connexion à mon serveur en local  :Smile: 

Internet fonctionne aussi toujours. Mais impossible de pinguer l'exterieur ou de faire une requete dns... 

```
####################################

# Init

iptables -F

iptables -X

iptables -t nat -F

iptables -t mangle -F

iptables -t raw -F

#####################################

#####################################

#Ifaces

LAN_IF="eth0"

NET_IF="ppp0"

#Network

LAN_NET="192.168.0.0/255.255.255.0"

#Port

ED2K="6200"

OVERNET="16129"

BITTORENT="7000:7500"

HTTP="80"

HTTPS="443"

IDENTD="113"

IRCDCC="9000:9050"

MSNFILE="6891:6900"

#Computer on LAN

INNERSTORM="192.168.0.2"

#QoS

MARK_P1="1" # Interactive (ICMP, SSH)

MARK_P2="2" # Misc

MARK_P3="3" # Browsing

MARK_P4="4" # P2P

######################################

######################################

# -- RULES --

#Default policies

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP

#All services should be avialable from LAN

iptables -I INPUT 1 -i $LAN_IF -j ACCEPT

iptables -I INPUT 1 -i lo -j ACCEPT

iptables -A INPUT -p UDP --dport bootps -i ! $LAN_IF -j REJECT

iptables -A INPUT -p UDP --dport domain -i ! $LAN_IF -j REJECT

#MASQUERADING and NAT

iptables -I FORWARD -i $LAN_IF -d $LAN_NET -j DROP

iptables -A FORWARD -i $LAN_IF -s $LAN_NET -j ACCEPT

iptables -A FORWARD -i $NET_IF -d $LAN_NET -j ACCEPT

iptables -t nat -A POSTROUTING -o $NET_IF -j MASQUERADE

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -d $LAN_NET -j ACCEPT

#Opening some ports into the firewall 

#identd

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $IDENTD -j ACCEPT

#Bittorent

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $BITTORENT -j ACCEPT

#mldonkey ed2k+overnet

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $ED2K -j ACCEPT

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $OVERNET -j ACCEPT

#msn - transfert

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $MSNFILE -j ACCEPT

#IRC DCC

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $IRCDCC -j ACCEPT

#Ports

#irc DCC -> innerStorm

iptables -t nat -A PREROUTING -i $NET_IF -p tcp --dport $IRCDCC -j DNAT --to $INNERSTORM

########################################

########################################

#QoS

# icmp

iptables -t mangle -A FORWARD -p icmp -j MARK --set-mark $MARK_P1

iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark $MARK_P1

# ssh

iptables -t mangle -A FORWARD -p tcp --dport 22 -j MARK --set-mark $MARK_P1

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark $MARK_P1

# non tcp

iptables -t mangle -A FORWARD -p ! tcp -j MARK --set-mark $MARK_P1

iptables -t mangle -A OUTPUT -p ! tcp -j MARK --set-mark $MARK_P1

# http

iptables -t mangle -A FORWARD -p tcp --dport $HTTP -j MARK --set-mark $MARK_P3

iptables -t mangle -A OUTPUT -p tcp --dport $HTTP -j MARK --set-mark $MARK_P3

# https

iptables -t mangle -A FORWARD -p tcp --dport $HTTPS -j MARK --set-mark $MARK_P3

iptables -t mangle -A OUTPUT -p tcp --dport $HTTPS -j MARK --set-mark $MARK_P3

# smtp

iptables -t mangle -A FORWARD -p tcp --dport 25 -j MARK --set-mark $MARK_P3

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark $MARK_P3

#Bittorent

iptables -t mangle -A OUTPUT -p tcp --sport $BITTORENT -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --dport $BITTORENT -j MARK --set-mark $MARK_P4

#mldonkey ed2k proto port 6200 + overnet proto port 16129

iptables -t mangle -A OUTPUT -p tcp --sport $ED2K -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --dport $ED2K -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --sport $OVERNET -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --dport $OVERNET -j MARK --set-mark $MARK_P4

#######################################

#######################################
```

Quelqu'un a une idée ?

EDIT: refonte du script  :Smile: 

----------

## MaKKrO

Salut, 

Essaie d'ajouter un NEW dans le state du FORWARD, ca devrait marcher.

Autrement ca tombe tres bien... Je vais me lancer aujourd'hui dans la QoS.

Je vais risquer de revenir ici ...   :Wink: 

----------

## truc

salut, j'me glisse ici, (il fait chaud et tout..), bon attention je débute avec iptables, donc mes questions peuvent paraitre, euh..hum.. connes?  :Smile: 

Bref, pourquoi rajouter NEW dans FORWARD? il a la règle:

```
ptables -A FORWARD -i $LAN_IF -s $LAN_NET -j ACCEPT
```

donc il accepte déjà tous venant de son LAN non? et puis d'ailleurs, j'comprends pas pourquoi la naviguation internet marche (par @IP tu veux donc dire?) et pas le ping ni la résolution de noms? :/ (tuparles bien de la navigation depuis le routeur ou depuis le LAN?)

voili-voilou,  merci à ceux qui vont lui répondre, ça va bien m'aider   :Twisted Evil:   :Razz: 

EDIT: pour la QoS question comme ça, vous marquez les paquets là, mais c'est ou et quand que le traitement à lieu?:/

----------

## MaKKrO

 *truc wrote:*   

> 
> 
> Bref, pourquoi rajouter NEW dans FORWARD? il a la règle:
> 
> ```
> ...

 

Oui... c'est vrai ! Mais moi je sais que j'avais le meme genre de problemes et ca l'a resolu en ajoutant le status NEW !

 *truc wrote:*   

> 
> 
> EDIT: pour la QoS question comme ça, vous marquez les paquets là, mais c'est ou et quand que le traitement à lieu?:/

 

Pour ma part ca sera configurable dans l'interface Web, donc j'execute le fichier au "submit".

Et puis ca sera baser sur les IP, et non les ports... mais ca ne change pas grand chose !

----------

## CryoGen

 *truc wrote:*   

> pour la QoS question comme ça, vous marquez les paquets là, mais c'est ou et quand que le traitement à lieu?:/

 

Effectivement, j'ai seulement marqué les paquets pour le moment  :Wink:  J'ai pas encore fait la partie QoS car je voulais d'abord avoir la partie routeur/firewall en place pour ensuite faire des test QoS  :Wink: 

J'en suis au point 7 du wiki: Howto Packet Shapping  :Wink:  Fixer le Qos est au point 8  :Smile: 

 *MaKKrO wrote:*   

> Essaie d'ajouter un NEW dans le state du FORWARD, ca devrait marcher.

 

Oki je vais essayer ! C'est bien dans cette ligne là que je dois le rajouter ?   :Embarassed: 

```
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -d $LAN_NET -j ACCEPT
```

 *truc wrote:*   

> et puis d'ailleurs, j'comprends pas pourquoi la naviguation internet marche (par @IP tu veux donc dire?) et pas le ping ni la résolution de noms? :/ (tuparles bien de la navigation depuis le routeur ou depuis le LAN?)

 

Quand j'applique mes règles, les connections existantes fonctionnent toujours : par exemple je ne perds pas ma connexion à IRC  :Smile:  , mais par contre impossible dans établir une nouvelle que ce soit via IP ou Nom

Clairement le NEW à FORWARD devriat donc arranger les choses ^_^ (je l'espère, sinon ca va être la crise de nerf XD)

EDIT: j'ai ajouter NEW dasn la ligne citée plus haut, ca ne marche pas :/

EDIT2 :   :Embarassed:   bon alors je rectifie :: en ajoutant le NEW j'ai le ping via IP qui marche depuis ma machine LAN , la résolution DNS ne marche pas, ce qui est normal puisque c'est mon serveur qui fait DNS (dnsmasq) et que lui (mon serveur) n'arrive toujours pas à pinguer l'exterieur , meme en IP (en gros il n'arrive pas à sortir OU on arrive pas à lui repondre) ...

Ca va , vous arrivez à décoder ?   :Laughing: 

----------

## nimli

C'est plus sur les parties INPUT qu'il faut gérer le new/established que sur la partie FORWARD.

Il faut faire attention qu'avant de forwarder le paquets il teste les règles firewall. Donc si le INPUT bloque le paquet, il sera pas forwarder.

Sinon ce qui peut aider c'est de regarder les logs, comme ca tu vois ce qui est bloqué et qui ne devrait pas l'être.

Bon je sais c pas très clair, je suis pas sur mon PC alors c'est juste de mémoire.

----------

## nimli

Ah oui sinon juste comme ca, pour mon firewall/router (pentium 200MMX), j'utilise IPCOP comme distrib vu que mettre une gentoo sur ce type de machine c'est pas super. Et je trouve que comme distrib c'est parfait pour ce genre de machine, une fois que t'as tout configurer, tu vire le clavier, la souris et l'écran, t'accède grâce à l'interface web et/ou ssh et t'entend plus parler de la bécane   :Wink: 

----------

## CryoGen

Effectivement, on en discutait sur IRC avec truc et le probleme etait bien sur les inputs ! J'ai donc rajouté la ligne

```
#We want anwsers to our questions :D

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
```

et ca marche ! 

Voici donc mon script d'iptables ! il est pas encore testé à fond et niveau sécurité je ne sais pas ce qu'il donne   :Embarassed: 

```
 ####################################

# Init

iptables -F

iptables -X

iptables -t nat -F

iptables -t mangle -F

iptables -t raw -F

#####################################

#####################################

#Ifaces

LAN_IF="eth0"

NET_IF="ppp0"

#Network

LAN_NET="192.168.0.0/255.255.255.0"

#Port

ED2K="6200"

OVERNET="16129"

BITTORENT="7000:7500"

HTTP="80"

HTTPS="443"

IDENTD="113"

IRCDCC="9000:9050"

MSNFILE="6891:6900"

#Computer on LAN

INNERSTORM="192.168.0.2"

#QoS

MARK_P1="1" # Interactive (ICMP, SSH)

MARK_P2="2" # Misc

MARK_P3="3" # Browsing

MARK_P4="4" # P2P

######################################

######################################

# -- RULES --

#Default policies

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP

#We want anwsers to our questions :D

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#All services should be avialable from LAN

iptables -I INPUT 1 -i $LAN_IF -j ACCEPT

iptables -I INPUT 1 -i lo -j ACCEPT

iptables -A INPUT -p UDP --dport bootps -i ! $LAN_IF -j REJECT

iptables -A INPUT -p UDP --dport domain -i ! $LAN_IF -j REJECT

#MASQUERADING and NAT

iptables -I FORWARD -i $LAN_IF -d $LAN_NET -j DROP

iptables -A FORWARD -i $LAN_IF -s $LAN_NET -j ACCEPT

iptables -A FORWARD -i $NET_IF -d $LAN_NET -j ACCEPT

iptables -t nat -A POSTROUTING -o $NET_IF -j MASQUERADE

iptables -A FORWARD -m state --state NEW,ESTABLISHED,RELATED -d $LAN_NET -j ACCEPT

#Opening some ports into the firewall 

#identd

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $IDENTD -j ACCEPT

#Bittorent

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $BITTORENT -j ACCEPT

#mldonkey ed2k+overnet

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $ED2K -j ACCEPT

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $OVERNET -j ACCEPT

#msn - transfert 

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $MSNFILE -j ACCEPT

#IRC DCC

iptables -t filter -A INPUT -i $NET_IF -p tcp -m tcp --dport $IRCDCC -j ACCEPT

#Ports

#irc DCC -> innerStorm

iptables -t nat -A PREROUTING -i $NET_IF -p tcp --dport $IRCDCC -j DNAT --to $INNERSTORM

########################################

########################################

#QoS

# icmp

iptables -t mangle -A FORWARD -p icmp -j MARK --set-mark $MARK_P1

iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark $MARK_P1

# ssh

iptables -t mangle -A FORWARD -p tcp --dport 22 -j MARK --set-mark $MARK_P1

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark $MARK_P1

# non tcp

iptables -t mangle -A FORWARD -p ! tcp -j MARK --set-mark $MARK_P1

iptables -t mangle -A OUTPUT -p ! tcp -j MARK --set-mark $MARK_P1

# http

iptables -t mangle -A FORWARD -p tcp --dport $HTTP -j MARK --set-mark $MARK_P3

iptables -t mangle -A OUTPUT -p tcp --dport $HTTP -j MARK --set-mark $MARK_P3

# https

iptables -t mangle -A FORWARD -p tcp --dport $HTTPS -j MARK --set-mark $MARK_P3

iptables -t mangle -A OUTPUT -p tcp --dport $HTTPS -j MARK --set-mark $MARK_P3

# smtp

iptables -t mangle -A FORWARD -p tcp --dport 25 -j MARK --set-mark $MARK_P3

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark $MARK_P3

#Bittorent

iptables -t mangle -A OUTPUT -p tcp --sport $BITTORENT -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --dport $BITTORENT -j MARK --set-mark $MARK_P4

#mldonkey ed2k proto port 6200 + overnet proto port 16129

iptables -t mangle -A OUTPUT -p tcp --sport $ED2K -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --dport $ED2K -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --sport $OVERNET -j MARK --set-mark $MARK_P4

iptables -t mangle -A OUTPUT -p tcp --dport $OVERNET -j MARK --set-mark $MARK_P4

#######################################

#######################################
```

Je vais pouvoir me lancer dans le point 8 : HOWTO Packet Shaping: Understanding HTB  :Twisted Evil: 

----------

## truc

 *nimli wrote:*   

> Il faut faire attention qu'avant de forwarder le paquets il teste les règles firewall. Donc si le INPUT bloque le paquet, il sera pas forwarder.

 

là, vu ce qu'on m'a expliqué ici, je ne pense pas que ça soit exact. le INPUT et le FORWARD sont deux tables bien distinctes de par leur utilisation :S

----------

## zyprexa

@ nimli : je confirme, ipcop c'est trop du ballon

Pour ma part, je me suis longtemps battu avec iptables. 

Il y a la notion de stateful, qui est on va dire la fonction-clé d'iptables : c'est la base même de son fonctionnement ... que tu as déjà saisi.

Il y a deux choses qui me frappent : 

- l'absence de règles de log des paquets (les logs m'ont permis d'analyser illico les résultats de mes actions ... avec un root-tail c'est un vrai plaisir ^^ ... ca a été l'illumination pour moi)

- dans les docs que j'ai lu, les auteurs insistaient lourdement sur le fait de ne pas essayer de faire du filtrage par la chaîne FORWARD. 

Je ne me suis pas embarassé de règles dans la chaîne FORWARD : ca correspond à coller la destination en DMZ.

les meilleures docs que j'ai trouvées sont celles-ci :

- celle-ci, je l'ai trouvée sur DLFP http://olivieraj.free.fr/fr/linux/information/firewall/

- celui-là était lié au premier, très clair http://christian.caleca.free.fr/index.html

- très bonne doc aussi http://www.nbs-system.com/article/iptables_howto

----------

## CryoGen

Bah si j'avais un serveur à mettre en "simple" routeur je mettrai plutôt pfSense qu' IPcop  :Wink: 

Bon sinon j'ai pas trop avancé, j'ai juste activé les règles fournis par le wiki mais légèrement modifiées 

```
#Constants

# Interface you want to do shaping on

# eth2, eth1 for direct connection; ppp0 or so for dsl

# and other dialup connections (check ifconfig)

IFACE="ppp0"

# Priority marks

MARKPRIO1="1"

MARKPRIO2="2"

MARKPRIO3="3"

MARKPRIO4="4"

# Rates

UPRATE="128kbit"

#P2PRATE=$UPRATE

P2PRATE="108kbit"

PRIORATE1="65kbit"

PRIORATE2="46kbit"

PRIORATE3="27kbit"

PRIORATE4="8kbit"

# Quantum

QUANTUM1="12187"

QUANTUM2="8625"

QUANTUM3="5062"

QUANTUM4="1500"

# Burst

BURST1="6k"

BURST2="4k"

BURST3="2k"

BURST4="0k"

CBURST1="3k"

CBURST2="2k"

CBURST3="1k"

CBURST4="0k"

# Set queue length for IFACE

ifconfig $IFACE txqueuelen 16

# Specify queue discipline

tc qdisc add dev $IFACE root handle 1:0 htb default 103 r2q 1

# Set root class

tc class add dev $IFACE parent 1:0 classid 1:1 htb rate $UPRATE burst $BURST1 cburst $CBURST1

# Specify sub 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

# Filter packets

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

# Add queuing disciplines

tc qdisc add dev $IFACE parent 1:101 sfq perturb 10 quantum $QUANTUM1

tc qdisc add dev $IFACE parent 1:102 sfq perturb 10 quantum $QUANTUM2

tc qdisc add dev $IFACE parent 1:103 sfq perturb 10 quantum $QUANTUM3

tc qdisc add dev $IFACE parent 1:104 sfq perturb 8 quantum $QUANTUM4
```

Bon ca à l'air de marcher plus ou moins... pas facile de se rendre compte ^_^

----------

## -KuRGaN-

En effet, le FORWARD et le INPUT sont deux tables différentes.

Sinon, concernant des distributions spécialisées ds le firewalling, vous avec Monowall sous BSD qui est le grand frère de pfSense   :Wink: 

----------

## nimli

Non mais j'ai jamis dit le contraire, ce que je dis c'est que si t'as une règle INPUT qui rejette la requete ben elle passera jamais dans les règles de FORWARD, c'est tout.

Sinon pour IPCOP, j'ai choisis ca (un peu au pif) y'a 4 ans et ca permet de gérer firewall/router avec les niveaux de securité internet/DMZ/LAN ce qui est ce que je cherchait. Il me semble meme que dans les dernières versions ils ont ajouté un niveau de sécurité pour le WIFI avec pas mal de règle par défaut. La gestion des DNS dynamique standard ...

Je viens de jeter un oeuil rapide sur fpsense et je vois pas trop de différence enfin bon moi en tout cas IPCOP me conviens.

----------

## MaKKrO

Je viens de me lancer dans la QoS (3 jours deja) !

Ca a l'air de marcher a correctement... les statistiques sont coherentes selon la priorite que je donne aux IP sources !

Car je ne fais pas ca specialement sur les ports, mais sur les IP sources, donc les utilisateurs !

Selon l'IP, je veux donner une certaines bande passante, et c'est la seule chose (mais plus importante) qui ne semble pas marcher...

Je ne sais pas si quelqu'un a deja fait ca ici, mais si oui, alors je veux bien un coup de main !!!

Ma conf : 

```

#!/bin/bash

IFACE="eth1"

# Priority marks

MARKPRIO1="1"

MARKPRIO2="2"

MARKPRIO3="3"

MARKPRIO4="4"

# Rates

UPRATE="240kbit"

PRIORATE1="140kbit"

PRIORATE2="60kbit"

PRIORATE3="30kbit"

PRIORATE4="10kbit"

# Quantum

QUANTUM1="12187"

QUANTUM2="8625"

QUANTUM3="5062"

QUANTUM4="1500"

# Burst

BURST1="6k"

BURST2="4k"

BURST3="2k"

BURST4="0k"

CBURST1="3k"

CBURST2="2k"

CBURST3="1k"

CBURST4="0k"

# Set queue length for IFACE

ifconfig $IFACE txqueuelen 16

# Specify queue discipline

tc qdisc add dev $IFACE root handle 1:0 htb default 104 r2q 1

# Set root class

tc class add dev $IFACE parent 1:0 classid 1:1 htb rate $UPRATE burst $BURST1 cburst $CBURST1

# Specify sub 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 $UPRATE quantum $QUANTUM4 burst $BURST4 cburst $CBURST4 prio 3

# Filter packets

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

# Add queuing disciplines

tc qdisc add dev $IFACE parent 1:101 sfq perturb 10 quantum $QUANTUM1

tc qdisc add dev $IFACE parent 1:102 sfq perturb 10 quantum $QUANTUM2

tc qdisc add dev $IFACE parent 1:103 sfq perturb 10 quantum $QUANTUM3

tc qdisc add dev $IFACE parent 1:104 sfq perturb 8 quantum $QUANTUM4

```

IPtables : 

```

#!/bin/bash

WAN=eth1

MARKPRIO1="1"

MARKPRIO2="2"

MARKPRIO3="3"

MARKPRIO4="4"

iptables -t mangle -F

iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE

iptables -t mangle -A PREROUTING -s 192.168.3.2 -j MARK --set-mark ${MARKPRIO4}

iptables -t mangle -A PREROUTING -s 192.168.3.2 -j RETURN

iptables -t mangle -A PREROUTING -s 192.168.3.4 -j MARK --set-mark ${MARKPRIO1}

iptables -t mangle -A PREROUTING -s 192.168.3.4 -j RETURN

iptables -t mangle -A OUTPUT -d 192.168.3.2 -j MARK --set-mark ${MARKPRIO4}

iptables -t mangle -A OUTPUT -d 192.168.3.2 -j RETURN

iptables -t mangle -A OUTPUT -d 192.168.3.4 -j MARK --set-mark ${MARKPRIO1}

iptables -t mangle -A OUTPUT -d 192.168.3.4 -j RETURN

```

Je suis en train de tester avec un seul poste client pour l'instant.

Quand je change son IP, il change de classe et je vois les stats qui semblent tout a fait correctes.

Je peux les checker avec 

```
tc -s class show dev eth1
```

Mais ca devrait limiter sa vitesse de download, or elle ne change pas !

J'ai suivi ce Wiki, http://gentoo-wiki.com/HOWTO_Packet_Shaping, mais il ne parle pas de vitesse de download.

Si quelqu'un peut me filer un coup de main....

----------

## MaKKrO

Bon et bien en fait ca marche !!! meme si le debit souhaiter n'est pas vraiment le bon...

Le truc qu'il faut savoir c'est que quand les classes sont definies, il faut specifier quel est la vitesse maximun.

```

UPRATE="240"

PRIORATE1="140"

PRIORATE2="60"

PRIORATE3="30"

PRIORATE4="10"

........

MAX1=$(($PRIORATE1+(($PRIORATE1*20)/100)))'kbit'

MAX2=$(($PRIORATE2+(($PRIORATE2*20)/100)))'kbit'

MAX3=$(($PRIORATE3+(($PRIORATE3*20)/100)))'kbit'

MAX4=$(($PRIORATE4+(($PRIORATE4*20)/100)))'kbit'

......

#Set root class

tc class replace dev $IFACE parent 1:0 classid 1:1 htb rate $UPRATE burst $BURST1 cburst $CBURST1

# Specify sub classes

tc class replace dev $IFACE parent 1:1 classid 1:101 htb rate $PRIORATE1'kbit' ceil $MAX1 quantum $QUANTUM1 burst $BURST1 cburst $CBURST1 prio 0

tc class replace dev $IFACE parent 1:1 classid 1:102 htb rate $PRIORATE2'kbit' ceil $MAX2 quantum $QUANTUM2 burst $BURST2 cburst $CBURST2 prio 1

tc class replace dev $IFACE parent 1:1 classid 1:103 htb rate $PRIORATE3'kbit' ceil $MAX3 quantum $QUANTUM3 burst $BURST3 cburst $CBURST3 prio 2

tc class replace dev $IFACE parent 1:1 classid 1:104 htb rate $PRIORATE4'kbit' ceil $MAX4 quantum $QUANTUM4 burst $BURST4 cburst $CBURST4 prio 3

```

Genre la, sa vitesse maximal, si la bande passante n'est pas utiliser est de $PRIORATEx + 20%

Je ne sais pas trop si ca servira a quelqu'un, mais ca marche vraiment bien !

PS : juste un petit truc... si je limite a 10Kbit, la vitesse de download est de 40ko/s, et c'est proportionnel (20kbit=80ko/s)

----------

## El_Goretto

Questions pour MaKKrO:

1- Es-tu sûr de vouloir limiter la vitesse de download? Normalement, c'est pour gérer le traffic sortant qu'on s'en sert.

2- Pourquoi gérer un traffic maximum (ceil) variable par file? Ca n'a pas d'intérêt lorsque la ligne n'est pas saturée, et quand c'est le cas, HTB s'en sort très bien en associant des ratios suivant le débit garanti (rate) configuré. Cf les docs parlant de HTB.

----------

## MaKKrO

Je comprend que cela paraisse un peu bizarre...

Il faut savoir sur quoi tourne cette QoS !

C'est un serveur qui authentifie les utilisateurs, et selon leur categorie, (selon le type de service acheter) leur fournis une vitesse de download specifique.

Donc meme si la bande passante n'est pas entierement prise, l'utilisateur dois avoir toujours la meme vitesse.

----------

