Не удаётся подключиться к серверу PostgreSQL.

Вопрос или проблема

У меня странная ситуация: я создал второй сервер Postgres, который в конечном итоге станет слейвом к моему текущему мастеру. В любом случае, для целей тестирования я в настоящее время установил Postgres и тестирую подключения с других хостов.

В моем файле postgresql.conf у меня есть простая настройка:

listen_addresses="*"# какие IP-адреса слушать;
# список адресов через запятую;
# по умолчанию 'localhost'; используйте '*' для всех
# (изменение требует перезапуска)
port = 5432

Затем в моем pg_hba.conf у меня есть:

# разрешить все подключения, только для тестирования, закомментируйте в рабочей среде
host    all             all             0.0.0.0/0               trust

Этот сервер Postgres работает в jail на FreeBSD, поэтому у него два IP-адреса:

root@postgres ~# telnet 10.1.1.19 5432                     
Trying 10.1.1.19...
telnet: connect to address 10.1.1.19: Connection refused
telnet: Unable to connect to remote host

root@postgres ~# telnet 127.0.1.19 5432                                                                                                                                                                          1
Trying 127.0.1.19...
Connected to 127.0.1.19.
Escape character is '^]'.
^CConnection closed by foreign host.

root@postgres ~# ifconfig                                                                                                           
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
    options=4219b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,WOL_MAGIC,VLAN_HWTSO>
    ether 00:25:90:27:d8:24
    inet 10.1.1.19 netmask 0xffffffff broadcast 10.1.1.19 
    media: Ethernet autoselect (1000baseT <full-duplex>)
    status: active
lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
    options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
    inet 127.0.1.19 netmask 0xffffffff 
    groups: lo 

Как видите, я могу подключиться на порт 5432, но только используя адрес обратной связи, поэтому я пробую простую команду

root@postgres ~# psql -h 127.0.1.19                   
psql: FATAL:  no pg_hba.conf entry for host "127.0.1.19", user "root", database "root", SSL off

Почему это базовое соединение блокируется, если в моем hba.conf указано ALL, и почему я не могу подключиться через локальный адрес 10.1.1.19?

netstat показывает следующий вывод:

Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
tcp4       0      0 127.0.1.19.postgresql  *.*                    LISTEN

ПРИМЕЧАНИЕ: У меня есть другая jail на другом сервере с, по-видимому, такой же настройкой, которая работает, она версии 9.3.5, а этот новый сервер (с проблемой) на 9.6.3

ИЗМЕНЕНИЕ: При изменении конфигурации для прослушивания на 0.0.0.0 я получаю вывод netstat:

Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
tcp4       0      0 127.0.1.19.postgresql  *.*                    LISTEN
tcp4       0      0 10.1.1.19.3100         *.*                    LISTEN

Вы можете видеть, что SSH успешно слушает на адресе LAN 10.1.1.19 (на порту 3100), так что это не проблема сетевой настройки jail, это должно быть связано с Postgres.

В руководстве PostgreSQL говорится о listen_addresses следующее:

listen_addresses (строка)

Указывает TCP/IP адрес(а), на которых сервер будет слушать подключения от клиентских приложений. Значение принимает форму
списка имен хостов и/или числовых IP-адресов, разделенных запятыми. Специальный элемент * соответствует всем доступным IP-интерфейсам. Элемент
0.0.0.0 позволяет слушать все IPv4 адреса, а :: позволяет слушать все IPv6 адреса. Если список пуст, сервер
не слушает ни на одном IP-интерфейсе вообще, в этом случае могут быть использованы только сокеты Unix-домена для подключения к нему. Значение по умолчанию – localhost, что позволяет устанавливать только локальные TCP/IP “обратные” подключения. Хотя аутентификация клиентов (Глава 20) позволяет детально контролировать, кто может получить доступ к серверу, listen_addresses управляет тем, какие интерфейсы принимают попытки подключений, что может помочь предотвратить
повторяющиеся злонамеренные запросы на подключения к небезопасным сетевым интерфейсам. Этот параметр может быть установлен только при запуске сервера.

Возможно, есть какая-то ошибка с * в качестве параметры прослушивания. Попробуйте установить его на 0.0.0.0, это заставит Postgres слушать на всех IP-адресах и может решить вашу проблему.

После того как я заметил все эти случайные проблемы без видимых причин, я предположил, что не один конфигурационный файл был неверен. Я удалил Postgres, очистил папки /var/db/postgres и /usr/etc/postgres, а затем переустановил его.

Теперь всё работает как ожидалось, поэтому я предполагаю, что изначальная установка прошла без уведомления об ошибке.

Ответ или решение

Проблема с подключением к серверу PostgreSQL может быть вызвана несколькими причинами, и в вашем случае есть несколько моментов, которые стоит проверить и исправить. Ниже приведены рекомендации по устранению неполадок и настройке подключения.

1. Настройка listen_addresses

Вы указали в вашем postgresql.conf настройку listen_addresses="*", что позволяет серверу прослушивать все доступные IP-адреса. Однако при тестировании вы упомянули, что сервер, по-видимому, не отвечает на запросы на IP 10.1.1.19. Попробуйте изменить эту строку на listen_addresses='0.0.0.0' и перезапустите сервер PostgreSQL. Это должно заставить сервер прослушивать все IP-адреса.

2. Конфигурация pg_hba.conf

Вы указали в вашем pg_hba.conf следующее:

host    all             all             0.0.0.0/0               trust

Эта запись позволяет всем пользователям подключаться к каждому из баз данных с любого IP-адреса, что подходит для тестирования, но не для продуктивной среды.

Также стоит удостовериться, что вы не забыли перезагрузить или перезапустить сервер PostgreSQL после внесения изменений в конфигурационные файлы.

3. Проверка сетевого соединения

Вы проверили возможность подключения к серверу по локальному адресу (127.0.1.19) и обнаружили, что он доступен. Однако при попытке подключения через 10.1.1.19, вы получили сообщение "Connection refused". Используйте команду netstat для просмотра, на каких адресах PostgreSQL слушает:

netstat -an | grep 5432

Убедитесь, что сервер действительно слушает на IP-адресе 10.1.1.19.

4. Перезапуск сервера PostgreSQL

После изменения конфигурации в файлах postgresql.conf и pg_hba.conf, выполните перезапуск сервера для применения изменений:

sudo service postgresql restart

или

pg_ctl restart

5. Логи PostgreSQL

Если подключение по-прежнему не удается, проверьте журналы PostgreSQL, чтобы увидеть, есть ли какие-либо ошибки или предупреждения:

tail -f /var/log/postgresql/postgresql-*.log

6. Убедитесь, что не установлены ограничения на уровне сети

Если вы находитесь в защищенной среде, такой как брандмауэр или сетевые настройки хоста (например, правила jail), убедитесь, что подключения к порту 5432 не блокируются.

7. Перезапуск и переустановка

Если ни один из вышеуказанных шагов не решил вашу проблему, попробуйте удалить PostgreSQL, очистить все конфигурационные файлы и данные, и снова установить базу данных. Иногда конфигурация может сохранять нестандартные настройки, которые могут привести к ошибкам.

pkg delete postgresql-server
rm -rf /var/db/postgres
rm -rf /usr/etc/postgres
pkg install postgresql-server

Заключение

После выполнения всех этих шагов ваша база данных должна правильно принимать подключения по IP-адресу 10.1.1.19. Если проблемы сохраняются, рекомендую обратиться к документации PostgreSQL или специализированным ресурсам по устранению неполадок.

Оцените материал
Добавить комментарий

Капча загружается...