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 после внесения изменений в конфигурацию.