2015-03-18 2 views
3

Итак, я разрабатываю веб-приложение, которое подключается к серверу postgresql на другой машине. Все работает нормально.Почему мое веб-приложение использует ipv6 для подключения к локальному postgres

Тогда я развернула веб-приложение на той же машине работает сервер PostgreSQL и получил сообщение об ошибке:

FATAL: 28000: no pg_hba.conf entry for host "fe80::ccee:154f:18f5:418f%11", user "myuser", database "mydb", SSL off 

Мой pg_hba-конф уже имеет следующую строку:

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

Thats предполагается быть точным адресом для ipv6?

я могу это исправить, добавив следующую строку (чистый угадайку):

#host all    all    fe80::/16    md5 

Я подозреваю, что это работает, позволяя каждому подключиться?

Так почему же он использует ipv6 вместо ipv4?

И почему петля не работает?

+2

Какая строка подключения вы используете для подключения к дБ? – harmic

+0

Строка подключения содержит имя собственного сервера. Не локальный или IP-адрес. Но я только узнал, что этот сервер ответит и ipv6, когда я его сканю. Я думаю, это объясняет, почему он пытается ipv6, но все же не потому, что loopback не работает. – Jepzen

+0

'fe80 ::/10' является префиксом локального IPv6. Если вы разрешите это, тогда все на локальной ссылке (обычно ваша локальная сеть LAN) смогут подключиться. –

ответ

2

При подключении с использованием имени хоста одна из первых вещей, которая происходит, заключается в том, что libpq (клиентская библиотека postgresql) попытается решить имя хоста. В большинстве случаев это будет означать поиск через DNS. Вне зависимости от того, какой адрес возвращается, он будет использоваться для соединения.

Я предполагаю, что в вашем случае адрес, который решает хозяин, является адресом IPv6. Ваши эксперименты с пингом, похоже, подтверждают это предположение.

Таким образом, несмотря на то, что он находится на одной машине, он подключается через IPv6-адрес хоста. Что касается сервера, он видит подключение, поступающее с IPv6-адреса хоста. Этот адрес не является :: 1/128 (localhost), поэтому он не соответствует этой записи в pg_hba.conf.

Одним из способов решения этой проблемы было бы изменить строку подключения вашего приложения на localhost (или :: 1/128, или даже 127.0.0.1). Это приведет к выбору записей loopback в pg_hba.conf.

Если вы используете платформу, поддерживающую сокеты домена UNIX, и когда вы подключаетесь к серверу на том же хосте, вам было бы лучше удалять параметр хоста из общей строки подключения. В этом случае libpq будет использовать локальные сокеты домена UNIX для подключения к серверу, что будет более эффективным, чем локальное подключение по IP-адресу. Однако, поскольку вы используете .NET, это решение, вероятно, не применяется.

+0

Использование .Net указывает, что это выполняется в Windows, где не доступны сокеты домена Unix. –

+0

Ага, должен был проверить, что такое npgsql. Спасибо @a_horse_with_no_name, обновили ответ – harmic