连接到<主机名>:5432被拒绝。

4
我不是通信网络专家,所以我不知道我的“主机名”应该是什么,也不知道在哪里可以找到它?
我在Ubuntu 14.04上创建了一个PostgreSQL服务器,通过将主机名设置为127.0.0.1(本地主机)或甚至是192.168.1.42(我的私有IP),可以从同一台计算机连接到它而没有任何问题。但是我无法从任何其他计算机连接到我的服务器,即使它们位于本地网络上或不在本地网络上。我始终收到此消息:
"Connection to <hostname>:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections."

无论是127.0.1.1、127.0.0.1、192.168.1.42、98.765.432.123(公共IP)还是其他任何值,它都无法工作。正确的主机名是什么?

我已经将listen_addresses设置为“*”,已经编辑了pg_hba.conf以接受0.0.0.0/0 IP地址,并禁用了Ubuntu防火墙。


你能发布一下JDBC连接字符串吗? - Giovanni
1
很有可能你的防火墙设置了禁止外部连接。 - Bruno
Giovanni,是的,“jdbc:postgresql://<hostname>/<dbname>”(尖括号内为字符串变量,我使用JTextField将它们输入到我的程序中) - Vekszor
2
当你执行 telnet hostname 5432 命令时会发生什么?如果这个命令不能正常工作,那么问题很可能是网络问题,而不是 Postgres 或 JDBC 的问题。 - Andomar
1
Andomar,是从哪台计算机进行操作的?是我的电脑(Ubuntu)还是本地/非本地网络中的其他计算机(Windows)?主机名是什么?我的公共IP地址吗?(我不是专业人士)。从我的计算机,telnet可以使用127.0.0.1和192.168.1.42,但不能使用公共IP地址98.765.432.123(?) - Vekszor
3个回答

6
这可能是由很多原因引起的。
  1. 服务器有一个IP地址。JDBC连接字符串应该使用该地址作为<hostname>,除非您有一些本地DNS解决方案。为了排除后者的问题,使用Ubuntu服务器的IP地址。在Ubuntu上输入ifconfig以查看它;它可能是像您提到的那样的192.168.1.42所以从具有Java应用程序的客户端,您使用服务器的IP地址。
  2. 如果您有一个标准的PostgreSQL安装,它应该使用端口5432,在postgresql.conf中可以检查设置。在JDBC连接字符串中,您还应该指示端口:"jdbc:postgresql://192.168.1.42:5432/...",以确保安全。
  3. 您需要有一个可以连接的数据库。请注意,默认情况下,只有数据库所有者(在您的情况下可能是用户postgres)才能连接到它。请见下文。
  4. pg_hba.conf中,您需要为新数据库创建一个条目,以便可以连接到它(典型的设置,请检查您的网络设置)。您在此处指定的IP地址(范围)是连接到数据库的客户端的IP地址(范围)!

    host my_db all 192.168.0.0/16 md5

修改pg_hba.conf后,必须重新启动PostgreSQL服务器。(通常在Ubuntu上,执行sudo ./etc/init.d/postgresql restart

要创建数据库my_db(或任何您喜欢的名称),请转到Ubuntu框并以postgres用户身份输入psql

vekszor@ubuntu:~$ sudo -u postgres psql
[sudo] password for user:
psql (9.3.5)
Type "help" for help

postgres=# 

为了连接数据库,您需要拥有一个数据库:
postgres=# CREATE DATABASE my_db;
CREATE DATABASE

您还希望有一个比postgres超级用户权限更低但仍能操作数据库的用户(角色)。因此,请创建此用户角色并分配数据库所有权:

postgres=# CREATE ROLE vekszor LOGIN PASSWORD 'secret123' CREATEROLE;
CREATE ROLE
postgres=# ALTER DATABASE my_db OWNER TO vekszor;
ALTER

现在,您可以使用Java应用程序返回客户端计算机,并完成JDBC连接字符串中的数据库名称、用户名和密码。

请注意,如果您想从互联网访问数据库,则应在路由器中设置NAT规则,将端口5432上的流量指向Ubuntu服务器的IP地址。只要路由器的内部地址与您在pg_hba.conf中指定的客户端计算机地址范围相同,这应该很容易设置;否则,请在pg_hba.conf中添加一个新条目。


非常感谢,这是一个非常好的和结构良好的答案。我想了解更多关于设置NAT规则“将端口5432上的流量指向您的Ubuntu服务器的IP”的信息。我有汤姆森网关,将协议设置为“任何”,触发范围设置为“5432-5432”,并将翻译留空,触发协议为空,触发端口为空是否足够? - Vekszor
我按照你的指南一步一步地跟着做,现在它在本地网络中完美运行。你可能还想在你的答案中添加,为了使一切工作正常,ubuntu防火墙必须使用“sudo ufw disable”禁用。(更复杂的方法是编辑iptables) - Vekszor
@Vekszor 很高兴能帮忙。关于 Thompson 网关的问题,我没有使用过那个,但是网上有很多针对每个路由器和网关的具体细节的网站。 - Patrick

1

阅读您对正确答案的评论:
这是如何向iptables添加规则的方法:

iptables -A INPUT -s 0/0 -p tcp --dport 5432 -j ACCEPT

如果您希望任何人都可以访问它,您可以将其更改为特定的IP地址或IP地址范围。

依然无法相信。 - funky-nd

0

如果您正在使用UI连接到服务器,可以运行以下查询来获取服务器的IP地址,以验证是否使用了正确的IP。

Select inet_server_addr();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接