[Tutorial]Trafficauswertung mit IAM und Huschi

djrick

Registered User
Hallo,

Dieses Tutorial soll euch zeigen, wie man mit Hilfe von IAM und einem Perlscript den Traffic an den Ports des Webservers überwacht und bei zu hohem Trafficaufkommen eine Mail an den Administrator schickt. So lassen sich beispielsweise DDoS Attaken schneller erkennen und abwehren.

Zuerst widmen wir uns der Installation von IAM:

IAM bekommt man auf dieser Webseite: http://www.intevation.de/iam

Hier laden wir uns die aktuelle Version (0.0.2) herunter und entpacken sie im /usr/src Verzeichniss:
Code:
cd /usr/src
wget ftp://ftp.intevation.de/iam/iam-0.0.2.tar.gz
tar xvfz iam-0.0.2.tar.gz
cd  iam-0.0.2
Da IAM mit iptables arbeitet kopieren wir die Datei "iptables.server" ins /etc/init.d Verzeichniss und überschreiben die bereits vorhandene. Sollten per iptables schon Regeln im System sein: Bitte die Dateien entsprechend anpassen:
Code:
cp iptables.server /etc/init.d/iptables
Nun bearbeiten wird die Datei /etc/init.d/iptables mit unserem favourisierten Texteditor und nehmen noch ein paar Einstellungen vor:
Diese Werte sollten so aussehen:
Code:
DUMPFILE=/var/log/iamdump
extif=eth0[FONT=monospace]
[/FONT]extip=IP DEINES SERVERS[FONT=monospace]
[/FONT]intif=lo[FONT=monospace]
[/FONT]hq=127.0.0.1/29[FONT=monospace]
[/FONT]intnet=127.0.0.1/16
Nun erstellen wir noch ein Verzeichnis für die restlichen IAM-Scripts die später benötigt werden:
Code:
mkdir /usr/local/iam
cp * /usr/local/iam/
Nun noch das iptables-Script ausführbar machen, damit die Regeln bei einem Neustart des Servers ebenfalls übernommen werden und das iptablesscript inintalisieren:
Code:
chmod +x /etc/init.d/iptables
/etc/init.d/iptables start
Jetzt erstellen wir für den Benutzer 'root' noch einen Crontab:
Code:
*/5 * * * * /etc/init.d/iptables dump >/dev/null
Nun laden wir uns das zusätzlich benötigte Script von Huschi herrunter:
Code:
cd /root
wget http://www.huschi.net/download/traffic_check.tgz
tar xvfz traffic_check.tgz
Nun müssen wir das Perl Script noch entsprechend anpassen:
Code:
$IAM       = '/usr/local/iam/iam';
$DUMPFILE  = '/var/log/iamdump';
$MAIL_FROM    = 'root@domain.tld';
$MAIL_TO      = 'DEINE@MAILADDR.DE';
Nun kommt der Teil der etwas "tricky" ist:
Wir finden im dem traffic_check Script folgende Werte:
Code:
%CHAINS    = ('outgoing (without other listed services)'        => 0.1,
                          'www (http/https/caudium)'                    => 0.1,
                          'internet services'   => 0.1
Diese Werte geben an, wie groß der Wert sein darf an Traffic bei dem NICHT verwarnt wird.

Also:
Im Abschnitt 'www' , das ist der Traffic vom Apache Webserver (80), dürfte nach oben in 15 min nicht mehr als 0.1 MB Traffic entstehen, alles was größer ist lößt die Warnung an den Webmaster aus. Das ist natürlich Schwachsinn (0.1 MB), diese Werte kann man eigentlich nur durch Erfrahrung oder Ausprobieren anpassen.
Meine Chains sehen so aus:
outgoing (without other listed services)' => 10.0
'www (http/https/caudium)' => 30.0
'other traffic (unspecified)' => 50.0
'internet services' => 30.0
Für einen kleinen nicht ausgelasteten Webserver reicht das.
Nun brauchen wir noch einen Cronjob um das Traffic_Check Script 15 minütlich auszuführen:
Code:
*/15 * * * * /root/traffic_check.pl >/dev/null 2>&1


FERTIG :)
Fragen, Fehler, Anregungen bitte hierdrunter posten.


An dieser Stelle: Danke an Huschi für sein Script
 
Last edited by a moderator:
Hi djrick,

schön, dass Du es gestern Abend noch fix geschrieben hast.
Meine erste Frage hast Du auch gleich beantwortet :) . Im Original-HowTo heißt es nämlich auch, dass man die iptables.server nach /etc/init.d/iptables kopieren soll. Da dort aber schon eine liegt, wusste ich nicht richtig weiter. In die Originaldatei habe ich zugegebenermaßen nicht reingeschaut. Na mal sehen ob ich es hinbekomme die beiden Dateien zu vereinen. Reicht es in der Regel das Neue ans Original anzuhängen?
Als "extif" hast Du eth0. Ist das beim vServer so? Hatte mal ifconfig gemacht und da stand was von Venet0:0, und der hatte die IP des Servers.
Nun müssen wir das Perl Script noch entsprechend anpassen
Welches denn?
Ein Mail wird nur geschickt, wenn die Trafficgrenzen erreicht sind, richtig? Wie sieht es mit einer Tagesmail aus, in der der Traffic des Tages zusammengefasst ist?

Sorry für manch blöde Frage, aber kann von dem Ort wo ich momentan bin nicht auf den Server um zu schauen. Ansonsten nochmal Danke und ich werde mich gleich heute Abend mal wieder dran setzen.

Joker
 
Joker said:
Reicht es in der Regel das Neue ans Original anzuhängen?
Nein du musst das alte iptablesscript mit dem neuen überschreiben.
Als "extif" hast Du eth0. Ist das beim vServer so? Hatte mal ifconfig gemacht und da stand was von Venet0:0, und der hatte die IP des Servers.
Welches denn?
Beim vServer hast du schon recht: venet0:0
Ein Mail wird nur geschickt, wenn die Trafficgrenzen erreicht sind, richtig? Wie sieht es mit einer Tagesmail aus, in der der Traffic des Tages zusammengefasst ist?
Also iam_report generiert eine Zusammenfassung des Traffics, da müsstest du dir selbst ein Script basteln welches das in eine Mail ausgibt und wegschickt
 
So ganz klar bin ich mir mit den iptables nicht. Wollte die Originaldatei ja eigentlich nicht "weghauen".

Naja, jedenfalls kommt folgendes bei "iptables start"
Code:
Warning: wierd character in interface `venet0:0' (No aliases, :, ! or *)
Danach habe ich mal den Dump erzeugt und reingeschaut, da steht auch nur "venet0" da.

Weiter habe ich dann auch noch nichts gemacht.
 
@djrick:
Schöne Arbeit.

Anmerkung von mir:
Der Dreh und Angelpunkt ist natürlich das iptables-Script.
Ich hab es in 'iam' umbenannt und in der Config folgende Zeilen auskommentiert:
Code:
#hq=212.227.80.7/32
[...]
#       new_chain intevation
#       acc_ip intevation $hq
Und auch in der Funktion start_firewall() den Aufruf von allow_all gelöscht/auskommentiert. (Nur wenn andere iptables genutzt werden.)
Dadurch beißt sich dieses Script bei mir nicht mit evtl. vorhandenen iptables.

Zusätzlich fehlt im Howto ein insserv/chkconfig (für Suse/Fedora) um das Script beim Serverstart mit zu laden.

Ach ja: und die Funktionen der eigendlichen Bestimmung hat ricky uns auch unterschlagen:
Einen täglichen Auszug des angefallenen Traffic:
Crontab-Eintrag:
Code:
59      23      *       *       *       /usr/local/iam/traffikmail.sh
Und die modifizierte /usr/local/iam/traffikmail.sh :
Code:
#!/bin/bash

STARTDATUM=$(date "+%Y%m%d")
ENDDATUM=$(date "+%Y%m%d")

/usr/local/iam/iam -r -f $STARTDATUM -t $ENDDATUM /var/log/iamdump | mail -s "Traffikreport von meinem Server" root

huschi.
 
Last edited by a moderator:
Mir ist noch was eingefallen:
Die Datei iamdump sollte man auch ins logrotate aufnehmen. Sonst hab man relativ schnell ein Problem.

huschi.
 
Ja Hallo mal wieder,

ich habe mich mal wieder rangesetzt und hänge jetzt wieder beim starten (/etc/init.d/iam start) und es erscheint nun folgende Meldung:
Code:
Starting iptables ip accounting: iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables: No chain/target/match by that name
iptables.
Leider kann ich damit absolut nichts anfangen. Ich verstehe zwar was da steht, aber nicht den Sinn.

Habe es übrigens so wie Huschi gemacht und das Ganze "iam" genannt, sowie "allow_all" auskommentiert. Wenn ich es "iptables" nenne erscheint die selbe Meldung.

Joker
 
Hat er denn überhaupt was gemacht?
Tippel mal 'iptables -L'.

Habe es übrigens so wie Huschi gemacht
Ob das gut ist.... ;)
Hast Du auch hq auskommentiert?
Hab oben vergessen, daß dann zwei weitere Zeilen auskommentiert werden müsse:
Code:
#       new_chain intevation
#       acc_ip intevation $hq


sowie "allow_all" auskommentiert
Lass es besser drin, wenn Du sonst keine iptables nutzt.

huschi.
 
Last edited by a moderator:
hq hatte ich schon auskommentiert, da beim ersten Start von IAM schon ein Fehler kam, der darauf deutete.
"allow_all" ist auch wieder drin.
Nach start von IAM und Eingabe von "iptables -L" erscheint folgendes:

Code:
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
local      all  --  127.0.0.0/16         anywhere
local      all  --  ******.vserver.de    anywhere
local      all  --  anywhere             anywhere
www        tcp  --  anywhere             anywhere           tcp dpt:http
www        tcp  --  anywhere             anywhere           tcp dpt:https
www        tcp  --  anywhere             anywhere           tcp dpt:22202
ftp        tcp  --  anywhere             anywhere           tcp dpts:ftp-data:ftp
rsync      tcp  --  anywhere             anywhere           tcp dpt:rsync
cvs        tcp  --  anywhere             anywhere           tcp dpts:cvspserver:2404
mail       tcp  --  anywhere             anywhere           tcp dpt:smtp
mail       tcp  --  anywhere             anywhere           tcp spt:smtp
misc       tcp  --  anywhere             anywhere           tcp dpt:ssh
misc       tcp  --  anywhere             anywhere           tcp dpt:domain
misc       udp  --  anywhere             anywhere           udp dpt:domain
misc       tcp  --  anywhere             anywhere           tcp dpt:auth
outgoing   tcp  --  anywhere             anywhere           tcp spts:0:1024
outgoing   udp  --  anywhere             anywhere           udp spts:0:1024
ip_local_port_range  tcp  --  anywhere             anywhere           tcp dpts:32768:61000
ip_local_port_range  tcp  --  anywhere             anywhere           tcp spts:32768:61000
fragment   all  -f  anywhere             anywhere
unknown    all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
local      all  --  anywhere             127.0.0.0/16
local      all  --  anywhere             ******.vserver.de
local      all  --  anywhere             anywhere
www        tcp  --  anywhere             anywhere           tcp spt:http
www        tcp  --  anywhere             anywhere           tcp spt:https
www        tcp  --  anywhere             anywhere           tcp spt:22202
ftp        tcp  --  anywhere             anywhere           tcp spts:ftp-data:ftp
rsync      tcp  --  anywhere             anywhere           tcp spt:rsync
cvs        tcp  --  anywhere             anywhere           tcp spts:cvspserver:2404
mail       tcp  --  anywhere             anywhere           tcp spt:smtp
mail       tcp  --  anywhere             anywhere           tcp dpt:smtp
misc       tcp  --  anywhere             anywhere           tcp spt:ssh
misc       tcp  --  anywhere             anywhere           tcp spt:domain
misc       udp  --  anywhere             anywhere           udp spt:domain
misc       tcp  --  anywhere             anywhere           tcp spt:auth
outgoing   tcp  --  anywhere             anywhere           tcp dpts:0:1024
outgoing   udp  --  anywhere             anywhere           udp dpts:0:1024
ip_local_port_range  tcp  --  anywhere             anywhere           tcp spts:32768:61000
ip_local_port_range  tcp  --  anywhere             anywhere           tcp dpts:32768:61000
fragment   all  -f  anywhere             anywhere
unknown    all  --  anywhere             anywhere

Chain cvs (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain fragment (2 references)
target     prot opt source               destination

Chain ftp (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain ip_local_port_range (4 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain local (6 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain mail (4 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain misc (8 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain outgoing (4 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain related (0 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain rsync (2 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Chain unknown (2 references)
target     prot opt source               destination

Chain www (6 references)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
 
Joker said:
Nach start von IAM und Eingabe von "iptables -L" erscheint folgendes:
Ist ja alles drin. Scheint doch ganz ok zu sein.
Gibt es denn jetzt weitere Probleme?

huschi.
 
MOD: FULL-QUOTE gelöscht!

S4Y - vServer:

Starting iptables ip accounting: Bad argument `intevation'
Try `iptables -h' or 'iptables --help' for more information.
Bad argument `intevation'
Try `iptables -h' or 'iptables --help' for more information.
iptables v1.2.11: Couldn't load target `misc':/lib/iptables/libipt_misc.so: cannot open shared object file: No such file or directory
 
Last edited by a moderator:
ruban said:
Starting iptables ip accounting: Bad argument `intevation'
Siehe Beitrag Nummer 6.
Boardsuche oder Suchfunktion des Browsers nach 'intevation' hätte es auch getan.

huschi.
 
Hallo habe mal eine Frage wie kann ich einzelne ports hinzufühgen beispiel,
22015 für ein CS Server.

danke im Vorraus
 
In tables.server (bzw. /etc/init.d/iptables) ergänzt Du an beliebiger Stelle:
Code:
	new_chain counterstrike
	acc_port counterstrike 22015
	acc_port_out counterstrike 22015
(Neustart nicht vergessen!)

Dann muß in der chains.py bei der Deklaration von names noch ne Zeile eingefügt werden:
Code:
"counterstrike"               : (service, "ConuterStrike-Server"),

Und in der traffic_check.pl muß unter Chains eine entsprechende Zeile ergänzt werden, falls beim Übertraffik gewarnt werden soll.

huschi.
 
Hallo,

ich habe alles gemäß dieser Anleitung aufm einem Server eingerichtet.

Nun bekomme ich von meinem Cron Deamon immer eine E-Mail, mit dem Betreff "Cron <root@www> /usr/local/iam/traffikmail.sh" und dem Inhalt:

/usr/local/iam/traffikmail.sh: line 6: mail: command not found
sys:1: DeprecationWarning: Non-ASCII character '\xdf' in file /usr/local/iam/iam on line 5, but no encoding declared; see PEP 0263 -- Defining Python Source Code Encodings for details


Als Cron habe ich den Befehl /usr/local/iam/traffikmail.sh eingetragen.

Warum, wieso, weshlab?

Danke!
 
Last edited by a moderator:
Ne :-)
Mail ist aber installiert - darum wunderts mich?

----

Habe gerade gemerkt, dass der Cron für meine traffic_check.pl (/usr/bin/perl /usr/local/iam/traffic_check.pl) ebenfalls einen Fehler ausspuckt: sys:1: DeprecationWarning: Non-ASCII character '\xdf' in file /usr/local/iam/iam on line 5, but no encoding declared; see PEP 0263 -- Defining Python Source Code Encodings for details

Danke
 
Last edited by a moderator:
Back
Top