【问题标题】:Connection to <hostname>:5432 refused与 <主机名> 的连接:5432 被拒绝
【发布时间】:2015-07-07 12:33:24
【问题描述】:

我不是通信网络方面的专家,所以我不知道我的“主机名”应该是什么,在哪里可以找到它?

我在 ubuntu 14.04 上创建了一个 postgreSQL 服务器,我可以通过将主机名设置为 127.0.0.1(localhost),甚至 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-s,并禁用了ubuntu 防火墙。

【问题讨论】:

  • 能贴一下jdbc连接字符串吗?
  • 您很可能安装了防火墙来阻止来自外部的连接。
  • Giovanni, yes, "jdbc:postgresql:///" ( 里面是字符串变量,我用 JTextField 将它们输入到我的程序中)
  • 当你 telnet hostname 5432 时会发生什么?如果这不起作用,那真的是网络问题,而不是 Postgres 或 JDBC 问题。
  • Andomar,来自哪台计算机、我自己的 (ubuntu) 或本地/非本地网络中的其他 (Windows) 计算机?主机名是什么,我的公共 IP ? (我不是专业人士)。在我的电脑上 telnet 适用于 127.0.0.1 和 192.168.1.42,但不适用于公共 ip 98.765.432.123 (?)

标签: java postgresql jdbc


【解决方案1】:

这可能是由很多原因造成的。

  1. 服务器有一个 IP 地址。这是 JDBC 连接字符串应该用于&lt;hostname&gt; 的地址,除非您有一些本地 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 框并输入 psql 作为 postgres 用户:

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”的信息。我有 thomson 网关,将协议设置为:“Any”,触发范围为“5432-5432”,将 Translate 设置为 ... 为空,触发协议为空,触发端口为空是否足够?
  • 我一步一步地遵循了您的指导方针,现在它非常适合本地网络。您可能还想在答案中添加必须使用“sudo ufw disable”禁用 ubuntu 防火墙才能使一切正常工作。 (更复杂的方法是编辑iptables)
  • @Vekszor 很高兴能提供帮助。关于 Thompson 网关的问题,我没有使用该网关的经验,但网络上有许多网站对每个路由器和网关都有具体的详细信息。
【解决方案2】:

阅读您的 cmets 到正确答案:
这是向 iptables 添加规则的方式:

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

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

【讨论】:

  • 还是不敢相信。
【解决方案3】:

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

Select inet_server_addr();

【讨论】:

    猜你喜欢
    • 2020-12-09
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多