眼镜
服务器
- 环境: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 或我的设置,而在于服务器端路由表的问题。
我希望这个答案能帮助那些遇到类似问题的人。即使路由器设置看起来不错,也并不意味着它没问题。