Devil!
27-03-2006, 17:11
Ciao sto cercando di mettere a punto uno script che faccia uso di iptables e traffic control per gestire la banda in uscita della mia connessione
ecco lo script
#!/bin/sh
#
# banda.sh
# paths
TC="/sbin/tc"
IPTABLES="/sbin/iptables"
case "$1" in
start)
# specifica la lunghezza della coda per dare una latenza di circa 2 secondi ai pacchetti a bassa prioritą
ip link set dev eth0 qlen 30
# diminuisce il MTU
ip link set dev eth0 mtu 1492
# specifica la lunghezza della coda per eth0
ifconfig eth0 txqueuelen 16
# specifica l' HTB qdisc per la gestione della coda
$TC qdisc add dev eth0 root handle 1: htb default 10
# stabilisce la classe principale
$TC class add dev eth0 parent 1: classid 1:1 htb rate 450kbit
# stabilisce le sottoclassi e per ciascuna la banda e la prioritą
$TC class add dev eth0 parent 1:1 classid 1:10 htb rate 450kbit prio 1
$TC class add dev eth0 parent 1:1 classid 1:20 htb rate 450kbit prio 2
$TC class add dev eth0 parent 1:1 classid 1:30 htb rate 80kbit prio 3
$TC class add dev eth0 parent 1:1 classid 1:40 htb rate 50kbit prio 4
$TC class add dev eth0 parent 1:1 classid 1:50 htb rate 400kbit prio 5
# aggiunge l'algoritmo qdisc alle classi create per suddividere la banda equamente
$TC qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev eth0 parent 1:40 handle 40: sfq perturb 10
$TC qdisc add dev eth0 parent 1:50 handle 50: sfq perturb 10
# limita la banda alle porte del proxy
$TC filter add dev eth0 parent 1: protocol ip u32 match ip sport 13452 0xffff flowid 1:30
$TC filter add dev eth0 parent 1: protocol ip u32 match ip sport 13453 0xffff flowid 1:30
# limita la banda ai client del proxy
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:40
$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:40
$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:40
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
# limita la banda ai processi usando i marks di iptables
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 10 fw flowid 1:10
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 20 fw flowid 1:20
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 30 fw flowid 1:30
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 40 fw flowid 1:40
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 50 fw flowid 1:50
# aggiunge le entrate fwmark per classificare i differenti tipi di uscite
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 0:1024 -j MARK --set-mark 10 # default per traffico attraverso porte < 1024
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 0:1024 -j MARK --set-mark 10 # ""
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 20 -j MARK --set-mark 20 # ftp
$IPTABLES -t mangle -A OUTPUT -p icmp -j MARK --set-mark 10 # ICMP (ping)
$IPTABLES -t mangle -A OUTPUT -p udp -j MARK --set-mark 10 # DNS & UDP
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 20 # secure shell
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 20 # ""
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 13452 -j MARK --set-mark 30 # proxy http
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 13452 -j MARK --set-mark 30 #""
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 80 -j MARK --set-mark 50 # web server
$IPTABLES -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 10 # small packets (ACKs)
$IPTABLES -t mangle -A OUTPUT -m mark --mark 0 -j MARK --set-mark 20 # redundant- pacchetti non specificati
$IPTABLES -t mangle -A OUTPUT -m owner --uid-owner 33 -j MARK --set-mark 50 # torrentflux
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 139 -j MARK --set-mark 20 # samba
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 138 -j MARK --set-mark 20 # ""
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 137 -j MARK --set-mark 20 # ""
;;
stop)
# elimina le classi
$TC qdisc del dev eth0 root
;;
esac
exit 0
La parte che mi dą problemi č in corsivo, poichč oltre ad non avere effetto nei test che ho effettuato, inibisce anche l'effetto delle regole sovrastanti riguardanti la limitazione di porte o client.
In pratica ho fatto dei test prima commentando la parte incriminata e le regole sovrastanti funzionanvano, viceversa decommentandola non funzionavano.
Commentando le regole precedenti e decommentando la parte incriminata lo stesso non funziona
Dov'č che sbaglio?
ecco lo script
#!/bin/sh
#
# banda.sh
# paths
TC="/sbin/tc"
IPTABLES="/sbin/iptables"
case "$1" in
start)
# specifica la lunghezza della coda per dare una latenza di circa 2 secondi ai pacchetti a bassa prioritą
ip link set dev eth0 qlen 30
# diminuisce il MTU
ip link set dev eth0 mtu 1492
# specifica la lunghezza della coda per eth0
ifconfig eth0 txqueuelen 16
# specifica l' HTB qdisc per la gestione della coda
$TC qdisc add dev eth0 root handle 1: htb default 10
# stabilisce la classe principale
$TC class add dev eth0 parent 1: classid 1:1 htb rate 450kbit
# stabilisce le sottoclassi e per ciascuna la banda e la prioritą
$TC class add dev eth0 parent 1:1 classid 1:10 htb rate 450kbit prio 1
$TC class add dev eth0 parent 1:1 classid 1:20 htb rate 450kbit prio 2
$TC class add dev eth0 parent 1:1 classid 1:30 htb rate 80kbit prio 3
$TC class add dev eth0 parent 1:1 classid 1:40 htb rate 50kbit prio 4
$TC class add dev eth0 parent 1:1 classid 1:50 htb rate 400kbit prio 5
# aggiunge l'algoritmo qdisc alle classi create per suddividere la banda equamente
$TC qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev eth0 parent 1:40 handle 40: sfq perturb 10
$TC qdisc add dev eth0 parent 1:50 handle 50: sfq perturb 10
# limita la banda alle porte del proxy
$TC filter add dev eth0 parent 1: protocol ip u32 match ip sport 13452 0xffff flowid 1:30
$TC filter add dev eth0 parent 1: protocol ip u32 match ip sport 13453 0xffff flowid 1:30
# limita la banda ai client del proxy
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:40
$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:40
$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:40
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
#$TC filter add dev eth0 parent 1: protocol ip u32 match ip dst **.**.**.** flowid 1:30
# limita la banda ai processi usando i marks di iptables
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 10 fw flowid 1:10
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 20 fw flowid 1:20
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 30 fw flowid 1:30
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 40 fw flowid 1:40
$TC filter add dev eth0 parent 1: prio 0 protocol ip handle 50 fw flowid 1:50
# aggiunge le entrate fwmark per classificare i differenti tipi di uscite
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 0:1024 -j MARK --set-mark 10 # default per traffico attraverso porte < 1024
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 0:1024 -j MARK --set-mark 10 # ""
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 20 -j MARK --set-mark 20 # ftp
$IPTABLES -t mangle -A OUTPUT -p icmp -j MARK --set-mark 10 # ICMP (ping)
$IPTABLES -t mangle -A OUTPUT -p udp -j MARK --set-mark 10 # DNS & UDP
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 22 -j MARK --set-mark 20 # secure shell
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 20 # ""
$IPTABLES -t mangle -A OUTPUT -p tcp --dport 13452 -j MARK --set-mark 30 # proxy http
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 13452 -j MARK --set-mark 30 #""
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 80 -j MARK --set-mark 50 # web server
$IPTABLES -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 10 # small packets (ACKs)
$IPTABLES -t mangle -A OUTPUT -m mark --mark 0 -j MARK --set-mark 20 # redundant- pacchetti non specificati
$IPTABLES -t mangle -A OUTPUT -m owner --uid-owner 33 -j MARK --set-mark 50 # torrentflux
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 139 -j MARK --set-mark 20 # samba
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 138 -j MARK --set-mark 20 # ""
$IPTABLES -t mangle -A OUTPUT -p tcp --sport 137 -j MARK --set-mark 20 # ""
;;
stop)
# elimina le classi
$TC qdisc del dev eth0 root
;;
esac
exit 0
La parte che mi dą problemi č in corsivo, poichč oltre ad non avere effetto nei test che ho effettuato, inibisce anche l'effetto delle regole sovrastanti riguardanti la limitazione di porte o client.
In pratica ho fatto dei test prima commentando la parte incriminata e le regole sovrastanti funzionanvano, viceversa decommentandola non funzionavano.
Commentando le regole precedenti e decommentando la parte incriminata lo stesso non funziona
Dov'č che sbaglio?