Erst VPN-Verbindung, dann MySQL

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Benutzeravatar
petrolman
Beiträge: 65
Registriert: 20.05.2010 14:54:22

Erst VPN-Verbindung, dann MySQL

Beitrag von petrolman » 13.09.2024 14:18:35

Hallo,

ich möchte gerne, dass nach einem Serverneustart eine VPN-Verbindung automatisch hergestellt und erst danach MySQL gestartet wird, damit MySQL als Slave über die VPN-Verbindung laufen kann. Die VPN-Verbindung wird bereits Debian typisch nach dem Neustart hergestellt. Jetzt scheint es so zu sein, dass MySQL bereits vor der VPN-Verbindung versucht, eine Verbindung zum Master herzustellen. In der MySQL-Console bleibt die Meldung "Connecting to Master" stehen. Daher müsste der Fehler doch noch in der Service-Datei liegen. Wenn ich nämlich MySQL stoppe und starte, wird die Verbindung zum Master sofort hergestellt. Also kann es nur am Timing beim Serverneustart liegen. Hier meine Service-Datei für MySQL:

/etc/systemd/system/mysql.service

Code: Alles auswählen

[Unit]
Description=MySQL Server
After=network.target openvpn-client@comtrance.service
Requires=openvpn-client@comtrance.service

[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
ExecStop=/usr/local/mysql/bin/mysqladmin shutdown
Restart=on-failure
LimitNOFILE=5000

[Install]
WantedBy=multi-user.target

Bekommt man das irgendwie doch noch hin?

Benutzeravatar
cosinus
Beiträge: 4669
Registriert: 08.02.2016 13:44:11
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Bremen

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von cosinus » 13.09.2024 14:22:42

Mit before/after sollte das möglich sein, vgl. https://unix.stackexchange.com/question ... clarations

Benutzeravatar
petrolman
Beiträge: 65
Registriert: 20.05.2010 14:54:22

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von petrolman » 13.09.2024 14:45:44

Ok, ich habe noch Before=mysql.service in der Service-Datei für OpenVPN eingefügt. Funktioniert leider immer noch nicht. Die Verbindung zum Master klappt nach dem Serverneustart nicht (Connecting to master...). Ich muss dann wieder manuell stoppen und starten.

Benutzeravatar
petrolman
Beiträge: 65
Registriert: 20.05.2010 14:54:22

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von petrolman » 13.09.2024 15:26:07

Hallo, es funktioniert nun. Ich habe in der MySQL-Servicedatei ein warte-auf-VPN Skript eingefügt.

/usr/local/bin/wait-for-vpn.sh

Code: Alles auswählen

#!/bin/bash
while ! ip a | grep -q "tun0"; do
  sleep 2
done
Und im Service dann noch die Zeile

ExecStartPre=/usr/local/bin/wait-for-vpn.sh

mat6937
Beiträge: 3491
Registriert: 09.12.2014 10:44:00

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von mat6937 » 13.09.2024 16:18:41

petrolman hat geschrieben: ↑ zum Beitrag ↑
13.09.2024 15:26:07
Ich habe in der MySQL-Servicedatei ein warte-auf-VPN Skript eingefügt.
Eigentlich benutzt man (mit Requires und After) die device-unit des Interfaces, in der [Unit]-Section der betroffenen service-unit.
Z. B. bei mir:

Code: Alles auswählen

Requires=sys-subsystem-net-devices-wg0.device
After=sys-subsystem-net-devices-wg0.device

Code: Alles auswählen

:~$ systemctl status sys-subsystem-net-devices-wg0.device
● sys-subsystem-net-devices-wg0.device - /sys/subsystem/net/devices/wg0
     Loaded: loaded
     Active: active (plugged) since Fri 2024-09-13 16:06:37 CEST; 6min ago
     Device: /sys/devices/virtual/net/wg0
Wie ist auf deinem System die Ausgabe von:

Code: Alles auswählen

systemctl status sys-subsystem-net-devices-tun0.device
?
Debian 12.10 mit LXDE, OpenBSD 7.6 mit i3wm, FreeBSD 14.2 mit Xfce

Benutzeravatar
petrolman
Beiträge: 65
Registriert: 20.05.2010 14:54:22

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von petrolman » 13.09.2024 16:49:01

Die Ausgabe ist

Code: Alles auswählen

● sys-subsystem-net-devices-tun0.device - /sys/subsystem/net/devices/tun0
   Loaded: loaded
   Active: active (plugged) since Fri 2024-09-13 15:22:20 CEST; 1h 20min ago
   Device: /sys/devices/virtual/net/tun0
Ich habe noch weitere Server, wo ich das konfigurieren muss, aber erst Montag. Dann kann ich das auch einmal mit sys-subsystem-net-devices-tun0.device testen.

mat6937
Beiträge: 3491
Registriert: 09.12.2014 10:44:00

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von mat6937 » 13.09.2024 16:59:39

petrolman hat geschrieben: ↑ zum Beitrag ↑
13.09.2024 16:49:01
Ich habe noch weitere Server, wo ich das konfigurieren muss, aber erst Montag. Dann kann ich das auch einmal mit sys-subsystem-net-devices-tun0.device testen.
OK.
BTW: Du könntest in der [Service]-Section deiner service-unit, auch die Zeile:

Code: Alles auswählen

RestrictNetworkInterfaces=tun0
einfügen. Dann darf/kann der mysqld-Prozess nur die tun0-Schnittstelle (und keine andere Schnittstelle) benutzen.
Debian 12.10 mit LXDE, OpenBSD 7.6 mit i3wm, FreeBSD 14.2 mit Xfce

Benutzeravatar
heisenberg
Beiträge: 4240
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von heisenberg » 13.09.2024 17:56:40

petrolman hat geschrieben: ↑ zum Beitrag ↑
13.09.2024 15:26:07
Hallo, es funktioniert nun. Ich habe in der MySQL-Servicedatei ein warte-auf-VPN Skript eingefügt.

/usr/local/bin/wait-for-vpn.sh

Code: Alles auswählen

#!/bin/bash
while ! ip a | grep -q "tun0"; do
  sleep 2
done
Und im Service dann noch die Zeile

ExecStartPre=/usr/local/bin/wait-for-vpn.sh
Also grundsätzlich vermute ich, dass das Problem daran liegen könnte, dass das VPN noch nicht hochgefahren ist, wenn der MySQL-startet, oder präziser gesagt, dass systemd vielleicht sieht: openvpn.service ist running. Super! Dann also direkt go für mysqld! Aber faktisch braucht das openvpn nach 1-x Sekunden bis die Verbindung tatsächlich aufgebaut ist.

Eine kleine Verbesserung für das Script wäre, dass Du nicht die tun0 Schnittstelle prüfst, sondern den MySQL-Server direkt, per mysql-Client:

Code: Alles auswählen

#!/bin/bash

IP=10.10.0.123
PORT=3306
USER=nasenbaer
PASSWORD="geheim"

while :; do
    mysql --host=$IP --port=$PORT --user=$USER --password="$PASSWORD" --execute "select 1" && break
    # alternativ ohne Zugangsdaten:
    # nmap -p$PORT $IP | grep -q "/tcp open" && break
    sleep 2
done

Benutzeravatar
petrolman
Beiträge: 65
Registriert: 20.05.2010 14:54:22

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von petrolman » 16.09.2024 11:36:24

Danke, ich habe mich für die nmap Variante entschieden.

Code: Alles auswählen

#!/bin/bash
i=0
while [ $i -lt 10 ]; do
	nmap -p3306 192.168... | grep -q "/tcp open" && break
	sleep 2
	i=`expr $i + 1`
done
Nach 20 Sekunden soll aber MySQL auch bei VPN-Problemen gestartet werden, damit es für andere Prozesse zur Verfügung steht.

mat6937
Beiträge: 3491
Registriert: 09.12.2014 10:44:00

Re: Erst VPN-Verbindung, dann MySQL

Beitrag von mat6937 » 16.09.2024 12:04:20

petrolman hat geschrieben: ↑ zum Beitrag ↑
16.09.2024 11:36:24
Nach 20 Sekunden soll aber MySQL auch bei VPN-Problemen gestartet werden, damit es für andere Prozesse zur Verfügung steht.
Dann könntest Du auf die Prüfung bzgl. tun0-Interface (d. h. vorhandene/funktionierende VPN-Verbindung) verzichten und gleich eine timer-unit zum starten der (in diesem Fall deaktivierten) mysql-service-unit, benutzen.
Debian 12.10 mit LXDE, OpenBSD 7.6 mit i3wm, FreeBSD 14.2 mit Xfce

Antworten