# [QoS] Décidément, ça veut pas

## El_Goretto

Bonjour,

Bon, je voulais savoir si d'autres gens avaient déjà joué avec la QoS sous nunux, en particuliers avec une freebox au bout de la ligne.

Parce que, ça fait bizarre de la dire, mais tous les setups que j'ai essayé (HTB pur, PRIO simple, TBF+PRIO simple...) "ça marche pas", à chaque fois que le traffic basse priorité (du bittorrent) est lancé (sans limite de bande passante côté applicatif), le traffic en haute priorité comme l'ICMP est retardé (ping de + de 1000ms).

Hors, ça m'agace d'autant plus que PRIO est sensé être bête comme ses pieds et traiter les paquets hautes priorité tant qu'il y en a avant de traiter les autres.

Bref, le setup TBF (pour limiter le traffic total à un peu moins que la capacité de ma ligne) + PRIO (pour traiter les différentes priorité de flux) aurait du donner des résultats. Mes paquets vont bien dans les files correctes, donc je ne vois pas un problème avec le paramétrage de la QoS, mais un problème bien caché que je n'arrive pas à démasquer.

Bon, là je vous demande juste si vous avez quelques idées, lundi je retourner tripoter un peu le truc, en re-simplifiant à mort mes filtres/classifiers (1 bitto, et le reste du monde).

Autre question: impossible de faire cohabiter HTB et PRIO, les filtres sont inefficaces (les mêmes que j'ai depuis le débuts, et sont normalement indépendants du reste), et tout le traffic passe dans la file root, donc zappe toute QoS. Si vous avez déjà réussi à faire çà... n'hésitez pas à faire partager votre expérience  :Smile: 

----------

## Darius4all

salut , probleme qui m'intéresse également ayant une FB et m'étant heurté a un fort ralentissement de traffic aprés activation du QoS.

je connais pas trop les différentes possibilités de cette option, je tourne actuellement sans mais je trouve le débit un peu lent par rapport a la meme machine sous XP.

je peux tester un peu les meme options que toi pour te faire un retour sur comment ca se passe chez moi.

dis moi les options que tu as compilé que je test ca.

----------

## Leander256

J'ai fait pas mal mumuse avec la QoS il y a deux ans (sur un sagem fast 800), et j'arrivais a avoir des resultats mais ca restait assez bancal. Des que je faisais une configuration un peu complexe, ca ne fonctionnait pas vraiment comme prevu et il m'a fallu utiliser netfilter pour marquer tous les paquets pour pouvoir les filtrer correctement dans la QoS. Donc si tu n'as pas encore essaye ca, je te conseille de passer par netfilter pour marquer les paquets avec du "-j MARK --set-mark n".

<aigri>Et je trouve que les outils en ligne de commande pour manipuler la QoS sont vraiment pourraves</aigri>

----------

## El_Goretto

Bon, OK, ce WE je "balance" mon script actuel.

J'utilise déjà iptables pour marquer les paquets parce que c'est le plus simple quand on touche déjà la syntaxe netfilter, puis j'ai récupéré des examples pour mapper avec tc ces marques sur des files QoS.

+ ce WE donc.

----------

## El_Goretto

Voici la version qui se voulait "basique", pour tester PRIO, uniquement encadré par TBF pour limiter la bande passante totale.

beck est le nom de la passerelle, main_gauche (MG) celui de ma station dans le LAN.

Ne paniquez pas, tout le début n'est que déclaration de variables.

Ici, l'objectif est d'avoir 3 files pour PRIO, 1 haute prio, une pour le traffic par défaut (du fait de la priomap), et une basse prio. Au final, j'ai un marquage fin, mais pour mes tests je ne colle le traffic marqué qu'en haute ou basse prio.

```

!/bin/sh 

RATEUP=600

LSMOD="lsmod"

MODPROBE="modprobe"

IPTABLES="iptables"

IPTABLES_RESTORE="iptables-restore"

IP="ip"

GID_P2P="407"

GID_SQUID="31"

NET_LAN="192.169.0.0/24"

IP_BC_NET_LAN="192.169.0.255"

NET_DMZ="192.169.1.0/24"

NET_VPN="10.8.0.0/24"

NET_MCAST="239.0.0.0/8"

IP_MG_LAN="192.169.0.1"

IP_MG_LAN2="192.169.0.10"

IP_BECK_LAN="192.169.0.254"

IP_BECK_WAN=""

#---->IP WAN à modifier

IP_BECK_DMZ="192.169.1.254"

IP_BECK_VPN="10.8.0.1"

IF_DMZ="eth0"

IF_LAN="eth1"

IF_WAN="eth2"

IF_MER2Z="eth3"

IF_VPN="tap0"

## ports des services (quand rien n'est spécifié, les ports sont UDP _et_ TCP)

P_SKYPE="32202"

P_AMSN="6890:6900"

P_SUNRPC="111"

P_NFS="2049"

P_RPC="32765:32768"

P_SSH_TCP="2222,443"

P_TS_ADMIN_TCP="14534"

P_TS_CLIENT_UDP="8767"

P_BT_TCP="6901:6997"

P_HTS_TCP="6998"

P_ED2K_TCP="4600"

P_ED2K_UDP="4601,4603"

P_HUBDC_TCP="1111"

P_DCCLIENT_TCP="6999"

P_VPNLIGHT_UDP="1194"

P_QUAKE3_UDP="27960"

P_DOW_UDP="6112"

P_SINS_TCP="6112"

P_FEAR_UDP="27888"

P_FLATOUT_UDP="23756"

P_DNS="53"

P_DHCP_UDP="67,68"

P_RVOLT_UDP="47624"

P_RVOLT_TCP="47624,2300,2301"

P_CHAOSL_UDP="50426,2234"

P_SWAT4_UDP="10480:10484"

P_WENGO_UDP="5060,10600,10601,11132,44640"

P_FARCRY_UDP="49001"

P_FREE_MPOSTE_UDP="31336"

P_FREESPACE2_TCP="7117"

P_FREESPACE2_UDP="7808"

P_MURMUR="64738"

#P_FREE_MPOSTE_UDP="31336,31337,32808,32809"

## ce qui suit est toujours en TCP (logique...)

P_HTTP="80"

P_HTTPS="443"

P_FTP="21"

P_FTPDATA="20"

P_POP3="110"

P_POP3S="995"

P_SMTP="25"

P_SMTPS="465"

if [ "$1" ] && [ "$1" != "iptables" ] && [ "$1" != "qos" ] && [ "$1" != "status" ] && [ "$1" != "stop" ]

then

   echo "erreur, mauvais parametre"

   exit 1

fi

if [ "$1" = "status" ]

then

        echo "[qdisc]"

        tc -s qdisc show dev $IF_WAN

        echo "[class]"

        tc -s class show dev $IF_WAN

        echo "[filter]"

        tc -s filter show dev $IF_WAN

        echo "[iptables]"

        $IPTABLES -t mangle -L MYSHAPER-OUT -v -x 2> /dev/null

        exit

fi

$IPTABLES -t mangle -D POSTROUTING -o $IF_WAN -j MYSHAPER-OUT 2> /dev/null > /dev/null

$IPTABLES -t mangle -F MYSHAPER-OUT 2> /dev/null > /dev/null

$IPTABLES -t mangle -X MYSHAPER-OUT 2> /dev/null > /dev/null

tc qdisc del dev $IF_WAN root    2> /dev/null > /dev/null

if [ "$1" = "stop" ] || [ "$1" = "iptables" ] 

then 

        echo "Shaping removed on $IF_WAN."

        if [ "$1" = "stop" ] 

   then

      exit

   fi

fi

if [ "$1" != "iptables" ]

then

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

#

# Outbound Shaping (limits total bandwidth to RATEUP)

# set queue size to give latency of about 2 seconds on low-prio packets

# valeur initiale de 30

$IP link set dev $IF_WAN qlen 1000

# changes mtu on the outbound device.  Lowering the mtu will result

# in lower latency but will also cause slightly lower throughput due 

# to IP and TCP protocol overhead.

#$IP link set dev $IF_WAN mtu 100

tc qdisc add dev $IF_WAN  root handle 1: tbf rate ${RATEUP}kbit latency 10000ms burst 154000

tc qdisc add dev $IF_WAN  parent 1: handle 10: prio priomap 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

tc qdisc add dev $IF_WAN  parent 10:1 handle 100: pfifo

tc qdisc add dev $IF_WAN  parent 10:2 handle 200: sfq

tc qdisc add dev $IF_WAN  parent 10:3 handle 300: sfq

# filter traffic into classes by fwmark - here we direct traffic into priority class according to

#                                         the fwmark set on the packet (we set fwmark with iptables

#                                         later). 

tc filter add dev $IF_WAN parent 10:0 prio 1 protocol ip handle 20 fw flowid 10:1

tc filter add dev $IF_WAN parent 10:0 prio 2 protocol ip handle 21 fw flowid 10:1

tc filter add dev $IF_WAN parent 10:0 prio 3 protocol ip handle 22 fw flowid 10:1

tc filter add dev $IF_WAN parent 10:0 prio 4 protocol ip handle 23 fw flowid 10:3

tc filter add dev $IF_WAN parent 10:0 prio 5 protocol ip handle 24 fw flowid 10:3

tc filter add dev $IF_WAN parent 10:0 prio 6 protocol ip handle 25 fw flowid 10:3

tc filter add dev $IF_WAN parent 10:0 prio 7 protocol ip handle 26 fw flowid 10:3

# add MYSHAPER-OUT chain to the mangle table in iptables - this sets up the table we'll use

#                                                      to filter and mark packets.

$IPTABLES -t mangle -N MYSHAPER-OUT

$IPTABLES -t mangle -I POSTROUTING -o $IF_WAN -j MYSHAPER-OUT

# add fwmark entries to classify different types of traffic - Set fwmark from 20-26 according to

#                                                             desired class. 20 is highest prio.

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp --dport 53 -j MARK --set-mark 20                # DNS name resolution (small packets)

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp --dport 53 -j RETURN

$IPTABLES -t mangle -A MYSHAPER-OUT -p udp --dport 53 -j MARK --set-mark 20                # DNS name resolution (small packets)

$IPTABLES -t mangle -A MYSHAPER-OUT -p udp --dport 53 -j RETURN

#Pour mettre les paquets SYN et ACK prioritaires

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 20

#$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp --tcp-flags SYN,RST,ACK SYN -j RETURN

#$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp --tcp-flags ACK ACK -j MARK --set-mark 20

#$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp --tcp-flags ACK ACK -j RETURN

#alternatives pour les ACKs:

#$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m length --length 0:64 -j MARK --set-mark 20 # small packets (probably just ACKs)

#$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m length --length 0:64 -j RETURN

#autre alternatives pour les ACKs (necessite u32):

# To speed up downloads while an upload is going on, put ACK packets in

# the interactive class:

#tc filter add dev $IF_WAN parent 1: protocol ip prio 0 u32 \

#   match ip protocol 6 0xff \

#   match u8 0x05 0x0f at 0 \

#   match u16 0x0000 0xffc0 at 2 \

#   match u8 0x10 0xff at 33 \

#   flowid 1:20

$IPTABLES -t mangle -A MYSHAPER-OUT -p icmp -j MARK --set-mark 21               # ICMP (ping) - high prio, impress friends

$IPTABLES -t mangle -A MYSHAPER-OUT -p icmp -j RETURN

$IPTABLES -t mangle -A MYSHAPER-OUT -p udp -m multiport --sports $P_TS_CLIENT_UDP,$P_MURMUR -j MARK --set-mark 21

$IPTABLES -t mangle -A MYSHAPER-OUT -p udp -m multiport --sports $P_TS_CLIENT_UDP,$P_MURMUR -j RETURN

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m multiport --sports $P_TS_ADMIN_TCP,$P_MURMUR -j MARK --set-mark 21

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m multiport --sports $P_TS_ADMIN_TCP,$P_MURMUR -j RETURN

#pour le surf qui passe par squid:

#$IPTABLES -t mangle -A MYSHAPER-OUT -m owner --gid-owner $GID_SQUID -j MARK --set-mark 21

#priorise (presque) a fond MG:

$IPTABLES -t mangle -A MYSHAPER-OUT -s $IP_MG_LAN -j MARK --set-mark 22

$IPTABLES -t mangle -A MYSHAPER-OUT -s $IP_MG_LAN -j RETURN

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m multiport --dports $P_SSH_TCP -j MARK --set-mark 22    # acceder a d'autres ssh 

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m multiport --dports $P_SSH_TCP -j RETURN

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -s $IP_BECK_WAN -m multiport --sports $P_SSH_TCP -j MARK --set-mark 23    # secure shell

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -s $IP_BECK_WAN -m multiport --sports $P_SSH_TCP -j RETURN

$IPTABLES -t mangle -A MYSHAPER-OUT -m owner --gid-owner $GID_P2P -j MARK --set-mark 26

$IPTABLES -t mangle -A MYSHAPER-OUT -m owner --gid-owner $GID_P2P -j RETURN

# Les paquets restants sont marqués selon le TOS (Type of Service)

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m tos --tos Minimize-Delay -m mark --mark 0 -j MARK --set-mark 21

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m tos --tos Maximize-Throughput -m mark --mark 0 -j MARK --set-mark 24

$IPTABLES -t mangle -A MYSHAPER-OUT -p tcp -m tos --tos Minimize-Cost -m mark --mark 0 -j MARK --set-mark 26

$IPTABLES -t mangle -A MYSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 25      # redundant- mark any unmarked packets as 25 (low prio)

# Done with outbound shaping

#

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

echo "Outbound shaping added to $IF_WAN.  Rate: ${RATEUP}Kbit/sec."

# uncomment following line if you only want upstream shaping.

# exit

fi

[ensuite ya les règles iptables "classiques"]

```

----------

