为什么我的Web应用程序使用ipv6连接到本地postgres

时间:2015-03-18 10:08:31

标签: postgresql ipv6 npgsql

所以我一直在开发一个连接到另一台机器上的postgresql服务器的Web应用程序。一切正常。

然后我将Web应用程序部署到运行postgresql服务器的同一台机器上,并收到错误消息:

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

我的pg_hba-conf已经有了这一行:

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

这应该是ipv6的环回地址吗?

我可以通过添加此行(纯猜测)来修复它:

#host   all             all             fe80::/16               md5

我怀疑这是通过让所有人联系起来的吗?

所以问题是为什么它会使用ipv6而不是ipv4?

为什么环回不起作用?

1 个答案:

答案 0 :(得分:2)

使用主机名连接时,首先发生的事情之一是libpq(postgresql客户端库)将尝试解析主机名。在大多数情况下,这意味着通过DNS查找。无论何时返回的地址都将用于连接。

我猜你的情况是主机名解析的地址是IPv6地址。您使用ping进行的实验似乎支持了这一假设。

因此,尽管它位于同一台机器上,但它通过主机的IPv6地址进行连接。就服务器而言,它会看到来自主机IPv6地址的连接。此地址不是:: 1/128(localhost),因此它与pg_hba.conf中的该条目不匹配。

解决此问题的一种方法是将应用程序的连接字符串更改为localhost(或:: 1/128,甚至127.0.0.1)。这将导致选择pg_hba.conf中的环回条目。

如果您使用的是支持UNIX域套接字的平台,并且在连接到同一主机上的服务器时,最好完全从连接字符串中删除host参数。在这种情况下,libpq将使用本地UNIX域套接字连接到服务器,这比通过IP地址本地连接更有效。但是,由于您使用的是.NET,该解决方案可能不适用。