#!/bin/bash
# curio QoS script 0.31
# par François Simond
# script pour htb et imq iproute2 et bien sur iptables
# iptables : www.netfilter.org
# htb : luxik.cdi.cz/~devik/qos/htb/
# imq : luxik.cdi.cz/~patrick/imq/
# iproute2 : defiant.coinet.com/iproute2/
# pour d'autres détails consultrez le howto: lartc.org
# ce script vous donnera de très hautes performances
# réseau à la maison ou au travail. il est prévu pour
# utiliser la connection internet dans tous les sens
# sans que les applications importantes ne soient ralenties
# 09.04.2002: pre release pour tests
# 01.05.2002: tests et ajustements..
# 03.05.2002: fonctionne efficacement, à voir dans la durée
# dimanche 5 mai: posté chez linuxfr.org
# sous licence GPL
# usage ./qos
# usage ./qos stop
# usage ./qos clear
# ici, le script est finement ajusté pour 512kbit de download # et 128kbit d'upload en ADSL pppoe
# merci d'avance pour le retour sur curio@free.fr
# les versions futures de ce script seront dispos a:
# http://www.hq-studio.net/linux/qos/current-qos
# .. quand je suis pas en train de tester des trucs
# dangereux sur le serveur :)
# vous pouvez surveiller ce qui se passe en tapant:
# # tc -s class show dev interface_qui_vous_interesse
# # tc -s qdisc show dev interface_qui_vous_interesse
IPTABLES="/usr/local/sbin/iptables"
TC="/sbin/tc"
LOGGER="/usr/bin/logger"
IP="/sbin/ip"
MODPROBE="/sbin/modprobe"
# définition des UID des users sous lesquels tournent edonkey
# audiogalaxy (ne jamais les lancer en root !)
UIDDONKEY=1002
# si vous n'avez pas installé imq ( parcque beta ),
# mettez cette variable à 1
NOINGRESS="0"
IFINPUT="ppp0"
IFINGRESS="imq0"
IFOUTPUT="ppp0"
$IP link | grep $IFINPUT > /dev/null 2>&1
if [ "$?" != 0 ]; then
echo "probleme: $IFINPUT n'existe pas !"
exit 1
fi
case "$1" in
'stop')
echo Stopping QoS on $IFINGRESS and $IFOUTPUT...
$TC qdisc del dev $IFINGRESS root
$IP link set $IFINGRESS down
$TC qdisc del dev $IFOUTPUT root
$LOGGER "QoS disabled"
;;
'clear')
echo Stopping QoS on $IFINPUT and $IFOUTPUT...
$TC qdisc del dev $IFOUTPUT root
$IPTABLES -F
$IP link set $IFINGRESS down
$IPTABLES -t mangle -F
$TC qdisc del dev $IFINGRESS root
echo Done !
$LOGGER "QoS disabled & iptable rules cleared"
;;
*)
# iptables clean
$IPTABLES -t nat -F
$IPTABLES -F
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
if [ "$NOINGRESS" == "0" ]; then # mise en place de l'interface imq
$MODPROBE imq numdevs=1
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -j IMQ
fi
# mettez vos rêgles de firewall ici # j'ai mis le firewall de MonMotha http://www.mplug.org/phpwiki/index.php?MonMothaReferenceGuide
# marques pour le traffic icmp ( pour benchmark uniquement )
$IPTABLES -t mangle -A INPUT -i $IFINPUT -p icmp -j MARK --set-mark 11
$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
if [ "$NOINGRESS" == "0" ]; then ########################### INPUT RULES (INGRESS) ############################
# par défaut on met tout dans la classe par défaut
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -m length --length 0:1500 -j MARK --set-mark 13
#marques du traffic entrant vers le LAN
$IPTABLES -t mangle -A FORWARD -j MARK --set-mark 50
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -d 192.168.1.5 -j MARK --set-mark 50
$IPTABLES -t mangle -A PREROUTING -i eth1 -d 192.168.1.5 -j MARK --set-mark 50
$IPTABLES -t mangle -A PREROUTING -i eth0 -d 192.168.1.5 -j MARK --set-mark 50
# marques du traffic interactif (telnet & ssh)
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 22:23 -j MARK --set-mark 11
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --dport 22:23 -j MARK --set-mark 11
# marques du traffic edonkey
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 4662 -j MARK --set-mark 15
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --dport 4662 -j MARK --set-mark 15
# Shoutcast et radio
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 8000:8600 -j MARK --set-mark 16
# marques du traffic web , http et https
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 80 -j MARK --set-mark 17
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 443 -j MARK --set-mark 17
# classement des longs downloads http au même niveau que le traffic ftp - en test -
# utilise le match recent, qui est dans le patch-o-matic d'iptables
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 80 -m recent --name web ! --rcheck -j MARK --set-mark 200 $IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 80 -m mark --mark 200 -m recent --name web --set $IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 80 -j MARK --set-mark 17 $IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 80 -m recent --name web ! --rcheck --seconds 45 -j MARK --set-mark 18 # marques du traffic ftp
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 20 -j MARK --set-mark 18 $IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j MARK --set-mark 18
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --dport 20 -j MARK --set-mark 15
$IPTABLES -t mangle -A PREROUTING -i $IFINPUT -p tcp --dport 1024: --sport 1024: -m state --state ESTABLISHED,RELATED -j MARK --set-mark 18
fi
######################### OUTPUT RULES (EGRESS) #############################
# marquage et classement par taille de paquets sortants ( methode d'Emmanuel Roger - www.prout.be )
# remarque: cette méthode réordonne les paquets d'une même connection tcp et peut la ralentir
# dans des cas particuliers ( ici j'ai pas remarqué :), donc si ce script vous ralenti,
# modifiez cette partie ou bien faites une classe pour le traffic qui vous intéresse
$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -m length --length 0:75 -j MARK --set-mark 22
$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -m length --length 76:444 -j MARK --set-mark 23
$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -m length --length 445:1500 -j MARK --set-mark 24
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -m length --length 0:75 -j MARK --set-mark 22
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -m length --length 76:520 -j MARK --set-mark 23
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -m length --length 521:1500 -j MARK --set-mark 24
#marques du traffic vers le LAN et en provenance
$IPTABLES -t mangle -A OUTPUT -o eth1 -m length --length 0:1500 -j MARK --set-mark 51
$IPTABLES -t mangle -A POSTROUTING -o $IFINPUT -s 192.168.1.5 -j MARK --set-mark 51
$IPTABLES -t mangle -A POSTROUTING -o eth0 -s 192.168.1.5 -j MARK --set-mark 51
# marquage du traffic interactif sortant
$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -p tcp --sport 22:23 -j MARK --set-mark 21
$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -p tcp --dport 22:23 -j MARK --set-mark 21
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p tcp --sport 22:23 -j MARK --set-mark 21
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p tcp --dport 22:23 -j MARK --set-mark 21
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p udp --dport 27015:27015 -j MARK --set-mark 21
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p udp --sport 27015:27015 -j MARK --set-mark 21
# marquage du traffic edonkey sortant
#$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -p tcp ! --syn --sport 4662 -j MARK --set-mark 25
#$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -p tcp ! --syn --dport 4662 -j MARK --set-mark 25
#Création nouvelles chaînes SERVER's pour les #serveurs donkey
$IPTABLES -t mangle -N SERVERTCP
$IPTABLES -t mangle -N SERVERUDP
$IPTABLES -t mangle -A OUTPUT -o $IFINPUT -p tcp --dport 4662 -j MARK --set-mark 25
$IPTABLES -t mangle -A OUTPUT -o $IFINPUT -p tcp --sport 4662 -j MARK --set-mark 25
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p tcp -m owner --uid-owner $UIDDONKEY -j SERVERTCP
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p udp -m owner --uid-owner $UIDDONKEY -j SERVERUDP
$IPTABLES -t mangle -A SERVERTCP -o $IFOUTPUT -p tcp --dport 4661 -j MARK --set-mark 20
$IPTABLES -t mangle -A SERVERUDP -o $IFOUTPUT -p udp --dport 4660:4670 -j MARK --set-mark 20
$IPTABLES -t mangle -A SERVERTCP -o $IFOUTPUT -p tcp ! --dport 4661 -j MARK --set-mark 25
$IPTABLES -t mangle -A SERVERUDP -o $IFOUTPUT -p udp ! --dport 4660:4670 -j MARK --set-mark 25
# pour garder un ping très bas, on peut forcer une taille plus petite des paquets au traffic edonkey (facultatif)
$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -p tcp --sport 4662 --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1000
$IPTABLES -t mangle -A PREROUTING ! -i $IFINPUT -p tcp --dport 4662 --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1000
$IPTABLES -A OUTPUT -m owner --uid-owner $UIDDONKEY -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 100
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN --sport 4662 --dport 4662 -j TCPMSS --set-mss 1000
# marquage du traffic du serveur web local
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p tcp --sport 80 -j MARK --set-mark 27
$IPTABLES -t mangle -A OUTPUT -o $IFOUTPUT -p tcp --sport 443 -j MARK --set-mark 27
# declaration des fonctions utilisées pour ajouter des qdisc ou des filtres
function addqdisc {
$TC qdisc add dev $1 parent $2 handle $3 $4 $5 $6 $7 $8
}
function addfilter {
$TC filter add dev $1 parent $2 protocol ip handle $3 fw flowid $4
}
# cleaning
$TC qdisc del dev $IFINGRESS root 2> /dev/null > /dev/null
if [ "$NOINGRESS" == "0" ]; then # règles tc / htb pour le traffic entrant ( ingress )
$TC qdisc add dev $IFINGRESS handle 1:0 root htb default 1
$TC class add dev $IFINGRESS parent 1:0 classid 1:1 htb rate 512kbit ceil 512kbit burst 100k
$TC qdisc add dev $IFINGRESS parent 1:1 handle 10: htb default 203
$TC class add dev $IFINGRESS parent 10:1 classid 10:201 htb rate 500kbit ceil 512kbit burst 90k prio 0 # Traffic du LAN
$TC class add dev $IFINGRESS parent 10:1 classid 10:202 htb rate 384kbit ceil 480kbit burst 67k #small size packets
$TC class add dev $IFINGRESS parent 10:2 classid 10:203 htb rate 48kbit ceil 480kbit burst 2k prio 0 # medium size packets or generic
$TC class add dev $IFINGRESS parent 10:2 classid 10:205 htb rate 260kbit ceil 480kbit burst 80k prio 1 # edonkey speed limitation
$TC class add dev $IFINGRESS parent 10:2 classid 10:207 htb rate 280kbit ceil 400kbit burst 50k prio 0 # www client
$TC class add dev $IFINGRESS parent 10:2 classid 10:208 htb rate 200kbit ceil 450kbit burst 30k prio 1 # ftp data, less important than web surf
$TC class add dev $IFINGRESS parent 10:2 classid 10:209 htb rate 260kbit ceil 480kbit burst 50k prio 0 # guaranted bandwidth, sound must be never cut:)
addqdisc $IFINGRESS 10:201 61:0 pfifo limit 20
addqdisc $IFINGRESS 10:202 62:0 sfq quantum 1492 perturb 70
addqdisc $IFINGRESS 10:203 63:0 sfq quantum 1492 perturb 120
addqdisc $IFINGRESS 10:205 65:0 sfq quantum 1492 perturb 120
addqdisc $IFINGRESS 10:207 67:0 sfq quantum 1492 perturb 120
addqdisc $IFINGRESS 10:208 68:0 sfq quantum 1492 perturb 120
addqdisc $IFINGRESS 10:209 69:0 sfq quantum 1492 perturb 120
addfilter $IFINGRESS 10: 50 10:201
addfilter $IFINGRESS 10: 11 10:202
addfilter $IFINGRESS 10: 13 10:203
addfilter $IFINGRESS 10: 15 10:205
addfilter $IFINGRESS 10: 17 10:207
addfilter $IFINGRESS 10: 18 10:208
addfilter $IFINGRESS 10: 16 10:209
$IP link set $IFINGRESS up
$LOGGER QoS on $IFINPUT for 512k download
echo QoS on $IFINPUT for 512k download
fi
# cleaning
$TC qdisc del dev $IFOUTPUT root >/dev/null 2> /dev/null # règles tc / htb pour le traffic sortant ( egress )
$TC qdisc add dev $IFOUTPUT root handle 1: htb default 102
$TC class add dev $IFOUTPUT parent 1: classid 1:1 htb rate 124kbit ceil 124kbit burst 120k
$TC class add dev $IFOUTPUT parent 1:1 classid 1:100 htb rate 120kbit ceil 124kbit prio 0 burst 100k # LAN
$TC class add dev $IFOUTPUT parent 1:1 classid 1:101 htb rate 26kbit ceil 124kbit prio 1 burst 15k # petits paquets
$TC class add dev $IFOUTPUT parent 1:1 classid 1:102 htb rate 16kbit ceil 124kbit prio 1 burst 10k # paquets moyens
$TC class add dev $IFOUTPUT parent 1:1 classid 1:103 htb rate 13kbit ceil 124kbit prio 1 burst 120 # gros paquets
$TC class add dev $IFOUTPUT parent 1:2 classid 1:104 htb rate 15kbit ceil 60kbit prio 2 burst 120 # edonkey
$TC class add dev $IFOUTPUT parent 1:1 classid 1:106 htb rate 100kbit ceil 120kbit prio 0 burst 3k # webserver
addqdisc $IFOUTPUT 1:100 20:0 pfifo limit 50
addqdisc $IFOUTPUT 1:101 21:0 sfq perturb 3
addqdisc $IFOUTPUT 1:102 22:0 sfq perturb 5
addqdisc $IFOUTPUT 1:103 23:0 sfq perturb 180
addqdisc $IFOUTPUT 1:104 24:0 sfq perturb 180
addqdisc $IFOUTPUT 1:106 26:0 sfq perturb 10
# en premier, on met les ack au haute priorité (ceci peut aussi se faire avec iptables)
$TC filter add dev $IFOUTPUT parent 1: protocol ip prio 1 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:100
addfilter $IFOUTPUT 1: 51 1:100
addfilter $IFOUTPUT 1: 21 1:101
addfilter $IFOUTPUT 1: 22 1:102
addfilter $IFOUTPUT 1: 23 1:102
addfilter $IFOUTPUT 1: 24 1:103
addfilter $IFOUTPUT 1: 25 1:104
addfilter $IFOUTPUT 1: 27 1:106
$LOGGER QoS on $IFOUTPUT for 128k upload
echo QoS on $IFOUTPUT for 128k upload
# règles reaim pour MSN file transfers
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 5190 -j REDIRECT --to-ports 5190
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 1863 -j REDIRECT --to-ports 1863
# ippersonnality rules ;)
# $IPTABLES -t mangle -A PREROUTING -i ppp0 -j PERS --tweak dst --local --conf /etc/dreamcast.conf
# $IPTABLES -t mangle -A OUTPUT -o ppp0 -j PERS --tweak src --local --conf /etc/dreamcast.conf
#/usr/local/donitor/sbin/update_rrd.pl > /dev/null &
#route add -net 239.0.0.0 netmask 255.0.0.0 eth1
;;
esac
exit
|