我设置了 Postgres 16 并将其配置为从两个 IP 进行访问:我的家庭公共 IP 和与数据库位于同一专用网络上的另一个 VPS 的专用 IP。我发现虽然在家可以登录,但在我的 VPS(同一专用网络上的 VPS)上却无法登录
pg_hba.conf 是这样的:
host all all 107.x.x.x/32 scram-sha-256
host all all 10.x.x.x/20 scram-sha-256
在客户端(家庭和 VPS),我使用 Python3/SQLALchemy/psycopg2 进行连接。然而,当在 VPS 上运行脚本时,我得到了
password authentication failed
然后我将用于访问数据库的IP从私有IP更改为数据库的公共IP。我还更改了
pg_hba.conf
以允许VPS的公共IP,突然之间,我可以连接了!
host all all 107.x.x.x/32 scram-sha-256
host all all 10.x.x.x/20 scram-sha-256
host all all 138.x.x.x/32 scram-sha-256
很高兴我现在可以访问我的数据库,但这是否违背了将我的数据库和 VPS 放在同一专用网络上的目的?如果我使用公共 IP 访问数据库,即使我从同一机架上的服务器访问它,它也会被公开路由,对吧?我不确定是否是网络或数据库配置方面导致了问题。我隐藏了 IP,所以你无法判断我是否在 IP 范围上做错了什么,但在这种情况下,它不会给出密码错误,不是吗?
为什么从公共 IP 接受的密码会被私有 IP 拒绝?
针对问题的答复进行编辑:
使用本地IP连接时客户端上的完整错误:
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) connection to server at "10.108.0.2", port 6262 failed: FATAL: password authentication failed for user "myapp"
我的 postgres 日志中的最后一次连接尝试是我尝试使用公共 ip 进行连接。根据时间点,我知道正是该尝试导致了日志中显示的失败尝试:
2023-10-03 02:31:47.832 EDT [12728] FATAL: no pg_hba.conf entry for host "138.x.x.x", user "siteapp", database "sitedata", SSL encryption
2023-10-03 02:31:47.837 EDT [12729] FATAL: no pg_hba.conf entry for host "138.197.16.205", user "siteapp", database "sitedata", no encryption
2023-10-03 02:36:15.206 EDT [12712] LOG: checkpoint starting: time
2023-10-03 02:36:15.240 EDT [12712] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.003 s, sync=0.012 s, total=0.034 s; sync files=2, longest=0.008 s, average=0.006 s; distance=0 kB, estimate=0 kB; lsn=0/1BCF0B0, redo lsn=0/1BCF078
错误信息
password authentication failed for user "%s"
来自 PostgreSQL 服务器。如果您在 PostgreSQL 服务器日志中看不到相应的消息,则意味着日志记录被配置为不记录错误(您的情况并非如此),或者客户端尝试连接到与其所在集群不同的 PostgreSQL 集群。您显示的日志文件。