first commit
This commit is contained in:
+176
@@ -0,0 +1,176 @@
|
||||
|
||||
# VPN Monitoring Script
|
||||
|
||||
## **Überblick**
|
||||
|
||||
Dieses Projekt implementiert ein flexibles und robustes VPN-Überwachungsskript, das den Netzwerkverkehr und die VPN-Funktionalität überprüft. Das Skript bietet zeitabhängige Prüfungen und die Möglichkeit, bei Erkennung von Problemen den VPN-Dienst automatisch neu zu starten. Das Skript wurde modular aufgebaut, um die Wartbarkeit und Erweiterbarkeit zu verbessern.
|
||||
|
||||
## **Funktionen**
|
||||
|
||||
1. **Netzwerkverkehrsprüfung**:
|
||||
- Misst den eingehenden und ausgehenden Netzwerkverkehr eines bestimmten Netzwerkinterfaces.
|
||||
- Verwendet Schwellenwerte zur Bewertung der Verbindung.
|
||||
- Automatischer Dienstneustart bei Abweichung von Schwellwerten.
|
||||
|
||||
2. **SQL-basierte Aktivitätsprüfung** (außerhalb der Hauptarbeitszeit):
|
||||
- Überprüft die Datenbank auf Aktivitäten, die durch spezifische Benutzer oder Dienste ausgelöst wurden.
|
||||
- Erkennt inaktive Verbindungen und leitet notwendige Schritte ein.
|
||||
|
||||
3. **Automatischer Neustart des VPN-Dienstes**:
|
||||
- Führt einen Dienstneustart remote über SSH aus.
|
||||
- Überprüft die Funktionalität nach dem Neustart.
|
||||
|
||||
4. **Detailliertes Logging**:
|
||||
- JSON-basiertes Logging für maschinenlesbare und gut strukturierte Ausgaben.
|
||||
- Logrotation zum Schutz vor übermäßigem Speicherverbrauch.
|
||||
|
||||
5. **Konfigurierbarkeit**:
|
||||
- Anpassbare Zeitfenster, Schwellenwerte, Datenbankeinstellungen und SSH-Verbindungsdetails.
|
||||
- Modularer Aufbau für einfache Anpassungen und Erweiterungen.
|
||||
|
||||
---
|
||||
|
||||
## **Installationsanleitung**
|
||||
|
||||
### **Systemanforderungen**
|
||||
- Betriebssystem: Linux (z. B. Ubuntu, Debian, CentOS)
|
||||
- Pakete:
|
||||
- `ifstat`
|
||||
- `mysql-client`
|
||||
- `openssh-client`
|
||||
- `logrotate`
|
||||
- `bc` (für Gleitkommaoperationen)
|
||||
|
||||
### **Installation**
|
||||
1. Klone das Repository oder kopiere die Skriptdateien auf deinen Server:
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd vpn-monitor
|
||||
```
|
||||
|
||||
2. Stelle sicher, dass die erforderlichen Pakete installiert sind:
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install ifstat mysql-client openssh-client logrotate bc
|
||||
```
|
||||
|
||||
3. Konfiguriere die Berechtigungen:
|
||||
```bash
|
||||
chmod +x vpn_monitor.sh
|
||||
chmod +x functions/*.sh
|
||||
```
|
||||
|
||||
4. Passe die `config.conf` Datei an:
|
||||
- Definiere Netzwerkinterface, Schwellenwerte, Datenbankeinstellungen, SSH-Details und Logdateipfad.
|
||||
|
||||
5. (Optional) Füge die Logrotation hinzu:
|
||||
- Kopiere die Datei `logrotate/vpn_monitor` nach `/etc/logrotate.d/`:
|
||||
```bash
|
||||
sudo cp logrotate/vpn_monitor /etc/logrotate.d/
|
||||
```
|
||||
|
||||
6. Plane das Skript mit Cron:
|
||||
- Öffne den Cron-Editor:
|
||||
```bash
|
||||
crontab -e
|
||||
```
|
||||
- Füge den Eintrag hinzu, um das Skript regelmäßig auszuführen:
|
||||
```bash
|
||||
*/5 * * * * /path/to/vpn_monitor.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Nutzung**
|
||||
|
||||
### **Konfiguration**
|
||||
|
||||
Die Einstellungen werden in der Datei `config.conf` vorgenommen. Nachfolgend eine Übersicht der wichtigsten Parameter:
|
||||
|
||||
| Parameter | Beschreibung | Standardwert |
|
||||
|----------------------|-----------------------------------------------------------|-----------------------|
|
||||
| `INTERFACE` | Netzwerkinterface zur Überwachung | `ens19` |
|
||||
| `LOG_FILE` | Pfad zur Logdatei | `/var/log/vpn_monitor.log` |
|
||||
| `THRESHOLD_INBOUND` | Schwellenwert für eingehenden Verkehr (KB/s) | `0.5` |
|
||||
| `THRESHOLD_OUTBOUND` | Schwellenwert für ausgehenden Verkehr (KB/s) | `0.5` |
|
||||
| `MEASUREMENT_COUNT` | Anzahl der Messzyklen | `10` |
|
||||
| `INTERVAL` | Intervall zwischen Messungen (Sekunden) | `6` |
|
||||
| `DB_USER` | Benutzername für die Datenbank | `username` |
|
||||
| `DB_PASSWORD` | Passwort für die Datenbank | `password` |
|
||||
| `DB_NAME` | Name der Datenbank | `database` |
|
||||
| `SSH_KEY` | Pfad zur SSH-Schlüsseldatei | `/path/to/private_key`|
|
||||
| `SSH_USER` | Benutzername für SSH | `user` |
|
||||
| `SSH_HOST` | Hostname oder IP der SSH-Verbindung | `remote_host` |
|
||||
| `SERVICE_NAME` | Name des zu überprüfenden Dienstes | `ipsec.service` |
|
||||
|
||||
---
|
||||
|
||||
### **Ablauf**
|
||||
|
||||
#### **Innerhalb der Hauptarbeitszeit (07:00-18:00 Uhr)**
|
||||
- Misst eingehenden und ausgehenden Netzwerkverkehr.
|
||||
- Vergleicht die Durchschnittswerte mit den definierten Schwellenwerten.
|
||||
- Protokolliert den Status.
|
||||
- Führt bei Bedarf einen Neustart des VPN-Dienstes aus.
|
||||
|
||||
#### **Außerhalb der Hauptarbeitszeit (18:00-07:00 Uhr)**
|
||||
- Überprüft SQL-Aktivitäten:
|
||||
- Letzter Eintrag eines bestimmten Benutzers.
|
||||
- Letzter Eintrag eines spezifischen Dienstes im Log.
|
||||
- Leitet einen Neustart ein, wenn Aktivitätskriterien nicht erfüllt sind.
|
||||
|
||||
---
|
||||
|
||||
## **Fehlerbehandlung**
|
||||
|
||||
Das Skript behandelt potenzielle Fehler folgendermaßen:
|
||||
1. **Netzwerkfehler**:
|
||||
- Kein Output von `ifstat`: Meldet einen Fehler und bricht ab.
|
||||
2. **SQL-Verbindungsfehler**:
|
||||
- Fehlschlagende SQL-Abfragen werden geloggt und führen zum Abbruch.
|
||||
3. **SSH-Fehler**:
|
||||
- Fehler beim Neustart des Dienstes werden detailliert protokolliert.
|
||||
4. **Dienstprüfung**:
|
||||
- Nach Neustart überprüft `ipsec statusall` den Dienststatus. Fehlerhafte Zustände führen zur Eskalation.
|
||||
|
||||
---
|
||||
|
||||
## **Logging**
|
||||
|
||||
- Logs werden standardmäßig unter `/var/log/vpn_monitor.log` gespeichert.
|
||||
- JSON-Format für maschinenlesbare Logs.
|
||||
- Beispiel eines Logeintrags:
|
||||
```json
|
||||
{
|
||||
"timestamp": "2024-11-28 12:45:00",
|
||||
"level": "INFO",
|
||||
"message": "Network traffic is above thresholds. Avg In: 0.6 KB/s, Avg Out: 0.7 KB/s."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Erweiterungsideen**
|
||||
|
||||
1. **Benachrichtigungssystem**:
|
||||
- Integration eines E-Mail- oder Push-Benachrichtigungssystems bei Eskalationen.
|
||||
2. **Multithreading**:
|
||||
- Parallele Prüfung mehrerer Netzwerkinterfaces oder SQL-Datenbanken.
|
||||
3. **Web-Dashboard**:
|
||||
- Echtzeit-Monitoring und Visualisierung der Logs über eine Weboberfläche.
|
||||
4. **Externe API-Integration**:
|
||||
- Verknüpfung mit Monitoring-Tools wie Zabbix oder Prometheus.
|
||||
|
||||
---
|
||||
|
||||
## **Autoren**
|
||||
|
||||
- **Dein Name**
|
||||
E-Mail: [[email protected]](mailto:[email protected])
|
||||
GitHub: [DeinGitHub](https://github.com/DeinGitHub)
|
||||
|
||||
---
|
||||
|
||||
## **Lizenz**
|
||||
|
||||
Dieses Projekt steht unter der MIT-Lizenz. Weitere Informationen findest du in der Datei `LICENSE`.
|
||||
@@ -0,0 +1,26 @@
|
||||
# Netzwerkinterface
|
||||
INTERFACE="ens19"
|
||||
|
||||
# Log-Datei
|
||||
LOG_FILE="/var/log/vpn_monitor.log"
|
||||
|
||||
# Schwellwerte
|
||||
THRESHOLD_INBOUND=0.5
|
||||
THRESHOLD_OUTBOUND=0.5
|
||||
|
||||
# Messparameter
|
||||
MEASUREMENT_COUNT=10
|
||||
INTERVAL=6
|
||||
|
||||
# SQL-Datenbankverbindung
|
||||
DB_USER="username"
|
||||
DB_PASSWORD="password"
|
||||
DB_NAME="database"
|
||||
|
||||
# SSH-Verbindung
|
||||
SSH_KEY="/path/to/private_key"
|
||||
SSH_USER="user"
|
||||
SSH_HOST="remote_host"
|
||||
|
||||
# Dienstname für Neustart
|
||||
SERVICE_NAME="ipsec.service"
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
function log_info() {
|
||||
echo "{\"timestamp\": \"$(date)\", \"level\": \"INFO\", \"message\": \"$1\"}" >> $LOG_FILE
|
||||
}
|
||||
|
||||
function log_error() {
|
||||
echo "{\"timestamp\": \"$(date)\", \"level\": \"ERROR\", \"message\": \"$1\"}" >> $LOG_FILE
|
||||
}
|
||||
|
||||
function log_critical() {
|
||||
echo "{\"timestamp\": \"$(date)\", \"level\": \"CRITICAL\", \"message\": \"$1\"}" >> $LOG_FILE
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
|
||||
function check_network_traffic() {
|
||||
total_inbound=0
|
||||
total_outbound=0
|
||||
|
||||
for ((i=1; i<=$MEASUREMENT_COUNT; i++)); do
|
||||
usage=$(ifstat -i $INTERFACE $INTERVAL 1 | tail -n 1)
|
||||
|
||||
if [[ -z "$usage" ]]; then
|
||||
log_error "No output from ifstat on measurement $i."
|
||||
exit 2
|
||||
fi
|
||||
|
||||
inbound=$(echo $usage | awk '{print $1}')
|
||||
outbound=$(echo $usage | awk '{print $2}')
|
||||
|
||||
total_inbound=$(echo "$total_inbound + $inbound" | bc)
|
||||
total_outbound=$(echo "$total_outbound + $outbound" | bc)
|
||||
done
|
||||
|
||||
avg_inbound=$(echo "scale=2; $total_inbound / $MEASUREMENT_COUNT" | bc)
|
||||
avg_outbound=$(echo "scale=2; $total_outbound / $MEASUREMENT_COUNT" | bc)
|
||||
|
||||
if (( $(echo "$avg_inbound < $THRESHOLD_INBOUND" | bc -l) )) || (( $(echo "$avg_outbound < $THRESHOLD_OUTBOUND" | bc -l) )); then
|
||||
log_critical "Network traffic below thresholds. Avg In: $avg_inbound KB/s, Avg Out: $avg_outbound KB/s."
|
||||
restart_service
|
||||
else
|
||||
log_info "Network traffic is above thresholds. Avg In: $avg_inbound KB/s, Avg Out: $avg_outbound KB/s."
|
||||
fi
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
|
||||
function restart_service() {
|
||||
log_info "Attempting to restart service $SERVICE_NAME on $SSH_HOST."
|
||||
|
||||
ssh -i $SSH_KEY $SSH_USER@$SSH_HOST "sudo systemctl restart $SERVICE_NAME"
|
||||
if [ $? -ne 0 ]; then
|
||||
log_error "Failed to restart service $SERVICE_NAME on $SSH_HOST."
|
||||
exit 2
|
||||
fi
|
||||
|
||||
ssh -i $SSH_KEY $SSH_USER@$SSH_HOST "sudo ipsec statusall | grep -i 'running'"
|
||||
if [ $? -ne 0 ]; then
|
||||
log_critical "Service $SERVICE_NAME not running after restart."
|
||||
exit 2
|
||||
fi
|
||||
|
||||
log_info "Service $SERVICE_NAME successfully restarted and verified."
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
|
||||
function check_sql_activity() {
|
||||
last_order_time=$(mysql -u $DB_USER -p$DB_PASSWORD -D $DB_NAME -sse \
|
||||
"SELECT MAX(create_time) FROM otrs_ticket WHERE create_user = 'LIDLWebservice';")
|
||||
|
||||
last_bsi_log_time=$(mysql -u $DB_USER -p$DB_PASSWORD -D $DB_NAME -sse \
|
||||
"SELECT MAX(log_time) FROM bsi_logs WHERE service = 'ITNovumBSIConnector';")
|
||||
|
||||
if [[ -z "$last_order_time" || -z "$last_bsi_log_time" ]]; then
|
||||
log_error "SQL query failed or returned no data."
|
||||
exit 2
|
||||
fi
|
||||
|
||||
now=$(date +%s)
|
||||
last_order_epoch=$(date -d "$last_order_time" +%s)
|
||||
last_bsi_epoch=$(date -d "$last_bsi_log_time" +%s)
|
||||
|
||||
if (( (now - last_order_epoch) > 3600 && (now - last_bsi_epoch) > 7200 )); then
|
||||
log_critical "SQL activity check failed. No activity in expected timeframes."
|
||||
restart_service
|
||||
else
|
||||
log_info "SQL activity is within acceptable limits."
|
||||
fi
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
# Speichern unter /etc/logrotate.d/vpn_monitor
|
||||
/var/log/vpn_monitor.log {
|
||||
daily
|
||||
missingok
|
||||
rotate 7
|
||||
compress
|
||||
delaycompress
|
||||
notifempty
|
||||
create 640 root root
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Source Konfigurations- und Modul-Dateien
|
||||
source config.conf
|
||||
source functions/logging.sh
|
||||
source functions/network_check.sh
|
||||
source functions/sql_check.sh
|
||||
source functions/restart_service.sh
|
||||
|
||||
# Funktion zur Prüfung der Arbeitszeit
|
||||
function is_within_business_hours() {
|
||||
current_hour=$(date +%H)
|
||||
if (( current_hour >= 7 && current_hour < 18 )); then
|
||||
return 0 # True
|
||||
else
|
||||
return 1 # False
|
||||
fi
|
||||
}
|
||||
|
||||
# Hauptlogik
|
||||
function main() {
|
||||
log_info "Starting VPN monitoring script."
|
||||
|
||||
if is_within_business_hours; then
|
||||
log_info "Within business hours. Running network check."
|
||||
check_network_traffic
|
||||
else
|
||||
log_info "Outside business hours. Running SQL activity check."
|
||||
check_sql_activity
|
||||
fi
|
||||
}
|
||||
|
||||
main
|
||||
Reference in New Issue
Block a user