Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
PostgreSQL nie przyjmuje połączeń z sieci - listen_addresses
listen_addresses = 'localhost', więc serwer otwiera gniazdo tylko na pętli zwrotnej i jest niewidoczny z sieci.listen_addresses na właściwy interfejs, restartujemy serwer i dopiero wtedy dodajemy regułę w pg_hba.conf.To jedna z najczęstszych pułapek przy pierwszym wystawianiu bazy do sieci. Wszystko działa na serwerze, ale aplikacja z innej maszyny nie może się połączyć. Winny jest parametr listen_addresses, który decyduje, na których interfejsach sieciowych serwer w ogóle otwiera gniazdo nasłuchu. Dotyczy Cię to zawsze, gdy baza i aplikacja stoją na różnych maszynach albo w różnych kontenerach. Pokazujemy, jak ustawić to poprawnie i bezpiecznie.
Na serwerze wszystko działa, a z innej maszyny dostajesz odmowę połączenia:
$ psql -h 10.0.0.12 -U app -d sklep
psql: error: connection to server at "10.0.0.12", port 5432 failed: Connection refusedGdy sprawdzisz na serwerze, co faktycznie nasłuchuje, widać sedno problemu - gniazdo jest tylko na adresie pętli zwrotnej:
$ sudo ss -ltnp | grep 5432
LISTEN 0 244 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=811,fd=6))Brak wiersza z adresem interfejsu sieciowego (na przykład 10.0.0.12:5432 albo 0.0.0.0:5432) oznacza, że serwer po prostu nie słucha ruchu z zewnątrz.
listen_addresses to parametr z postgresql.conf, który mówi serwerowi, na których adresach IP ma otworzyć gniazda nasłuchu przy starcie. Domyślna wartość to 'localhost', czyli tylko 127.0.0.1 oraz ::1 - świadomy wybór twórców, aby świeżo zainstalowana baza nie była od razu dostępna z sieci. Dopóki nie zmienisz tego parametru, żaden wpis w pg_hba.conf nie pomoże, bo serwer nawet nie odbiera pakietów z sieci. Wartość '*' otwiera nasłuch na wszystkich interfejsach, a można też podać konkretne adresy po przecinku, na przykład 'localhost,10.0.0.12' - to bezpieczniejsze, bo ogranicza nasłuch do wybranej sieci.
postgresql.conf (ścieżkę pokaże SHOW config_file;) i ustaw nasłuch na właściwym adresie, na przykład listen_addresses = '10.0.0.12' albo '*' dla wszystkich interfejsów.sudo systemctl restart postgresql.sudo ss -ltnp | grep 5432 - teraz powinien pojawić się wpis z adresem interfejsu.pg_hba.conf dla podsieci klienta, na przykład host sklep app 10.0.0.0/24 scram-sha-256, i przeładuj: SELECT pg_reload_conf();.sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp.listen_addresses = '*' bez zabezpieczeń - w połączeniu z otwartą zaporą wystawia bazę szeroko. Ogranicz albo adres nasłuchu, albo dostęp na zaporze do zaufanej sieci.Sprawdź aktualną wartość parametru w działającym serwerze - powinna odpowiadać temu, co ustawiłeś:
$ sudo -u postgres psql -c "SHOW listen_addresses;"
listen_addresses
------------------
10.0.0.12Następnie z maszyny klienta zweryfikuj, że połączenie faktycznie przechodzi - jeśli serwer poprosi o hasło, nasłuch i dostęp działają:
$ psql -h 10.0.0.12 -U app -d sklep
Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL
To szkolenie może być dofinansowane z KFS lub BUR.
★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)
To szkolenie może być dofinansowane z KFS lub BUR.
★★★★★Średnia ocena naszych szkoleń w Google: 5/5
Komentarze (0)
Brak komentarzy...