Error de PostgreSQL: no pg_hba.conf entry for host
FATAL: no pg_hba.conf entry for host "10.0.0.23", user "app_user", database "appdb", SSL encryption
Primero la buena noticia: la ruta de red funciona y llegaste a PostgreSQL. Te rechazó porque ninguna línea de pg_hba.conf coincide con la combinación del mensaje: dirección del cliente, base de datos, usuario, y si la conexión usa SSL. El error te entrega las cuatro — la solución es escribir una regla que coincida con ellas.
Qué significa este error
pg_hba.conf se evalúa de arriba a abajo, gana la primera coincidencia — y una conexión que no coincide con ninguna línea obtiene este error. Cada línea coincide según el tipo de conexión (local, host, hostssl, hostnossl), base de datos, usuario y dirección del cliente, y luego nombra el método de autenticación a aplicar.
La cola del mensaje ("SSL encryption" / "no encryption") importa más de lo que parece: una línea hostssl nunca puede coincidir con un intento sin SSL, y viceversa. Si el mensaje dice "no encryption" y todas tus reglas dicen hostssl, la solución está en el cliente (sslmode=require), no en el archivo.
Causas comunes
- Dirección del cliente fuera de todos los CIDR del archivo — típico cuando una app cambia de subred, o cuando aparece el primer cliente remoto contra una configuración por defecto de solo localhost.
- Desajuste de SSL entre el intento del cliente y las reglas
hostssl/hostnossl. - Reglas acotadas a otras bases de datos o usuarios distintos de los que estás usando para conectar.
- El archivo fue editado pero nunca recargado — los cambios de pg_hba surten efecto solo al recargar.
Cómo diagnosticarlo
Toma los cuatro valores del mensaje de error y recorre las reglas con ellos:
-- La vista muestra las reglas tal como el servidor las leyó,
-- con posibles errores de parseo por línea:
SELECT line_number, type, database, user_name, address, auth_method, error
FROM pg_hba_file_rules;
Comprueba, en orden: ¿hay una línea cuyo tipo de conexión coincida (¡SSL!)? ¿cuya lista de bases de datos incluya la tuya? ¿cuya lista de usuarios incluya el tuyo? ¿cuya dirección contenga la IP del cliente del mensaje?
Cómo solucionarlo
Añade una regla tan estrecha como la necesidad real, y luego recarga:
# /etc/postgresql/.../pg_hba.conf — ejemplo: app desde la subred privada, SSL, SCRAM
hostssl appdb app_user 10.0.0.0/24 scram-sha-256
SELECT pg_reload_conf(); -- o bien: systemctl reload postgresql
- Resiste el
host all all 0.0.0.0/0— acota por base de datos, usuario y CIDR. Y nuncatrusten conexiones de red. - Si el desajuste es SSL, configura
sslmode=require(o más fuerte) en la cadena de conexión del cliente en vez de debilitar las reglas del servidor.
