Minimalistisches Netzwerk-Monitoring mit SmokePing und Telegram

Lesezeit: 7 Minuten

Ich habe mich kürzlich von PRTG als Monitoring-Software für mein Netzwerk verabschiedet, weil es für meine Zwecke einfach ein massiver Overkill war und zuletzt auch der letzte Grund war, einen Windows-Server zu betreiben.

Als Alternative zu PRTG bin ich auf SmokePing gestoßen, was ein altes aber für meine Zwecke perfekt geeignetes Tool darstellt und genau die zwei Kernfunktionen abdeckt, die sich über die Jahre als die einzig wirklich wichtigen herausgestellt haben:

  • Alarmieren, wenn ein Gerät oder eine Website nicht mehr erreichbar ist
  • Latenz über längere Zeiträume aufzeichnen, um schleichend auftretende Probleme nachvollziehen zu können

Demo-Server vom Autor: https://smokeping.oetiker.ch/

Installation

apt update && apt install smokeping

Sobald SmokePing installiert ist, sollte man die Weboberfläche unter http://serverIP/smokeping aufrufen können. Andernfalls: systemctl start smokeping.

Konfiguration

  1. Targets definieren (Geräte, die überwacht werden sollen)
  2. Alerts definieren (was unter welchen Umständen passieren soll)
  3. Notifications konfigurieren (Beispiele)
    • per Telegram Bot
    • per Home Assistant

Alle Konfigurationsdateien befinden sich unter /etc/smokeping/config.d/.

1.) Targets definieren

nano /etc/smokeping/config.d/Targets

*** Targets ***

probe = FPing

menu = Top
title = Network Latency Grapher
remark = Welcome to the SmokePing website of resch.cloud.

#========================================================
+ WWW
menu = WWW
title = WWW
alerts = packetloss

++ resch_cloud
menu = resch.cloud
title = resch.cloud
host = resch.cloud

++ Blog
menu = blog.resch.cloud
title = blog.resch.cloud
host = blog.resch.cloud

++ Nextcloud
menu = Nextcloud
title = Nextcloud (storage.resch.cloud)
host = storage.resch.cloud

...

So könnte eine Konfigurationsdatei für die Targets aussehen. Wichtig dabei ist, dass die „ID“ eines Targets, hier z.B. resch_cloud KEINE Sonderzeichen enthalten darf!

Wenn alles korrekt ist, lässt sich smokeping mit systemctl restart smokeping ohne Fehler neu starten. Falls Fehler auftreten, sind wahrscheinlich noch Fehler in der Konfiguration. Diese lassen sich mit smokeping --check finden.

2.) Alerts definieren

nano /etc/smokeping/config.d/Alerts

*** Alerts ***
# Externes Skript ausführen, wenn der Alarm ausgelöst wird
to = |/etc/smokeping/config.d/smokeping-notification.sh

# This rule checks for 3 * 5mins of >60% loss
+packetloss
type = loss
pattern = >60%,>60%,>60%
edgetrigger = yes
comment = Massive loss for 5 mins

Das Beispiel definiert den Alert packetloss. Dieser wird ausgelöst, sobald an einem Target für drei aufeinanderfolgende 5-Minuten-Blöcke ein Paketverlust von mehr als 60% auftritt.

Die dritte Zeile definiert, dass das bash Script smokeping-notification.sh ausgeführt werden soll, wenn dieser Fall eintritt.

3.) Notification einrichten

Beispiel 1: Notification per Telegram

Telegram eignet sich sehr gut, um per Telegram Bot Nachrichten zu verschicken. Das funktioniert an einzelne Personen oder auch an Gruppenchats. Nachdem Telegram aber standardmäßig nicht verschlüsselt und sonst auch datenschutztechnisch fragwürdig ist, sollte man keine sensiblen Informationen darüber versenden.

Telegram Bot erstellen und API-Token sichern

  1. Telegram Account erstellen
  2. Chat mit BotFather beginnen
  3. /newbot senden und Anleitung folgen
  4. API-Token sichern

Chat ID abrufen

  1. URL /getUpdates“>https://api.telegram.org/bot<APIToken>/getUpdates erneut aufrufen. Dort siehst du nun alle chats, an denen dein neuer Bot beteiligt ist. Aktuell sollte das nur einer sein und dessen Chat ID brauchst du für das weitere Vorgehen:
...
"chat": {
    "id": 123123123,  // Diese ID brauchst du
    "first_name": "DeinName",
    "type": "private"
},
...

Jetzt haben wir alles, was wir brauchen, um automatisiert Nachrichten an den Bot schicken zu können: den API-Token und die Chat-ID.

Notification-Script erstellen

nano /etc/smokeping/config.d/smokeping-notification.sh

Wir erstellen nun das Script, das vorhin in der Alerts-Config definiert wurde.

#!/bin/bash


# --------- Telegram Notification ---------
# Set the API token and chat ID
API_TOKEN="APIToken"
CHAT_ID="123123123"

# Set the message text
MESSAGE="Smokeping-Alarm!"

# Use the curl command to send the message
curl -s -X POST https://api.telegram.org/bot$API_TOKEN/sendMessage -d chat_id=$CHAT_ID -d text="$MESSAGE"

# Loggen, dass eine Nachricht versendet wurde
# echo "Nachricht per Telegram gesendet: $(date)" >> /var/log/smokeping_alerts.log

Damit es auch ausgeführt werden kann, sobald smokeping einen Alert auslöst, machen wir es mit chmod +x /etc/smokeping/config.d/smokeping-notification.sh ausführbar.

Wir testen das Script mit /etc/smokeping/config.d/smokeping-notification.sh und sollten eine Telegram-Nachricht bekommen:

Beispiel 2: Notification per Home Assistant

Wer Home Assistant nutzt, kann auch dessen App dazu verwenden um Push-Notifications abzusetzen.

Automation in Home Assistant

alias: Push-Notification bei Smokeping-Alarm
description: ""
triggers:
  - trigger: webhook
    allowed_methods:
      - POST
      - PUT
    local_only: true
    webhook_id: "mySecretWebhookID"
conditions: []
actions:
  - action: notify.mobile_app_myPhone
    metadata: {}
    data:
      message: Paketverlust im Netzwerk
      title: Smokeping Alert
      data:
        url: http://mySmokepingServer/smokeping/?target=_charts.loss
mode: single

Die Zeile url: http://mySmokepingServer/smokeping/?target=_charts.loss sorgt dafür, dass man gleich auf die Smokeping-Weboberfläche kommt, wenn man auf die Notification tippt.

Notification-Script erstellen

nano /etc/smokeping/config.d/smokeping-notification.sh

Natürlich kann man innerhalb eines Scripts auch Notifications per Telegram UND Home Assistant absetzen. Dazu einfach folgenden Code (außer der ersten Zeile) an das zuvor erstellte smokeping-notification.sh anhängen.

#!/bin/bash

# POST-Request an die Webhook-URL senden
curl -X POST https://myHomeAssistant/api/webhook/mySecretWebhookID

# Loggen, dass der Webhook ausgeführt wurde
# echo "Webhook gesendet: $(date)" >> /var/log/smokeping_alerts.log

Damit es auch ausgeführt werden kann, sobald smokeping einen Alert auslöst, machen wir es mit chmod +x /etc/smokeping/config.d/smokeping-notification.sh ausführbar.

Wir testen das Script mit /etc/smokeping/config.d/smokeping-notification.sh und sollten eine Home Assistant-Nachricht bekommen.

Wenn man den Wald vor lauter Bäumen nicht sieht...
An dieser Stelle wurde mir klar, dass eigentlich Home Assistant selbst mithilfe der Ping-Integration praktisch exakt dieselbe Aufgabe wie Smokeping übernehmen könnte. Aber was solls, jetzt ist der Beitrag eh schon fast fertig und vielleicht gibts ja noch zwei Nerds ohne Home Assistant 🤷‍♂️.

Optional: Smokeping per HTTPS ausliefern

a2enmod ssl

Zertifikat und Privaten Schlüssel unter /etc/ssl/ ablegen und privaten Schlüssel mit chmod 600 schützen.

Apache-conf für HTTPS

# Liefert alles unter /var/www/html/ per HTTP aus
<VirtualHost *:80>
  ServerName myServerFQDN
  DocumentRoot /var/www/html/
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

# Liefert alles unter /var/www/html/ per HTTPS aus
<VirtualHost *:443>
    ServerName myServerFQDN
    DocumentRoot /var/www/html/

    SSLEngine on
    SSLCertificateFile /etc/ssl/myServerFQDN.crt
    SSLCertificateKeyFile /etc/ssl/myServerFQDN_key.pem

    <Directory /var/www/html/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

# Smokeping-Weiterleitung BEGINN
# Leitet Anfragen an myServerFQDN/smokeping an Smokeping weiter
    ScriptAlias /smokeping/smokeping.cgi /usr/lib/cgi-bin/smokeping.cgi
    Alias /smokeping /usr/share/smokeping/www

    <Directory "/usr/share/smokeping/www">
        DirectoryIndex smokeping.cgi
        Options FollowSymLinks ExecCGI
        AllowOverride None
        Require all granted
    </Directory>

    <Directory "/usr/lib/cgi-bin">
        Options +ExecCGI
        AddHandler cgi-script .cgi
        Require all granted
    </Directory>

    <Directory "/var/www/html">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
# Smokeping-Weiterleitung ENDE

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Apache mit systemctl restart apache2 neu starten.


Wenn du Feedback loswerden möchtest, nutze bitte das Kontaktformular.

Falls dir mein Beitrag weitergeholfen hat, würde ich mich sehr über einen kleinen Kaffee freuen. Oder du nutzt einen meiner Empfehlungslinks und sparst dir damit etwas Geld: Hetzner Cloud (20€ Guthaben), Ufodrive (30€ Rabatt), aWATTar. Außerdem habe ich eine Wunschliste bei Amazon.


Schreibe einen Kommentar