Ich hatte mich heute morgen gefragt wie ich am einfachsten den Traffic, der meine ownCloud Server (im einzelnen) erzeugen, messen kann. Herausgekommen ist folgendes kleine Script welches mittels iptabels den Traffic misst.
Als Beispiel möchte ich hier das Script so verwenden, dass es alle 5 Minuten den gemessenen Wert ausließt und die entsprechende „Kette“ bei iptables wieder leert. Der Wert wird dann inkl. Datum/Uhrzeit in ein Logfile (CSV-Format) geschrieben welches man nach belieben weiter verarbeiten kann.
Die entsprechenden „Ketten“ in iptables werden geprüft und bei Bedarf angelegt.
Mit dem Parameter –help wird eine kleine Hilfe ausgegeben
#/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin
# Autor: Knut Herter
# Web : www.systemtechnics.de
# Date : 12/2015
#
# This Script count the http(s) Traffic to the Owncloud Server and
# print output as CSV line.
#
# CSV-Header: Date, Time, Traffic-INPUT, Traffic-OUTPUT
#
# Example for usage with cron ( crontab -e ):
#
# */5 * * * * /root/bin/owncloud-traffic --date --time --zero-chain >> /var/log/owncloud-traffic.log
#
# Hint: set correct vars at crontab eg
#
# SHELL=/bin/bash
# PATH=/bin:/sbin:/usr/bin:/usr/sbin
#
#### do not change lines below ####
# Check ist iptables available
#
if [ ! `which iptables` ];
then echo "IPTABLES not Found, Stop Script";
exit 1
fi
IPT=`which iptables`
CHAIN_IN="TRAFFIC_IN"
CHAIN_OUT="TRAFFIC_OUT"
DATE=""
TIME=""
COUNT_OUT=""
COUNT_IN=""
LABEL_IN=""
LABEL_OUT=""
# Check if iptables chain exist
# $1 = chain to check
# return 0 if OK, 1 if not
#
function check_chain() {
if ! iptables -nL $1 > /dev/null 2>&1 ; then
return 1
fi
return 0
}
# Print help for this script
#
function printhelp() {
printf "\n\n"
printf "$0 [parameters]\n"
printf " --help\t\t this help\n"
printf " --zero-chain\t set Traffic Chain to Zero\n"
printf " --date\t\t print date\n"
printf " --time\t\t print timestamp\n"
printf " --label-out\t print label for OUT-Bytes\n"
printf " --label-in\t print label for IN-Bytes\n"
printf "\n\n"
exit 0
}
# check parameters
#
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
--zero-chain)
ZERO=true
;;
--help)
printhelp
;;
--date)
DATE=$(date +"%F")","
;;
--time)
TIME=$(date +"%H:%M")","
;;
--label-out)
LABEL_OUT="OUT="
;;
--label-in)
LABEL_IN="IN="
;;
*)
nothing="true"
;;
esac
shift
done
# check if chain OUTPUT exist
#
if ! check_chain $CHAIN_OUT ; then
echo "Chain $CHAIN_OUT not found"
echo "Configure iptables Chain OUTPUT"
$IPT -N $CHAIN_OUT
$IPT -I OUTPUT -j $CHAIN_OUT
$IPT -A $CHAIN_OUT -p tcp -m multiport --sports 80,443
$IPT -A $CHAIN_OUT -j RETURN
fi
# check if chain INPUT exist
#
if ! check_chain $CHAIN_IN ; then
echo "Chain $CHAIN_IN not found"
echo "Configure iptables Chain INPUT"
$IPT -N $CHAIN_IN
$IPT -I INPUT -j $CHAIN_IN
$IPT -A $CHAIN_IN -p tcp -m multiport --dports 80,443
$IPT -A $CHAIN_IN -j RETURN
fi
COUNT_OUT=$(iptables -L $CHAIN_OUT -n -v -x | grep -v -i "return" | awk '$1 ~ /^[0-9]+$/ { printf "%d\n",$2 }')
COUNT_IN=$( iptables -L $CHAIN_IN -n -v -x | grep -v -i "return" | awk '$1 ~ /^[0-9]+$/ { printf "%d\n",$2 }')
# if parameter --zero-chain ..
if [ $ZERO ]; then
$IPT -Z $CHAIN_OUT
$IPT -Z $CHAIN_IN
fi
printf "$DATE$TIME"
printf "$LABEL_IN$COUNT_IN,"
printf "$LABEL_OUT$COUNT_OUT"
printf "\n"
Wenn man nun in die Crontab folgende Zeile hinzufügt, dann wird unter /var/log/ z.B. eine CSV-Datei erzeugt mit der man die Daten weiter verarbeiten kann
*/5 * * * * /root/bin/owncloud-traffic --date --time --zero-chain >> /var/log/owncloud-traffic.log
Es bietet sich auch an, das Logfile in logrotate zu konfigurieren damit es nicht zu groß wird und evtl. Werte älter als 2 Jahre nicht aufgehoben werden.
Am einfachsten folgendes in /etc/logrotate.d/owncloud-traffic speichern:
/var/log/owncloud-traffic.log {
monthly
rotate 24
compress
delaycompress
missingok
create 666 www-data www-data
}