Вопрос или проблема
У меня странная ситуация: я создал второй сервер 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 или специализированным ресурсам по устранению неполадок.