Вопрос или проблема
Я много читал учебников, чтобы понять свою проблему, но безуспешно.
У меня есть виртуальная машина Redhat, на которой я установил Postgres, и я пытаюсь сделать его доступным для удаленных подключений. Когда я на машине, если я выполняю следующую команду, я могу подключиться к нужной таблице.
psql -U philhouse -d pwap
Однако, когда я пробую выполнить это:
psql -U philhouse -d pwap -h servername.nu.edu
Я всегда получаю тайм-аут.
Я прочитал множество учебников и руководств, но все равно не могу разобраться. Я отредактировал файл pg_hba.conf, файл postgres.conf, а также пытался работать с iptables. Вот выводы, чтобы вы могли увидеть:
pg_hba.conf Я изменил, чтобы разрешить все подключения в целях тестирования
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# "local" предназначен только для подключений через сокеты Unix
local all all trust
# Локальные подключения IPv4:
host all all 0.0.0.0/0 trust
# Локальные подключения IPv6:
host all all ::1/128 trust
postgres.conf – здесь я изменил listen_addresses на * только для тестирования
#------------------------------------------------------------------------------
# СОЕДИНЕНИЯ И АУТЕНТИФИКАЦИЯ
#------------------------------------------------------------------------------
# - Настройки подключения -
#listen_addresses="*" # какой IP-адрес(а) слушать;
# список адресов, разделенных запятыми;
# по умолчанию 'localhost', '*' = все
# (изменение требует перезапуска)
#port = 5432 # (изменение требует перезапуска)
max_connections = 100 # (изменение требует перезапуска)
# Примечание: Увеличение max_connections требует ~400 байт общей памяти на
# слот подключения, плюс пространство блокировки (см. max_locks_per_transaction).
#superuser_reserved_connections = 3 # (изменение требует перезапуска)
#unix_socket_directory = '' # (изменение требует перезапуска)
#unix_socket_group = '' # (изменение требует перезапуска)
#unix_socket_permissions = 0777 # начните с 0, чтобы использовать восьмеричную нотацию
# (изменение требует перезапуска)
#bonjour_name="" # по умолчанию имя компьютера
# (изменение требует перезапуска)
# - Безопасность и аутентификация -
#authentication_timeout = 1min # 1с-600с
#ssl = off # (изменение требует перезапуска)
#ssl_ciphers="ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH" # допустимые SSL шифры
# (изменение требует перезапуска)
#ssl_renegotiation_limit = 512MB # количество данных между переобсуждениями
#password_encryption = on
#db_user_namespace = off
** iptables ** Я только что попытался сделать это… не уверен, что делать здесь.
# Конфигурация брандмауэра, написанная system-config-securitylevel
# Ручная настройка этого файла не рекомендуется.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:NETBKP - [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -p tcp -m multiport --dports 13720,13721,13782,13724,13783,13722,13723 -j NETBKP
-A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#-A INPUT -s 129.105.214.0/255.255.255.0 -p tcp -m tcp --dport 22 -j ACCEPT
#-A INPUT -s 129.105.106.0/255.255.255.128 -p tcp -m tcp --dport 22 -j ACCEPT
#-A INPUT -s 165.124.200.32/255.255.255.240 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 129.105.106.0/255.255.255.128 -p udp -m udp --dport 161 -j ACCEPT
#
#FP 121688
-A INPUT -s 129.105.0.0/255.255.0.0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 165.124.0.0/255.255.0.0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 5432 -j ACCEPT
#
#
#-A INPUT -s 129.105.119.86 -j ACCEPT
-A INPUT -j RH-Firewall-1-INPUT
-A NETBKP -s 129.105.106.0/255.255.255.128 -j ACCEPT
-A NETBKP -s 129.105.208.18 -j ACCEPT
-A NETBKP -s 129.105.208.20 -j ACCEPT
-A NETBKP -s 129.105.208.82 -j ACCEPT
-A NETBKP -s 129.105.208.115 -j ACCEPT
-A NETBKP -s 129.105.208.116 -j ACCEPT
-A NETBKP -s 129.105.215.131 -j ACCEPT
-A NETBKP -s 165.124.61.0/255.255.255.128 -j ACCEPT
-A NETBKP -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
Есть ли у вас какие-либо мысли или вещи, которых мне не хватает? Я работал над этим в течение 3 дней и не добился никакого прогресса…
Спасибо за помощь!!
Настройте свой listen_address правильно (то есть уберите символ комментария перед listen_address, который уже есть). По умолчанию Postgres слушает только локальный сокет и localhost (интерфейс обратной связи).
Позвольте мне рассказать вам весь процесс, пожалуйста, проверьте шаг за шагом:
-
Добавьте следующую строку в
'/etc/postgres/10/main/postgres.conf'
:listen_addresses="*"
-
Добавьте следующие строки в
'/etc/postgres/10/main/pg_hba.conf'
:host all all 0.0.0.0/0 md5 host replication all 0.0.0.0/0 md5
-
Выполните следующую команду:
sudo ufw allow 5432/tcp
Ответ или решение
Чтобы решить проблему с удаленным подключением к PostgreSQL, необходимо пройти через несколько важных шагов. Описанный вами процесс выглядит почти завершенным, но давайте рассмотрим его по пунктам и добавим необходимые рекомендации для устранения проблемы с тайм-аутом.
Шаги для настройки удаленного подключения к PostgreSQL:
-
Настройка
postgres.conf
:
Убедитесь, что параметрlisten_addresses
в файле конфигурацииpostgresql.conf
установлен на'*'
. Это позволит PostgreSQL принимать подключения от всех клиентов.Пример строки:
listen_addresses = '*'
-
Настройка
pg_hba.conf
:
В файлеpg_hba.conf
добавьте следующую строку для разрешения подключений:host all all 0.0.0.0/0 md5
Это позволит любому клиенту подключаться к вашей базе данных с использованием пароля (метод аутентификации
md5
). Если вы хотите, чтобы соединения были совершенно открытыми для тестирования, можете использоватьtrust
, но это не рекомендуется для продакшн-систем. -
Перезагрузка PostgreSQL:
После внесения изменений в конфигурационные файлы, перезагрузите службу PostgreSQL, чтобы изменения вступили в силу. Выполните команду:sudo systemctl restart postgresql
-
Настройка брандмауэра:
Убедитесь, что порт PostgreSQL (по умолчанию 5432) открыт в вашем брандмауэре. Если вы используетеiptables
, добавьте следующее правило:iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
Если вы используете
firewalld
, выполните команду для открытия порта:sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent sudo firewall-cmd --reload
-
Проверка подключения:
Убедитесь, что вы можете подключиться к PostgreSQL из удаленной машины. Для этого выполните команду:psql -U philhouse -d pwap -h <IP-адрес_вашего_Сервера>
Замените
<IP-адрес_вашего_Сервера>
на фактический IP вашего сервера. -
Проверка сетевых соединений:
Проверьте, доступен ли ваш сервер на порту 5432. Используйте командыtelnet
илиnc
:telnet <IP-адрес_вашего_Сервера> 5432
или
nc -zv <IP-адрес_вашего_Сервера> 5432
Если соединение не устанавливается, возможно, сетевые настройки на вашем сервере или на промежуточных маршрутизаторах блокируют доступ.
Заключение
Если после выполнения всех вышеуказанных шагов проблема все еще не решена, проверьте журналы PostgreSQL на наличие ошибок. Они обычно находятся в /var/log/postgresql/
. Эти журналы могут предоставить больше информации о том, почему соединение было отклонено.
Если ни одно из вышеуказанных решений не помогло, рассмотрите возможность наличия других сетевых устройств, таких как маршрутизаторы или VPN, которые могут блокировать соединения.