PostgreSQL: connection refused
psql: error: connection to server at "db.example.com" (10.0.0.12), port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
Dieser Fehler kommt nicht von PostgreSQL — es hat die Verbindung nie gesehen. "Connection refused" ist das Betriebssystem auf dem Zielhost, das sagt, dass an dieser Adresse und diesem Port nichts lauscht (oder eine Firewall das Paket aktiv abgewiesen hat). Diese Unterscheidung engt die Suche sofort ein.
Was dieser Fehler bedeutet
Drei Fehlermodi zum Verbindungszeitpunkt sehen ähnlich aus, bedeuten aber Unterschiedliches:
| Symptom | Bedeutung |
|---|---|
Connection refused | TCP erreichte den Host, nichts lauscht an diesem Port (oder Firewall REJECT). PostgreSQL nicht beteiligt. |
| Verbindungs-Timeout | Pakete stillschweigend verworfen — typischerweise eine Firewall oder Security Group, oder falscher Host. |
no pg_hba.conf entry for host ... | Sie haben PostgreSQL erreicht; nun ist es ein Authentifizierungs-Konfigurationsproblem, eine andere Seite des Handbuchs. |
"Connection refused" bedeutet also: falscher Ort, falscher Port oder dort läuft kein Server.
Häufige Ursachen
- PostgreSQL läuft nicht — abgestürzt, nach einer Konfigurationsänderung nicht gestartet, oder der Host wurde neu gestartet und der Dienst ist nicht aktiviert.
- Es lauscht nur auf localhost. Der Standard
listen_addresses = 'localhost'akzeptiert überhaupt keine entfernten TCP-Verbindungen. - Falscher Port. Der Server kann auf einem Nicht-Standard-Port laufen — unter Debian/Ubuntu bekommt ein zweiter Cluster auf demselben Host typischerweise 5433.
- Docker-Netzwerk: der Container-Port ist nicht veröffentlicht (
-p 5432:5432), oder Sie verwendenlocalhostaus einem anderen Container heraus statt des Dienstnamens. - Eine Firewall, die so konfiguriert ist, dass sie ablehnt (statt zu verwerfen) an diesem Port.
So diagnostizieren Sie ihn
Vom Client aus:
pg_isready -h db.example.com -p 5432
Auf dem Server-Host:
# Läuft der Dienst?
systemctl status postgresql
# Lauscht etwas, und auf welcher Adresse/welchem Port?
ss -lntp | grep -E '5432|postgres'
Wenn der Dienst aus ist, steht der Grund für den fehlgeschlagenen Start in den Logs (journalctl -u postgresql oder das PostgreSQL-Log-Verzeichnis) — ein Tippfehler in postgresql.conf nach einer Bearbeitung ist ein Klassiker. Wenn er läuft, aber nur an 127.0.0.1 gebunden ist, ist es listen_addresses.
So beheben Sie ihn
- Dienst aus → lesen Sie den Startfehler im Log, beheben Sie ihn,
systemctl start postgresql(undenableihn). - Fernzugriff benötigt → setzen Sie
listen_addressesinpostgresql.conf(erfordert einen Neustart), fügen Sie eine passendepg_hba.conf-Regel hinzu und öffnen Sie die Firewall — nur für die konkreten Client-Netze. 5432 im Internet freizulegen lädt ständigen Angriffsverkehr ein; beschränken Sie per CIDR und verlangen Sie starke Authentifizierung (scram-sha-256) und TLS. - Falscher Port → prüfen Sie
portinpostgresql.conf(oder die Cluster-Auflistung auf Debian-artigen Systemen) und korrigieren Sie den Connection-String. - Docker → veröffentlichen Sie den Port, oder verbinden Sie sich aus einem anderen Container auf den Compose-Dienstnamen, nicht auf
localhost.
