Spamdyke Übersicht mit mrtg

Ulrich

Registered User
Hallo Allerseits,

ich habe mit Hilfe von mrtg: MRTG - Tobi Oetiker's MRTG - The Multi Router Traffic Grapher eine Grafik erstellt, welche die E-Maillast aus Spamdyke MySQL ausliest und darstellt.

Siehe: msp-it - Leistungsdaten

Für mrtg gibt es eine Menge Erklärungen....einfach mal googeln.

Um die Spam- und nicht Spam-E-Mails darzustellen sieht meine mrtg.cfg wie folgt aus:

Code:
WorkDir: /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/emaillast

Language: german

Target[mrtg]: `/srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/emaillast/getstats.sh`
MaxBytes[mrtg]: 10000
Title[mrtg]: msp-it - E-Maillast
XSize[mrtg]: 520
YSize[mrtg]: 150
PNGTitle[mrtg]: msp informations technologie - E-Maillast
Options[mrtg]: growright, noinfo, nopercent, integer, gauge, noarrow, nobanner, nolegend, pngdate, logscale
kilo[mrtg]: 1000
YLegend[mrtg]: E-Mails pro Stunde (log)
ShortLegend[mrtg]: E-Mail/Stunde
LegendI[mrtg]: Angenommen
LegendO[mrtg]: Abgelehnt (Spam)
Die Daten besorgt in diesem Fall also 'getstat.sh'. Hier wird die Anzahl aus der letzten Stunde berechnet. Daher sind meine Kurven etwas abgerundet:

Code:
#!/bin/zsh

echo `mysql spamdyke --user=usernameVonSpamdyke --password=kennwortVonSpamdyke --execute="select count(*) from spamdyke_log_table where reason='ALLOWED' and unix_timestamp(time) > unix_timestamp(now())-3600;" --silent --silent`
echo `mysql spamdyke --user=usernameVonSpamdyke --password=kennwortVonSpamdyke --execute=" select ( select count(*) from spamdyke_log_table where unix_timestamp(time) > unix_timestamp(now())-3600 ) - ( select count(*) from spamdyke_log_table where reason='ALLOWED' and unix_timestamp(time) > unix_timestamp(now())-3600 );" --silent --silent`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
Jetzt muss man noch einen Eintrag mit 'crontab -e' erstellen:

Code:
*/5    *    *    *    *    /usr/bin/mrtg /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/emaillast/mrtg.cfg >/dev/null 2>&1
Jetzt hat man im Verzeichnis die PNG-Grafiken und kann sie, wie ich, in seine Webseite einbauen. Sieht doch ganz nett aus? Oder?

Fragen? Fragen!

Grüße,

Ulrich
 
Last edited by a moderator:
Das ist im übrigen der richtige Link: msp-it - Leistungsdaten

Wie rufst du denn die Daten von der CPU und der HDD ab? Geht das auch per SNMP oder nimmst du ein lokales Script?

Ich nehme die Daten lokal ab. Via SNMP geht nicht alles.

Ich habe openSUSE, vielleicht ist es bei anderen Distributionen leicht anders.

Netzlast
Code:
#!/bin/sh

echo `grep eth0 /proc/net/dev|tr -s " "|cut -d: -f2|cut -d" " -f2`
echo `grep eth0 /proc/net/dev|tr -s " "|cut -d: -f2|cut -d" " -f9`
echo `uptime | tr -s " " | cut -d" " -f4-`
echo `hostname`
Netzverbindungslast
Code:
#!/bin/sh

echo `grep "udp" /proc/net/nf_conntrack|wc -l`
echo `grep "tcp" /proc/net/nf_conntrack|wc -l`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
Plattenlast
Code:
#!/bin/zsh

echo `df -B1|grep "rootfs"|tr -s " "|cut -d" " -f4`
echo `df -B1|grep "rootfs"|tr -s " "|cut -d" " -f3`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
Prozesslast
Code:
#!/bin/zsh

echo `ps axu|grep "\["|wc -l`
echo `ps -A|wc -l`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
Prozessorlast
Code:
#!/bin/zsh

_mpstat=`mpstat 295 1|grep "Average"|tr -s " "`
echo $_mpstat|cut -d" " -f10
echo $_mpstat|cut -d" " -f3
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
Speicherlast
Code:
#!/bin/zsh

echo $((`grep "Inactive" /proc/meminfo|tr -s " "|cut -d" " -f2`*1024))
echo $((`grep "Active" /proc/meminfo|tr -s " "|cut -d" " -f2`*1024))
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
PlattenIOlast
Code:
#!/bin/zsh

_iostat=`iostat 295 2|grep "sda "|sed -n "2p"|tr -s " "`
echo $_iostat|cut -d" " -f4
echo $_iostat|cut -d" " -f3
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
ACHTUNG!
PlattenIOlast und Prozessorlast bleiben für 295 Sekunden 'hängen', da hier sonst keine wirklichen Werte ermittelt werden können. Das liegt an iostat und mpstat. Diese Programme musste ich auch mit yast nachinstallieren. Daher rufe ich per crontab ein Skript auf, welches mehrfach mrtg startet, immer mit einem '&' am Ende der Zeile!
 
Hallo Ullrich,

eine schöne Idee, habe ich auch mal für meinen Server umgesetzt - danke !

Wärest du so freundlich mal deine mrtg.cfg für die Netzlast hier zu posten? Ggf. auch für die Netzverbindungslast, wobei ich da noch nicht weiß, wie ich die unter Debian 4 abgreifen kann, denn /proc/net/nf_conntrack existiert nicht.

Vielen Dank,

Jan
 
Hier die mrtg.cfg für Netzlast:
Code:
WorkDir: /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzlast

Target[mrtg]: `/srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzlast/getstats.sh`
MaxBytes[mrtg]: 25000000
Title[mrtg]: msp-it - Netzlast
XSize[mrtg]: 520
YSize[mrtg]: 150

Language: german

PNGTitle[mrtg]: msp informations technologie - Netzlast

Options[mrtg]: growright, bits, noinfo, nopercent, integer, noarrow, nobanner, nolegend, pngdate, logscale, integer
kilo[mrtg]:1024
YLegend[mrtg]:Bits pro Sekunde (log)
Diese 'mrtg.cfg' kann auch exemplarisch für alle anderen Daten genutzt werden. Wichig sind die Options: Hier wird eingestellt, wie mrtg die Grafen aussehen lässt.

Die Daten werden durch die 'getstats.sh' ermittelt.

Die nf_conntrak wird durch ein Kernelmodul erstellt. Ich nutze 'iptables' als Firewall.
 
Vielen Dank !

Die /proc/net/nf_conntrack habe ich zwar nicht und weiß auch nicht, was ich tun müsste, damit ich sie bekommen würde, aber ich greif die Daten dann aus der /proc/net/ip_conntrack ab.

Grüße,

Jan
 
Es mag Geschmackssache sein, aber solche Graphen wie "Prozessorlast", "RAM" oder "Plattenauslastung" skaliere ich gerne auf den maximal möglichen Wert. Da kann man die Auslastung besser auf einen Blick erkennen, als wenn der obere Rand auf "96%" oder "14GB" skaliert ist.
 
Noch ein Nachschlag zu den Netzverbindungslast.

Um die aktuellen Verbindungen mit Anzahl und Hostnamen anzuzeigen, habe ich meine 'getstats.zsh' wie folgt verändert:
Code:
#!/bin/zsh

( for a in `cat /proc/net/nf_conntrack|awk '{ print substr( $0, match( $0, "src=" ) +4 ) }'|cut -d" " -f1|grep -v "0000:"|grep -v "87.106.1.103"|grep -v "80.153.209.193"|grep -v "87.139.91.42"|grep -v "87.139.90.243"|grep -v "87.106.254.63"|grep -v "87.106.254.18"|sort -n|uniq`; do; echo -e "`grep -c "$a" /proc/net/nf_conntrack` - $a  \t- `host $a|cut -d" " -f5`"; done; )|sort -nr >./currcons.txt

echo `grep "udp" /proc/net/nf_conntrack|wc -l`
echo `grep "tcp" /proc/net/nf_conntrack|wc -l`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
Mit 'grep -v' blende ich eine Reihe von IP-Adressen aus. Hier bitte selber Anpassungen vornehmen.

Da ich ein Freund der zShell bin (zsh) sind meine Shellscripte in 'zsh' geschrieben und damit getestet. Also bitte ggfls. zsh nachinstallieren.

Beispiel hier: msp-it - Netzverbindungslast
(ganz unten....)

Die Ausgabe wird in eine Datei umgeleitet, die ich mit einem iFrame in die Webseite eingebunden habe.
 
Hi,

und noch so eine geniale Idee von dir Ulrich. Ich habe es versucht, umzuschreiben, damit auch ohne zsh geht ... Aber es gelingt mir nicht, sort zur Ausgabe in die Datei zu bewegen:

Code:
#!/bin/sh

( for a in `cat /proc/net/nf_conntrack|awk '{ print substr( $0, match( $0, "src=" ) +4 ) }'|cut -d" " -f1|grep -v "0000:"|grep -v "87.106.1.103"|sort -n|uniq` 
do
echo -e "`grep -c "$a" /proc/net/nf_conntrack` - $a  \t- `host $a|cut -d" " -f5`"; 
done;
sort -nr >./currcons.txt
)

echo `grep "udp" /proc/net/nf_conntrack|wc -l`
echo `grep "tcp" /proc/net/nf_conntrack|wc -l`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`

In der Schleife nützt das nix, dann hab ich ja immer nur die letzte Ausgabe in der Datei stehen und nach der Schleife mag er gar nix in die Datei ausgeben. Wer hat die Lösung für mich ?

Danke,

Jan
 
Ungetestet:
Code:
#!/bin/sh

( for a in `cat /proc/net/nf_conntrack|awk '{ print substr( $0, match( $0, "src=" ) +4 ) }'|cut -d" " -f1|grep -v "0000:"|grep -v "87.106.1.103"|sort -n|uniq` 
do
echo -e "`grep -c "$a" /proc/net/nf_conntrack` - $a  \t- `host $a|cut -d" " -f5`"; 
done;
) [COLOR="Red"]| sort -nr >./currcons.txt[/COLOR]

echo `grep "udp" /proc/net/nf_conntrack|wc -l`
echo `grep "tcp" /proc/net/nf_conntrack|wc -l`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`
 
Ungetestet:
Code:
#!/bin/sh

( for a in `cat /proc/net/nf_conntrack|awk '{ print substr( $0, match( $0, "src=" ) +4 ) }'|cut -d" " -f1|grep -v "0000:"|grep -v "87.106.1.103"|sort -n|uniq` 
do
echo -e "`grep -c "$a" /proc/net/nf_conntrack` - $a  \t- `host $a|cut -d" " -f5`"; 
done;
) [COLOR="Red"]| sort -nr >./currcons.txt[/COLOR]

echo `grep "udp" /proc/net/nf_conntrack|wc -l`
echo `grep "tcp" /proc/net/nf_conntrack|wc -l`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`

1a, besten Dank dafür. Die Variante hatte ich nicht getestet, ich hatte das | an der falschen Stelle die ganze Zeit vorher :-)

Wobei ich grade festgestellt habe, wenn ich per Hand meine Datei verbindungen starte
Code:
#!/bin/sh

env LANG=C /usr/bin/mrtg /var/www/vhosts/domain.de/httpdocs/last/verbindungen/verbindungen.cfg >/dev/null 2>&1
läuft alles und die currcons.txt wird erstellt.

Wenn der cronjob ausgeführt wird mit demselben Befehl, wird die Grafik erstellt, aber die currcons.txt nicht.

EDIT: Blöder Fehler, wird natürlich erstellt, nur nicht im "richtigen" Verzeichnis :-) Pfad nicht richtig angepasst für die Ausführung via crontab.
 
Last edited by a moderator:
Damit die for Schleife mit der Bash (sh) funktioniert, einfach das Semikolon nach dem do entfernen.

Wenn der Cronjob mrtg aufruft, muss der Pfad zur currcons.txt komplett ausgeschrieben sein.
 
Last edited by a moderator:
@Admin: Vielleicht sollte dieser Thread verschoben werden, da er nicht mehr allzuviel mit Plesk zu tun hat? Bleiben dann die gespeicherten Benachrichtigungen erhalten?
 
Ich habe die Netzverbindungslast erweitert, damit man eine Nachricht bekommt, wenn die Anzahl der Verbindungen sprunghaft ansteigt. Siehe: msp-it - Leistungsdaten

Hier die getstat.zsh:
Code:
#!/bin/zsh

# Liste der aktuellen Verbindungen schreiben
( for a in `cat /proc/net/nf_conntrack|awk '{ print substr( $0, match( $0, "src=" ) +4 ) }'|cut -d" " -f1|grep -v "0000:"|grep -v "87.106.1.103"|grep -v "80.153.209.193"|grep -v "87.139.91.42"|grep -v "87.139.90.243"|grep -v "87.106.254.63"|grep -v "87.106.254.18"|grep -v "62.159.236.26"|sort -n|uniq`; do; echo -e "`grep -c "$a" /proc/net/nf_conntrack` - $a  \t- `host $a|cut -d" " -f5`"; done; )|sort -nr >/srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/currcons.txt

# Abweichung in Prozent ausrechnen
(( a = ( `grep "tcp" /proc/net/nf_conntrack|wc -l` * 100 / `cat /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpcons.txt` ) -100 ))

# Abweichung schreiben
echo "$a%" >/srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpvar.txt
echo `cat /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpcons.txt` >/srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpconsold.txt

# Anzahl der aktuellen Verbindungen schreiben
echo `grep "tcp" /proc/net/nf_conntrack|wc -l` >/srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpcons.txt

# Wenn aktuelle Abweichung > als gemerkte Abweichung, dann Abweichung merken
if (( `cat /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpvar.txt|awk '{ printf "%i", $1 }'` > `cat /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpvarmax.txt|awk '{ printf "%i", $1 }'` ))
then 
    cat /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpvar.txt >/srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpvarmax.txt
fi

# Wenn aktuelle Abweichung > 100%, dann E-Mail senden
if (( `cat /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/tcpvar.txt|awk '{ printf "%i", $1 }'` > 100 ))
then
    ip=`head -n1 /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/currcons.txt|cut -d" " -f3`
    echo -e "`cat /srv/www/vhosts/msp-it.de/httpdocs/leistungsdaten/netzverbindungslast/currcons.txt`\n\n\n`grep -n "$ip" /proc/net/nf_conntrack`"|mail -s "Netzverbindungslast um mehr als 100% angestiegen" ulrich.manns@msp-it.de
fi

echo `grep "udp" /proc/net/nf_conntrack|wc -l`
echo `grep "tcp" /proc/net/nf_conntrack|wc -l`
echo `uptime|tr -s " "|cut -d" " -f4-`
echo `hostname`

Der obere Teil schreibt ein paar Dateien, die man in seine Webseite als iframe aufnehmen kann. Ändert sich die Anzahl der Verbindungen um mehr als 100%, dann gibt es eine E-Mail. Bitte hier die gewünschte E-Mailadresse eintragen. ;-)

Die letzten 4 Zeilen stellen die Informationen für mrtg dar.

Das ganze wird, wie weiter oben beschrieben mittels Cron Job aufgerufen und läuft somit alle 5 Minuten. Bei einem TCP Time Out von 1 Minute bekommt man nicht alles mit, aber wenn eine Brute Force Attacke läuft, dann geht die eh länger als 5 Minuten. :-)

Ich konnte so schon so einiges rechtzeitig blocken.
 
Hallo

super Scripte danach hatte ich gesucht. Hab es auch so eingebaut und die Graphen werden auch regelmässig alle 5 Minuten erstellt.

Nur werden keine Emails gezählt. Woran kann das liegen?

Ubuntu 8.0.4

und ich verwende nicht das hier :#!/bin/zsh


Hat jemand Rat?
 
Back
Top