Come appare il messaggio
psql: error: connection to server at "db.example.com" (203.0.113.20), port 5432 failed: FATAL: no pg_hba.conf entry for host "198.51.100.7", user "appuser", database "appdb", SSL encryptionCause frequenti
- Non esiste una riga
hostper l'indirizzo del client, oppure l'intervallo di indirizzi è troppo stretto o scritto male. - Utente o database non corrispondono alla riga, ad esempio la riga vale per
allutenti ma per un altro database. - Il client usa SSL ma la riga è
hostnossl, o viceversa conhostssl. - Il file è stato modificato ma PostgreSQL non è stato ricaricato.
- Il client arriva da un indirizzo diverso da quello atteso, ad esempio una rete Docker, un NAT o un proxy.
Verifica
- Quali regole usa davvero il server, in ordine? Mostra anche gli errori nel file
sudo -u postgres psql -c 'SELECT line_number, type, database, user_name, address, auth_method, error FROM pg_hba_file_rules' - Su quali indirizzi è in ascolto il server?
sudo -u postgres psql -c 'SHOW listen_addresses' - La porta è aperta sul server?
sudo ss -tlnp | grep 5432 - L'indirizzo visto dal server: è nel testo dell'errore. Anche nel log
sudo tail -n 20 /var/log/postgresql/postgresql-*-main.log
Soluzione
- Prendi indirizzo, utente, database e modalità SSL dal testo dell'errore. È esattamente ciò che ha visto il server.
- Aggiungi una riga stretta a
pg_hba.conf, ad esempiohostssl appdb appuser 198.51.100.7/32 scram-sha-256. Usa l'indirizzo reale del client o un piccolo intervallo. - Ricarica:
sudo systemctl reload postgresql, poi controlla di nuovo l'elenco delle regole. - Non usare
0.0.0.0/0contrust. Lascia entrare chiunque in rete senza password. - Se il server non è raggiungibile affatto (connection refused), il passo successivo sono
listen_addresseso il firewall.
Domande frequenti
Devo riavviare PostgreSQL?
No. Per pg_hba.conf basta un reload: systemctl reload postgresql oppure SELECT pg_reload_conf();.
L'indirizzo del client nell'errore non è il mio.
Allora un proxy, un NAT o il bridge Docker cambia l'indirizzo di origine. Scrivi la regola per l'indirizzo che il server riporta, oppure correggi il percorso di rete.