所以我一直在开发一个连接到另一台机器上的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?
为什么环回不起作用?
答案 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,该解决方案可能不适用。