无法从 9.4 客户端连接到 postgresql 9.6 服务器

无法从 9.4 客户端连接到 postgresql 9.6 服务器

眼镜

服务器

  • 环境:FreeBSD(FreeNAS Jail)
  • Postgresql版本:9.4
  • 监听地址:'*'
  • 监听端口:8096
  • pg_hba.conf 条目:主机全部全部 0.0.0.0/0 md5

客户

  • 环境:Linux Ubuntu 16.0.4 LTS
  • Postgresql版本:9.6

问题

我正在尝试将公司的数据库托管在员工可以远程访问的服务器上。员工环境在 Linux 和 Windows 之间会有所不同。我的测试环境是 Linux 客户端。到目前为止,我无法成功将客户端连接到服务器。

我尝试过的方法

我创建了一个 postgresql 密码文件“.pgpass”,其中以格式输入了相关信息host:port:database:username:password。当我psql -h host -p port -U username database从客户端运行时,我收到超时错误。但是,当我在服务器上运行相同的命令时,它会提示我输入密码,然后我就可以连接到我的数据库了。

问题

我在这里做错了什么?我是否遗漏了某个步骤,或者 postgresql 的不同版本是否存在问题?问题是否在于 Linux 和 BSD 环境之间的差异?

- 编辑 -

确切的错误信息

psql: could not connect to server: Connection timed out
        Is the server running on host "host.domain.com" (###.###.###.###) and accepting
        TCP/IP connections on port [port]?

配置文件

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust

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

# IPv4 remote connections:
host    all             all             0.0.0.0/0               md5

答案1

我预计您有一个防火墙阻止端口 5432 上的传入连接。

答案2

问题最终是服务器端路由器的路由表出了问题。GUI 显示一切正常,端口报告为打开状态,并指向 postgresql 服务器。

解决方案

我通过 telnet 连接到服务器端路由器,手动设置路由表并强制重启。
连接到路由器后,我发出以下命令:

iptables -t nat -I PREROUTING -p tcp --dport <PORT> -j DNAT --to <SERVER_IP>:<SERVER_PORT>
iptables -I FORWARD -p tcp -d <SERVER_IP> --dport <SERVER_PORT> -j ACCEPT
reboot

我承认 通常reboot会撤消前两个命令的效果。但是,这在我的情况下有效。在运行命令之前iptables,我尝试了许多reboot序列,但无济于事。我不确定为什么 映射iptables直到 之后才起作用reboot。请随意发表评论。

最终,问题不在于 postgresql 或我的设置,而在于服务器端路由表的问题。

我希望这个答案能帮助那些遇到类似问题的人。即使路由器设置看起来不错,也并不意味着它没问题。

相关内容