This commit is contained in:
Mathias Schneider
2026-09-28 17:37:46 +02:00
parent 95797e4a3b
commit 50406e22d1
5 changed files with 487 additions and 3 deletions
+56 -1
View File
@@ -98,4 +98,59 @@ ssh benutzername@192.168.178.42
---
👉 Soll ich dir ein **kurzes Beispiel-Setup mit zwei Testbenutzern** schreiben, das du direkt im Heimnetz nachmachen kannst?
👉 Soll ich dir ein **kurzes Beispiel-Setup mit zwei Testbenutzern** schreiben, das du direkt im Heimnetz nachmachen kannst?
---
## 5. SSH-Tunnel für lokale Datenbankzugriffe
Mit einem lokalen SSH-Tunnel (`-L`) wird ein Port auf dem eigenen Rechner an
einen Zielhost und Zielport weitergeleitet, die aus Sicht des SSH-Servers
erreichbar sind:
```bash
ssh -L <lokaler-port>:<zielhost>:<zielport> <benutzer>@<ssh-server>
```
Beispiel für PostgreSQL:
```bash
ssh -L 15432:127.0.0.1:5432 benutzername@vm.example.org
```
Danach kann ein lokaler Client über `127.0.0.1:15432` auf PostgreSQL zugreifen.
Die Verbindung verläuft dabei so:
```text
Datenbank-Client auf dem eigenen Rechner
|
| 127.0.0.1:15432
v
SSH-Tunnel zur VM
|
| 127.0.0.1:5432 aus Sicht der VM
v
PostgreSQL auf der VM
```
`<zielhost>` wird aus Sicht der VM aufgelöst. Wenn PostgreSQL in einem
Docker-Container läuft, kann das je nach Setup beispielsweise `127.0.0.1`,
ein Docker-Service-Name oder eine Container-IP sein. Eine Container-IP wie
`172.19.0.2` sollte nicht dauerhaft vorausgesetzt werden, weil sie sich nach
dem Neuerstellen des Containers ändern kann. Siehe auch
[[DBeaver PostgreSQL via SSH-Tunnel]] und [[Docker]].
### Adressen nicht verwechseln
`hostname -I` gibt alle Adressen des Rechners aus. Darunter können sich auch
Docker-Bridge-Adressen befinden. Die Ausgabe zeigt nicht, welche Adresse für
einen bestimmten Dienst die richtige ist:
```text
10.2.0.4 Adresse der VM im Azure-Netzwerk
172.19.0.1 Docker-Bridge-Gateway
172.19.0.2 möglicherweise eine Container-IP
```
Die tatsächlich passende Adresse und der passende Port sollten mit `ss`,
`docker inspect`, `nc` oder `psql` geprüft werden.
+58 -1
View File
@@ -27,4 +27,61 @@ docker exec -i <container_name> psql -U <username> -d <dbname> -c "SELECT <field
docker exec -i <container_name> psql -U <username> -d <dbname> -A -F, --csv -c "SELECT <fields> FROM <table>;" > path/tp/file.csv
```
Erklärung:
>The `-A` flag (unaligned output), `-F,` (field separator comma), and `--csv` together produce CSV
>The `-A` flag (unaligned output), `-F,` (field separator comma), and `--csv` together produce CSV
## Verbindung zu einem bestimmten Host und Port
Für eine Verbindung zu einem PostgreSQL-Server auf einem bestimmten Host und
Port werden `-h` und `-p` verwendet:
```bash
psql -h <host> -p <port> -U <username> -d <dbname>
```
Beispiel:
```bash
psql -h 127.0.0.1 -p 15432 -U <username> -d <dbname>
```
Das ist beispielsweise der lokale Endpunkt eines SSH-Tunnels. Bei einem
Docker-Setup kann der Host dagegen eine Container-IP, ein Docker-Service-Name
oder die Loopback-Adresse der VM sein. Entscheidend ist, von wo aus die
Verbindung hergestellt wird.
## PostgreSQL-Verbindung diagnostizieren
Eine schrittweise Prüfung hilft dabei, Netzwerk-, Tunnel- und
Authentifizierungsprobleme voneinander zu unterscheiden:
```bash
# Ist der TCP-Port erreichbar?
nc -vz <host> <port>
# Lauscht auf der VM ein Prozess auf dem PostgreSQL-Port?
sudo ss -ltnp | grep 5432
# Funktioniert die PostgreSQL-Verbindung mit denselben Parametern?
psql -h <host> -p 5432 -U <username> -d <dbname>
```
Wenn `psql` direkt auf der VM funktioniert, ist damit nur bewiesen, dass die
VM diesen Endpunkt erreichen kann. Es ist noch nicht bewiesen, dass ein
externer Client denselben Weg über den SSH-Tunnel verwendet. Zu prüfen sind
deshalb zusätzlich der lokale Tunnel-Port, der entfernte Zielhost, der
entfernte Zielport und die SSL-Einstellung des Clients.
Für eine Docker-Datenbank sind außerdem hilfreich:
```bash
docker ps
docker inspect <postgres-container>
docker logs --tail 100 <postgres-container>
```
Eine Container-IP kann sich ändern, wenn der Container neu erstellt wird. Für
dauerhafte Konfigurationen sind veröffentlichte Host-Ports oder Docker-
Service-Namen meist besser geeignet als eine fest eingetragene Container-IP.
Siehe auch [[SSH Verbindung in Linux]], [[Docker]] und
[[DBeaver PostgreSQL via SSH-Tunnel]].