Postgres не позволяет localhost, но работает с 127.0.0.1

Postgres не принимает соединение, если я говорю -h localhost, но он работает, если я говорю -h 127.0.0.1

[[email protected] opensips]# psql -U postgres -h localhost -W
Password for user postgres:
psql: FATAL:  Ident authentication failed for user "postgres"
[[email protected] opensips]# psql -U postgres -h 127.0.0.1 -W
Password for user postgres:
psql (8.4.20)
Type "help" for help.

postgres=#

Мой /var/lib/pgsql/data/pg_hba.conf

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                              trust
local   all         all                              ident
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
host    all         all         127.0.0.1/32          ident
# IPv6 local connections:
host    all         all         ::1/128               ident

Если я добавлю следующую строку, то служба Postgres failed начнет:

host    all         all        localhost             ident
host    all         all        localhost             trust

Что там не так?

Update

Мой /etc/hosts файл:

[[email protected] opensips]# cat /etc/hosts
172.17.0.2      5d9ca0effd7f
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Ответ 1

В pg_hba.conf подсчитывается первое совпадение. В документации:

Первая запись с подходящим типом соединения, адресом клиента, запрашиваемая база данных, а имя пользователя используется для аутентификации. Отсутствует "провал" или "резервное копирование": если выбрана одна запись и аутентификация не выполняется, последующие записи не учитываются. Если нет записи, доступ запрещен.

Обратите внимание на обратный порядок:

host    all         all         127.0.0.1/32          trust
host    all         all         127.0.0.1/32          ident

Но:

host    all         all        localhost             ident
host    all         all        localhost             trust

Хорошо, если вы действительно "добавляете" строки, как вы писали, не должно быть никакого эффекта. Но если вы замените строки, есть.

В первом случае вы получаете метод проверки подлинности trust, который является политикой открытых дверей. В документации:

PostgreSQL предполагает, что любой, кто может подключиться к серверу, авторизованный доступ к базе данных с любым именем пользователя базы данных они указывают (даже имена суперпользователя)

Но во втором случае вы получаете метод проверки ident, который должен быть правильно настроен для работы.

Если вы используете устаревшую версию 8.4, перейдите в старое руководство для 8.4. Вы знаете, что 8.4 достигло EOL в 2014 году и больше не поддерживается? Рассмотрите возможность обновления до текущей версии.

Подробнее:

Ответ 2

Проблема

Postgres потенциально будет использовать IPv6 при указании -h localhost, который, учитывая приведенный выше pg_hba.conf, указывает ident, возвращается запрос пароля.

Однако, когда указано -h 127.0.0.1, он заставляет Postgres использовать IPv4, который установлен в trust в приведенной выше конфигурации и разрешает доступ без пароля.


Ответ

Таким образом, ответ заключается в изменении строки хоста IPv6 в pg_hba.conf для использования trust:

# IPv6 local connections:
host    all         all         ::1/128               trust

Вспоминая перезапуск службы Postgres после внесения изменений в конфигурацию.