1. 首页
  2. 系统运维

Postgres:一次诡异的远程无法连接

一切的一切起源于我的精打细算。我第二次采用的VPS效果我很满意,延时一直在20-30ms之间,2核4G,60G的空间,10m的峰值,唯一的缺点就是太贵了,如果不使用优惠码需要每个月150。

于是我开始寻找新的更便宜的VPS方案,终于在这个VPS厂商的兄弟单位看到了他同一个机房的KVM方案,算下来应该只有一半的费用(10.5美刀)。于是我就开始了一场非常诡异的迁移之旅。

顺利付款下单以后,我开始逐步将原来的网站进行迁移,其他的部分都是顺利的,其中跟本次事件相关的是Postgres的数据库服务器的迁移,从前天晚上开始进行迁移,当天迁移了一半,到了第二天早上,整个迁移快要接近尾声了,我开始逐步删掉老服务器上的数据。当时我使用的是SQL Manager Lite for PostgreSQL,就在我Drop掉老的服务器的数据库时,我忽然发现这台新的服务器无法远程连接了?报的错误的截图如下:

Postgres:一次诡异的远程无法连接

Can’t obtain database list from the server. server closed the connection unexpectedly. This probably means the server terminated abnormally before or while processing the request.

这就有点尴尬了,因为这个错误往往是因为postgres的两个配置文件没有配置好,或者vps服务器的5432端口没有开启造成的。可是我刚才的操作跟这几个点没有任何关系啊?更何况我还是操作的另外一台服务器。于是我的噩梦开始了。

在接下来的12个小时内,我尝试了以下各种方法,都证明是无效的。

  • 更换Postgres版本:无效;
  • 更换Postgres侦听端口:无效;
  • 从原来正常的老服务器,拷贝他的配置文件:无效;
  • 更换整个服务器的安装顺序(为此我重新安装了多次):无效;
  • 退掉这个vps厂商,重新买了一台跟原来老服务器一样的xen vps:一开始有效,后面又无效!

我把所有能想到的因素都考虑到了,我甚至都开始怀疑是不是这个vps厂商的运营团队针对性的在捉弄我?每次都故意封堵我的端口吗?(这也不是绝对不可能,因为以前我手下的人在公司机房就曾经干过这种事情)。

一直到晚上10点,我筋疲力尽,这个新买的xen vps的系统重装次数都已经超过3次了,其中有两次是因为该死的硬盘扩容脚本应该在初始化的时候第一时间运行而没有做。超过5次就必须要提工单付费在重装了,最关键的是,我根本还没找到原因在哪里,而这种重装到底意义何在?

就在我开始新的一轮重装,通过mobaxterm的ssh session登陆的时候,我无意中看到了登陆信息中显示的上次登陆IP居然不是我本地的IP,而是我用来科学上网的服务器的IP?!!!!(如下图)

Postgres:一次诡异的远程无法连接

这是什么鬼??!!路由器自动判断我这个服务器的IP是属于被墙的范围,而让所有走向这个IP的流量都强行通过代理?

我忽然一下子想明白了,我马上进入路由器,关掉了一直常开的科学上网,然后快速安装和配置好postgres,用 SQL Manager Lite for PostgreSQL 一登陆,问题解决了,熟悉的数据库列表很快就出现了!

后面我又反复验证了这个问题,确实如此,如果客户端和数据库服务器之间通过5432进行远程连接时,是不能通过vpn或者科学上网进行处理的。否则就会被数据库服务器中断连接,或者说vpn无法把数据库服务器的返回再次中转给你。

至于为什么路由器会让我的服务器IP强行走代理?我目前还不知道原因,但据我测试,代理的两种模式gfwlist和大陆白名单,就算将该ip设为白名单(无需走代理),但前者依然还是会偶尔强制走代理,而采用后者,目前看来是比较保险的。

希望我这篇文章能帮助到遇到了类似问题的朋友。

本文原文非中文版本,由BruceX进行翻译,如若转载,请注明出处:https://www.iota.love/201910/postgres-remote-access-terminated-abnormally-for-vpn/