Good day All
I'm starting to learn the whole of bandwidth management thing
I download Allan Beaufour Larsen script(attatched)
There are a few thing I dont understand
Please help
*Class 1:10,line 65
at the Iptables he marks packages for " -m tos --tos Minimize-Delay"
What is this
and
same,line 95 class 1:12 " -m tos --tos Maximize-Throughput" and line
106 " -m tos --tos Minimize-Cost"
and
down to the htb config line 212 for class 1:13 he talks about NATed
traffic but he doen not use this class anywhere
Please shed some light on these
And is this script any good??
#!/bin/bash
#
# NetCtrl version 0.3 by Allan Beaufour Larsen
#
# netctrl This script starts and stops shaping of network traffic.
#
# chkconfig: - 95 05
# description: netctrl shapes the network traffic.
# It adds marking to the 'mangle' iptable,
# and creates priority trees with htb for both $DEV and imq0.
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -f /sbin/tc ] || exit 0
RETVAL=0
prog=netctrl
######################################################################
# Setup local environment
######################################################################
# Device to be shaped
DEV=eth0
# Ceiling of outgoing connection (in kbit)
CEIL_UP=64
# Ceiling of incomming connection (in kbit)
CEIL_DOWN=1425
# Burst rate set for ex. browsing
BURST=30k
# What should the new table be named
# (to avoid conflict with pre-existing tables)
CHAINNAME=NETCTRL
######################################################################
# This function sets up the iptables to mark each packet type.
# This will enable the shapers to handle them accordingly.
######################################################################
setup_iptables() {
echo -n " Create ${CHAINNAME} chain "
( iptables -t mangle -N ${CHAINNAME} && echo_success) || echo_failure
echo
# Setup marking of packets in ${CHAINNAME}
echo -n " Setting up marking of packets in ${CHAINNAME} "
############
# CLASS 1:10
############
# ICMP-packets (Ping, etc.)
#echo -n " Iptables for icmp class 1:10"
iptables -t mangle -A ${CHAINNAME} -p icmp -j MARK --set-mark 0x1
# Minimize-delay TOS
iptables -t mangle -A ${CHAINNAME} -m tos --tos Minimize-Delay -j MARK --set-mark 0x1
# SSH
#echo -n " Iptables for ssh class 1:10"
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 22 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 0x1
iptables -t mangle -A INPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 0x1
# SYN-packets
iptables -t mangle -I ${CHAINNAME} -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x1
# DNS
#echo -n " Iptables for dns class 1:10"
iptables -t mangle -I ${CHAINNAME} -p udp -m udp --sport 53 -j MARK --set-mark 0x1
iptables -t mangle -I ${CHAINNAME} -p udp -m udp --dport 53 -j MARK --set-mark 0x1
############
# CLASS 1:11
############
# HTTP
#echo -n " Iptables for http class 1:11"
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --sport 80 -j MARK --set-mark 0x2
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2
# HTTPS
#echo -n " Iptables for https class 1:11"
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --sport 443 -j MARK --set-mark 0x2
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 443 -j MARK --set-mark 0x2
############
# CLASS 1:12
############
# Maximize-Throughput TOS (should we trust people?)
iptables -t mangle -A ${CHAINNAME} -m tos --tos Maximize-Throughput -j MARK --set-mark 0x3
############
# CLASS 1:13
############
# Empty for now (used for local server packets)
############
# CLASS 1:14
############
# Minimize-cost TOS
iptables -t mangle -A ${CHAINNAME} -m tos --tos Minimize-Cost -j MARK --set-mark 0x5
# SMTP
#echo -n " Iptables for smtp class 1:14"
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 25 -j MARK --set-mark 0x5
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-mark 0x5
iptables -t mangle -A INPUT -p tcp -m tcp --dport 25 -j MARK --set-mark 0x5
# POP3
#echo -n " Iptables for pop3 class 1:14"
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 110 -j MARK --set-mark 0x5
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 110 -j MARK --set-mark 0x5
iptables -t mangle -A INPUT -p tcp -m tcp --dport 110 -j MARK --set-mark 0x5
# IMAP
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 143 -j MARK --set-mark 0x5
# IMAPS
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 993 -j MARK --set-mark 0x5
# POP3S
iptables -t mangle -A ${CHAINNAME} -p tcp -m tcp --dport 995 -j MARK --set-mark 0x5
echo_success
echo
############
# CATCH REST
############
echo -n " Setting default mark for PREROUTING "
#echo -n " Iptables for catch rest"
( iptables -t mangle -A PREROUTING -j MARK --set-mark 0x6 && echo_success) || echo_failure
echo
echo -n " Setting default mark for OUTPUT "
( iptables -t mangle -A OUTPUT -j MARK --set-mark 0x3 && echo_success) || echo_failure
echo
#########################
# JOIN IMQ WITH NEW CHAIN
#########################
# echo -n " Join chain to IMQ"
# ( iptables -t mangle -i ${DEV} -A ${CHAINNAME} -j IMQ && echo_success) || echo_failure
# Should '-i ${DEV}' be put in this rule to exclude traffic to server?
# This may have created trouble...
# echo
############################
# JOIN TABLES WITH NEW CHAIN
############################
for tab in PREROUTING # OUTPUT gives kernel panic (IMQ-jump should probably me moved from CHAINNAME to PREROUTING???
do
echo -n " Join $tab with ${CHAINNAME} "
( iptables -t mangle -A $tab -j ${CHAINNAME} && echo_success) || echo_failure
echo
done
}
######################################################################
# This function creates the "tree" with the classes (buckets)
# buckets where the traffic is sent to.
# Each class has a priority and bandwidth limitations.
######################################################################
setup_htb() {
if [ -z "$1" -o -z "$2" ]; then
echo "Ooops! Wrong parameters for setup_htb()!"
exit 2
fi
LDEV=$1;
CEIL=$2;
echo -n " Setting up htb for $LDEV (ceil = $CEIL) "
# Number of classes (used to set rate for each class)
NUM_CLASSES=5
# Create root of tree, set default class to 1:15
tc qdisc add dev ${LDEV} root handle 1: htb default 15
tc class add dev ${LDEV} parent 1: classid 1:1 htb rate ${CEIL}kbit ceil ${CEIL}kbit
##############################################
# Class 1:10
# Description: Interactive traffic
# Types: ssh, dns, irc, SYN-packets
##############################################
tc class add dev ${LDEV} parent 1:1 classid 1:10 htb rate $[$CEIL/$NUM_CLASSES]kbit burst ${BURST} ceil ${CEIL}kbit prio 0
tc filter add dev ${LDEV} parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
#################################################################
# Class 1:11
# Description: Web
# Types: http,https
#################################################################
tc class add dev ${LDEV} parent 1:1 classid 1:11 htb rate $[$CEIL/$NUM_CLASSES]kbit burst ${BURST} ceil ${CEIL}kbit prio 1
tc filter add dev ${LDEV} parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
#################################################################
# Class 1:12
# Description: Local processes on machine and 'Maximize-Throughput TOS'
# Types: *
#################################################################
tc class add dev ${LDEV} parent 1:1 classid 1:12 htb rate $[$CEIL/$NUM_CLASSES]kbit ceil ${CEIL}kbit prio 2
tc qdisc add dev ${LDEV} parent 1:12 handle 120: sfq perturb 10
tc filter add dev ${LDEV} parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
#################################################################
# Class 1:13
# Description: High priority NATed traffic
# Traffic: *
#################################################################
tc class add dev ${LDEV} parent 1:1 classid 1:13 htb rate 20kbit ceil ${CEIL}kbit prio 2
tc qdisc add dev ${LDEV} parent 1:13 handle 130: sfq perturb 10
tc filter add dev ${LDEV} parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
#################################################################
# Class 1:14
# Description: Mail traffic and 'Minimize-Cost TOS'
# Traffic: smtp, pop3, pop3s, imap, imaps
#################################################################
tc class add dev ${LDEV} parent 1:1 classid 1:14 htb rate $[$CEIL/$NUM_CLASSES]kbit ceil ${CEIL}kbit prio 3
tc qdisc add dev ${LDEV} parent 1:14 handle 140: sfq perturb 10
tc filter add dev ${LDEV} parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
#################################################################
# Class 1:15
# Description: Catch-all, rest of traffic
# Traffic: *
#################################################################
tc class add dev ${LDEV} parent 1:1 classid 1:15 htb rate $[$CEIL/$NUM_CLASSES]kbit ceil ${CEIL}kbit prio 3
tc qdisc add dev ${LDEV} parent 1:15 handle 150: sfq perturb 10
tc filter add dev ${LDEV} parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15
echo_success
echo
}
######################################################################
######################################################################
setup_outbound() {
setup_htb $DEV $CEIL_UP
}
######################################################################
######################################################################
#setup_inbound() {
# echo -n " Adding imq module to kernel "
# ( modprobe imq numdevs=1 && echo_success ) || echo_failure
# echo
#
# echo -n " UP'ing imq0 device "
# ( ip link set imq0 up && echo_success ) || echo_failure
# echo
#
# # Setup htb for IMQ device
# setup_htb imq0 $CEIL_DOWN
#}
######################################################################
######################################################################
shutdown_htb() {
if [ -z "$1" ]; then
echo "Ooops! Wrong parameters to shutdown_htb()"
exit 2
fi
LDEV=$1
echo -n " Removing htb from $DEV "
(tc qdisc del dev $LDEV root 2> /dev/null > /dev/null && echo_success) || echo_failure
echo
}
######################################################################
######################################################################
shutdown_outbound() {
shutdown_htb $DEV
}
######################################################################
######################################################################
#shutdown_inbound() {
# shutdown_htb imq0
#
# echo -n " DOWN'ning imq0 device "
# (ip link set imq0 down 2> /dev/null > /dev/null && echo_success) || echo_failure
# echo
# echo -n " Remove imq module from kernel "
# (rmmod imq 2> /dev/null > /dev/null && echo_success) || echo_failure
# echo
#}
######################################################################
######################################################################
shutdown_iptables() {
for tab in PREROUTING # OUTPUT
do
echo -n " Removing ${CHAINNAME} from $tab "
( iptables -t mangle -D $tab -j ${CHAINNAME} && echo_success) || echo_failure
echo
done
echo -n " Clearing ${CHAINNAME} chain "
( iptables -t mangle -F ${CHAINNAME} && echo_success) || echo_failure
echo
echo -n " Delete ${CHAINNAME} chain "
( iptables -t mangle -X ${CHAINNAME} && echo_success) || echo_failure
echo
echo -n " Removing default mark from PREROUTING "
( iptables -t mangle -D PREROUTING -j MARK --set-mark 0x6 && echo_success) || echo_failure
echo
echo -n " Removing default mark from OUTPUT "
( iptables -t mangle -D OUTPUT -j MARK --set-mark 0x3 && echo_success) || echo_failure
echo
}
######################################################################
######################################################################
start() {
echo $"Starting $prog: "
setup_outbound
# setup_inbound
setup_iptables
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
######################################################################
######################################################################
stop() {
echo $"Shutting down $prog: "
shutdown_iptables
# shutdown_inbound
shutdown_outbound
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
######################################################################
# See how we were called.
######################################################################
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
RETVAL=$?
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
# Show the status
echo "********** $DEV: qdisc"
tc -s qdisc ls dev $DEV
echo "********** $DEV: class"
tc -s class ls dev $DEV
# echo "********** imq0: qdisc"
# tc -s qdisc ls dev imq0
# echo "********** imq0: class"
# tc -s class ls dev imq0
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
exit $RETVAL