Cartman
02/04/2004, 15:40
Πριν λίγες μέρες έφτιαξα ένα traffic shaping script και θα ήθελα τη γνώμη σας.
Στόχος είναι
1)το δίκτυο να δουλεύει σταθερά
2)να έχουν όλα τα connections bandwidth ανα πάσα στιγμή
3)να μην κάνει timeout ο ενας client όταν ο γείτονάς του κατεβάζει με 50 και 100 kb/sec
3)Ισοτιμία ανάμεσα σε όλους τους χρήστες, είτε πέφτουν σε ασύρματο interface είτε πέφτουν στον ρουτερ με Lan
4)Χαμηλοί χρόνοι απόκρισης για τις εφαρμογές που το χρειάζονται (voip, ssh, games κτλ)
5)Να μην ενοχλούν τα file sharing
6)Προστασία απο flooding, συγκεκριμένα είδη επιθέσεων κτλ.
Να σημειώσω οτι η παροχή διαδικτύου στο δίκτυό μας γίνεται μέσω vpn, και οτι φυσικά το script είναι πειραματικότατο(!).
#!/bin/sh
#version 0.15 02-04-04 15:40
# init script written by Cartman of Heraklion Student Wireless Network.
INTERFACE="$1"
rc_done=" done"
rc_failed=" failed"
return=$rc_done
TC='/sbin/TC'
IPTABLES='/usr/sbin/iptables'
TC_reset ()
{
# Reset everything to a known state (cleared)
$TC qdisc del dev $INTERFACE root 2> /dev/null > /dev/null
}
TC_status ()
{
echo "[qdisc - $INTERFACE]"
$TC -s qdisc show dev $INTERFACE
echo "------------------------"
echo
echo "[class - $INTERFACE]"
$TC -s class show dev $INTERFACE
}
TC_showfilter ()
{
echo "[filter - $INTERFACE]"
$TC -s filter show dev $INTERFACE
}
case "$2" in
start)
echo -n "Starting traffic shaping on interface $1"
TC_reset
U320="$TC filter add dev $INTERFACE protocol ip parent 1:0 prio 0 u32"
#
# dev eth0 - creating qdiscs & classes
#
$TC qdisc add dev $INTERFACE root handle 1: htb default 50
$TC class add dev $INTERFACE parent 1: classid 1:1 htb rate 100000kbit
$TC class add dev $INTERFACE parent 1:1 classid 1:10 htb rate 220kbit ceil 1100kbit prio 0
$TC class add dev $INTERFACE parent 1:1 classid 1:20 htb rate 220kbit ceil 1100kbit prio 1
$TC class add dev $INTERFACE parent 1:1 classid 1:30 htb rate 110kbit ceil 880kbit prio 2
$TC class add dev $INTERFACE parent 1:1 classid 1:40 htb rate 220kbit ceil 1100kbit prio 3
$TC class add dev $INTERFACE parent 1:1 classid 1:50 htb rate 800kbit ceil 3300kbit prio 4
$TC class add dev $INTERFACE parent 1:1 classid 1:60 htb rate 660kbit ceil 3300kbit prio 5
#
$TC qdisc add dev $INTERFACE parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:40 handle 40: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:50 handle 50: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:60 handle 60: sfq perturb 10
TC_status
#
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 110 fw flowid 1:10
# $TC filter add dev $INTERFACE protocol udp parent 1:0 prio 1 handle 120 fw flowid 1:20
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 130 fw flowid 1:30
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 140 fw flowid 1:40
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 150 fw flowid 1:50
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 160 fw flowid 1:60
#
#
#IPtables flush
$IPTABLES -F
#
#6th class
#internet vpn
#
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dst 10.176.4.162 -j MARK --set-mark 60
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --src 10.176.4.162 -j MARK --set-mark 60
#
#5th class
#bulk traffic
#
# $TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip tos 0x08 0xff flowid 1:50
#
# 1st class
#ACK packets
#
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 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:10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --syn -m length --length 40:68 -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL SYN,ACK -m length --length 40:68 -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL ACK -m length --length 40:100 -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL RST -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL ACK,RST -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL ACK,FIN -j MARK --set-mark 10
#
#2nd class
# UDP
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p udp -j MARK --set-mark 20
#
#3rd class
#interactive SSH traffic,dns
#
#
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport ssh -m length --length 40:100 -j MARK --set-mark 30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport ssh -m length --length 40:100 -j MARK --set-mark 30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p upd --dport domain -j MARK --set-mark 30
#dreambox
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport 678 -j MARK --set-mark 30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport 678 -j MARK --set-mark 30
#
# 4th class
#ICMP
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:40
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p icmp -m length --length 28:1500 -m limit --limit 2/s --limit-burst 5 -j MARK --set-mark 40
#web
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp -m multiport --sport http,pop3,imap,https,imaps -j MARK --set-mark 40
#ssh bulk
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport ssh -m length --length 101: -j MARK --set-mark 40
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport ssh -m length --length 101: -j MARK --set-mark 40
#mail elpizw;-)
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport 25 -j MARK --set-mark 40
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport 6667 -j MARK --set-mark 40
#DC++ server chat
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport 441 -j MARK --set-mark 40
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport 441 -j MARK --set-mark 40
;;
stop)
echo -n "Stopping traffic shaper on interface $1"
TC_reset || return=$rc_failed
echo -e "$return"
;;
restart|reload)
$0 $1 stop && $0 $1 start || return=$rc_failed
;;
stats|status)
TC_status
;;
filter)
TC_showfilter
;;
*)
echo "Usage: $0 interface {start|stop|restart|stats|filter}"
exit 1
esac
test "$return" = "$rc_done" || exit 1
Είναι ήδη διαπιστωμένα κάποια λάθη σε αυτό το srcipt.
Συγκεκριμένα, θα ήθελα τα φώτα σας στο πώς να τσακώσω τα πακέτα του vpn, και τα πακέτα των mail. Ακόμη, τί φίλτρο θα προτείνατε για τα voip? Για τα παιχνίδια; Και τέλος, μπορεί ο dc server να επιβάλλει στους χρήστες να κάνουν σε συγκεκριμένο port τα transfers;
Στόχος είναι
1)το δίκτυο να δουλεύει σταθερά
2)να έχουν όλα τα connections bandwidth ανα πάσα στιγμή
3)να μην κάνει timeout ο ενας client όταν ο γείτονάς του κατεβάζει με 50 και 100 kb/sec
3)Ισοτιμία ανάμεσα σε όλους τους χρήστες, είτε πέφτουν σε ασύρματο interface είτε πέφτουν στον ρουτερ με Lan
4)Χαμηλοί χρόνοι απόκρισης για τις εφαρμογές που το χρειάζονται (voip, ssh, games κτλ)
5)Να μην ενοχλούν τα file sharing
6)Προστασία απο flooding, συγκεκριμένα είδη επιθέσεων κτλ.
Να σημειώσω οτι η παροχή διαδικτύου στο δίκτυό μας γίνεται μέσω vpn, και οτι φυσικά το script είναι πειραματικότατο(!).
#!/bin/sh
#version 0.15 02-04-04 15:40
# init script written by Cartman of Heraklion Student Wireless Network.
INTERFACE="$1"
rc_done=" done"
rc_failed=" failed"
return=$rc_done
TC='/sbin/TC'
IPTABLES='/usr/sbin/iptables'
TC_reset ()
{
# Reset everything to a known state (cleared)
$TC qdisc del dev $INTERFACE root 2> /dev/null > /dev/null
}
TC_status ()
{
echo "[qdisc - $INTERFACE]"
$TC -s qdisc show dev $INTERFACE
echo "------------------------"
echo
echo "[class - $INTERFACE]"
$TC -s class show dev $INTERFACE
}
TC_showfilter ()
{
echo "[filter - $INTERFACE]"
$TC -s filter show dev $INTERFACE
}
case "$2" in
start)
echo -n "Starting traffic shaping on interface $1"
TC_reset
U320="$TC filter add dev $INTERFACE protocol ip parent 1:0 prio 0 u32"
#
# dev eth0 - creating qdiscs & classes
#
$TC qdisc add dev $INTERFACE root handle 1: htb default 50
$TC class add dev $INTERFACE parent 1: classid 1:1 htb rate 100000kbit
$TC class add dev $INTERFACE parent 1:1 classid 1:10 htb rate 220kbit ceil 1100kbit prio 0
$TC class add dev $INTERFACE parent 1:1 classid 1:20 htb rate 220kbit ceil 1100kbit prio 1
$TC class add dev $INTERFACE parent 1:1 classid 1:30 htb rate 110kbit ceil 880kbit prio 2
$TC class add dev $INTERFACE parent 1:1 classid 1:40 htb rate 220kbit ceil 1100kbit prio 3
$TC class add dev $INTERFACE parent 1:1 classid 1:50 htb rate 800kbit ceil 3300kbit prio 4
$TC class add dev $INTERFACE parent 1:1 classid 1:60 htb rate 660kbit ceil 3300kbit prio 5
#
$TC qdisc add dev $INTERFACE parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:20 handle 20: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:30 handle 30: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:40 handle 40: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:50 handle 50: sfq perturb 10
$TC qdisc add dev $INTERFACE parent 1:60 handle 60: sfq perturb 10
TC_status
#
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 110 fw flowid 1:10
# $TC filter add dev $INTERFACE protocol udp parent 1:0 prio 1 handle 120 fw flowid 1:20
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 130 fw flowid 1:30
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 140 fw flowid 1:40
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 150 fw flowid 1:50
# $TC filter add dev $INTERFACE protocol ip parent 1:0 prio 1 handle 160 fw flowid 1:60
#
#
#IPtables flush
$IPTABLES -F
#
#6th class
#internet vpn
#
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dst 10.176.4.162 -j MARK --set-mark 60
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --src 10.176.4.162 -j MARK --set-mark 60
#
#5th class
#bulk traffic
#
# $TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip tos 0x08 0xff flowid 1:50
#
# 1st class
#ACK packets
#
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 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:10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --syn -m length --length 40:68 -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL SYN,ACK -m length --length 40:68 -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL ACK -m length --length 40:100 -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL RST -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL ACK,RST -j MARK --set-mark 10
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --tcp-flags ALL ACK,FIN -j MARK --set-mark 10
#
#2nd class
# UDP
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p udp -j MARK --set-mark 20
#
#3rd class
#interactive SSH traffic,dns
#
#
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport ssh -m length --length 40:100 -j MARK --set-mark 30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport ssh -m length --length 40:100 -j MARK --set-mark 30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p upd --dport domain -j MARK --set-mark 30
#dreambox
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport 678 -j MARK --set-mark 30
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport 678 -j MARK --set-mark 30
#
# 4th class
#ICMP
$TC filter add dev $INTERFACE parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:40
# $IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p icmp -m length --length 28:1500 -m limit --limit 2/s --limit-burst 5 -j MARK --set-mark 40
#web
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp -m multiport --sport http,pop3,imap,https,imaps -j MARK --set-mark 40
#ssh bulk
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport ssh -m length --length 101: -j MARK --set-mark 40
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport ssh -m length --length 101: -j MARK --set-mark 40
#mail elpizw;-)
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport 25 -j MARK --set-mark 40
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport 6667 -j MARK --set-mark 40
#DC++ server chat
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --dport 441 -j MARK --set-mark 40
$IPTABLES -t mangle -A POSTROUTING -o $INTERFACE -p tcp --sport 441 -j MARK --set-mark 40
;;
stop)
echo -n "Stopping traffic shaper on interface $1"
TC_reset || return=$rc_failed
echo -e "$return"
;;
restart|reload)
$0 $1 stop && $0 $1 start || return=$rc_failed
;;
stats|status)
TC_status
;;
filter)
TC_showfilter
;;
*)
echo "Usage: $0 interface {start|stop|restart|stats|filter}"
exit 1
esac
test "$return" = "$rc_done" || exit 1
Είναι ήδη διαπιστωμένα κάποια λάθη σε αυτό το srcipt.
Συγκεκριμένα, θα ήθελα τα φώτα σας στο πώς να τσακώσω τα πακέτα του vpn, και τα πακέτα των mail. Ακόμη, τί φίλτρο θα προτείνατε για τα voip? Για τα παιχνίδια; Και τέλος, μπορεί ο dc server να επιβάλλει στους χρήστες να κάνουν σε συγκεκριμένο port τα transfers;