Назад | Перейти на главную страницу

Удаленные подключения PostgreSQL не работают с правильным адресом прослушивания и строкой pg_hba

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

Мой сервер - Debian 10 с установленным PostgreSQL 11 из репозиториев и добавленными расширениями TimescaleDB. В остальном ничего особенного.

/etc/postgresql/11/main/postgresql.conf содержит строку listen_addresses='*', и /etc/postgresql/11/main/pg_hba.conf содержит

local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5
host    all             all             0.0.0.0/0               md5

Я оставил все широко открытым, чтобы иметь возможность подключиться, и могу проверить, работает ли локальный вход, используя psql -U postgres -h localhost но когда я пробую то же самое удаленно, я получаю

psql: could not connect to server: No route to host
    Is the server running on host "db.example.com" (10.0.0.150) and accepting
    TCP/IP connections on port 5432?

Сервер слушает то, что я вижу, используя ss

$ ss -anp | grep 5432
u_str LISTEN 0      128           /var/run/postgresql/.s.PGSQL.5432 158425                                                * 0                                                                                                                   
tcp   LISTEN 0      128                                     0.0.0.0:5432                                            0.0.0.0:*                                                                                                                   
tcp   LISTEN 0      128                                        [::]:5432                                               [::]:*

и я временно отключил брандмауэр для устранения неполадок. Другие службы (SSH) работают должным образом, поэтому я действительно не уверен, почему это не так. Единственное, в чем я не уверен, это то, что этот хост использует IP, который ранее был назначен тому, которого больше не существует, но DNS сообщает один и тот же IP-адрес для двух разных имен. Я бы подумал, что использование IP-адреса напрямую с psql проигнорирует это, но я получаю ту же ошибку.

Наконец я побежал tcpdump на сервере и видит запрос на подключение

$ sudo tcpdump -i ens192 -vvvnxXS port 5432
tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
09:27:46.118205 IP (tos 0x0, ttl 64, id 18195, offset 0, flags [DF], proto TCP (6), length 60)
    10.0.2.3.59478 > 10.0.0.150.5432: Flags [S], cksum 0xea81 (correct), seq 826121699, win 64240, options [mss 1460,sackOK,TS val 2129657941 ecr 0,nop,wscale 7], length 0
    0x0000:  4500 003c 4713 4000 4006 dd10 0a00 0203  E..<G.@.@.......
    0x0010:  0a00 0096 e856 1538 313d 9de3 0000 0000  .....V.81=......
    0x0020:  a002 faf0 ea81 0000 0204 05b4 0402 080a  ................
    0x0030:  7ef0 0055 0000 0000 0103 0307            ~..U........

но клиентская сторона ничего не видит.

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

Эта проблема действительно была связана с маршрутизацией и была вызвана повторным использованием резервирования DNS. Когда мой ИТ-отдел изменил IP-адрес сервера, он начал работать.