Тайм-аут удаленного подключения к Postgres

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

Я много читал учебников, чтобы понять свою проблему, но безуспешно.

У меня есть виртуальная машина 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 (интерфейс обратной связи).

Позвольте мне рассказать вам весь процесс, пожалуйста, проверьте шаг за шагом:

  1. Добавьте следующую строку в '/etc/postgres/10/main/postgres.conf':

    listen_addresses="*"
    
  2. Добавьте следующие строки в '/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
    
  3. Выполните следующую команду:

    sudo ufw allow 5432/tcp
    

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

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

Шаги для настройки удаленного подключения к PostgreSQL:

  1. Настройка postgres.conf:
    Убедитесь, что параметр listen_addresses в файле конфигурации postgresql.conf установлен на '*'. Это позволит PostgreSQL принимать подключения от всех клиентов.

    Пример строки:

    listen_addresses = '*'
  2. Настройка pg_hba.conf:
    В файле pg_hba.conf добавьте следующую строку для разрешения подключений:

    host    all             all             0.0.0.0/0               md5

    Это позволит любому клиенту подключаться к вашей базе данных с использованием пароля (метод аутентификации md5). Если вы хотите, чтобы соединения были совершенно открытыми для тестирования, можете использовать trust, но это не рекомендуется для продакшн-систем.

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

    sudo systemctl restart postgresql
  4. Настройка брандмауэра:
    Убедитесь, что порт 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
  5. Проверка подключения:
    Убедитесь, что вы можете подключиться к PostgreSQL из удаленной машины. Для этого выполните команду:

    psql -U philhouse -d pwap -h <IP-адрес_вашего_Сервера>

    Замените <IP-адрес_вашего_Сервера> на фактический IP вашего сервера.

  6. Проверка сетевых соединений:
    Проверьте, доступен ли ваш сервер на порту 5432. Используйте команды telnet или nc:

    telnet <IP-адрес_вашего_Сервера> 5432

    или

    nc -zv <IP-адрес_вашего_Сервера> 5432

    Если соединение не устанавливается, возможно, сетевые настройки на вашем сервере или на промежуточных маршрутизаторах блокируют доступ.

Заключение

Если после выполнения всех вышеуказанных шагов проблема все еще не решена, проверьте журналы PostgreSQL на наличие ошибок. Они обычно находятся в /var/log/postgresql/. Эти журналы могут предоставить больше информации о том, почему соединение было отклонено.

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

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

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