[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

QOS - iptables : cible connmark contre mark



Bonsoir,

Dans beaucoup de scripts, on propose d'utiliser la cible MARK pour
marquer tous les paquets un par un lors de leur passage dans la
table mangle de la chaîne POSTROUTING.

Je n'aime pas beaucoup cela, et je voulais savoir ce que vous pensiez 
de faire de la façon suivante :

Le marquage des paquets est fait :

 priorité 1 => flag 0x81
 priorité 2 => flag 0x82
 priorité 3 => ....

Le mask 0x80 servant à reconnaître un paquet marqué peu importe
la priorité.

Par défaut, si aucune _mark_ n'est présente, la priorité la plus basse 
est utilisée.

[code]
# Priorité 1 pour le traffic non tcp, l'icmp et les aknowledges TCP
# On marque ici les paquets et non pas la connexion entière
iptables -t mangle -A traffic_shaping -p ! tcp -j MARK --set-mark 0x81
iptables -t mangle -A traffic_shaping -p icmp -j MARK --set-mark 0x81
iptables -t mangle -A traffic_shaping -p tcp -m length --length :64 \
              -j MARK --set-mark 0x81

# Restaurer la mark pour les paquets faisant parti d'une connexion
# marquée auparavant depuis la table nat. 
# On travaille sur tous les paquets.
iptables -t mangle -A traffic_shaping -m connmark --mark 0x80/0x80 \
              -j CONNMARK --restore-mark

# Donner une priorité au service présent sur le serveur. La mark est 
# associée à la connexion entière. La table nat ne vois passé que le 
# premier paquet d'une connexion.
iptables -t nat -A ts_whole -p tcp --dport 22 -j CONNMARK --set-mark 0x82
iptables -t nat -A ts_whole -p tcp --dport 80 -j CONNMARK --set-mark 0x83
iptables -t nat -A ts_whole -p tcp --dport 21 -j CONNMARK --set-mark 0x84
iptables -t nat -A ts_whole -p tcp --dport 2000:2020 -j CONNMARK \
                       --set-mark 0x84
[/code]

avec

[code]
iptables -t nat -i $LAN_IFACE -A PREROUTING -j ts_whole
iptables -t mangle -o $LAN_IFACE -A POSTROUTING -j traffic_shaping
[/code]

La chaîne ts_whole est basée sur le traffic _entrant_ initié par un
utilisateur 
externe, et ne traite pas les connexions initiées par le serveur.

C'est comme cela que j'ai fait les tests depuis mon réseau local avec du 
téléchargement en HTTP, SFTP et FTP, et un petit ping en mode flood.
J'ai graphé mes résultats et cela à l'air de fonctionner correctement.

Cela me paraît moins gourmand au niveau iptables bien que dans mon exemple
il faudrait aussi traiter les connexions initiées par le serveur.

Vous en pensez quoi ?

---
Franck Joncourt
http://www.debian.org/ - http://smhteam.info/wiki/




Reply to: