You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PostgreSQL无法监听指定IP,仅允许本地及特定公网IP访问遇阻

解决PostgreSQL仅允许本地与指定公网IP访问的配置问题

我来帮你搞定这个PostgreSQL访问控制的问题,你之前遇到的「Server don't listen」错误,核心原因是当你只把listen_addresses设为公网IP时,PostgreSQL只会监听这个公网IP的端口,完全不处理本地localhost(127.0.0.1/::1)的连接请求。要实现「仅本地+指定公网IP可访问」的需求,需要两步配置:调整监听地址,再配合访问控制规则,缺一不可。

第一步:修改postgresql.conf的监听地址

打开你的PostgreSQL配置文件(通常在/var/lib/postgresql/<版本号>/main//etc/postgresql/<版本号>/main/目录下),找到listen_addresses参数,修改为同时包含本地地址和你的公网IP:

listen_addresses = 'localhost,172.211.xx.xx'
  • localhost会自动覆盖IPv4的127.0.0.1和IPv6的::1,确保本地能通过localhost/127.0.0.1连接;
  • 后面追加你的公网IP,让PostgreSQL同时监听这个地址的请求。

第二步:修改pg_hba.conf控制访问权限

listen_addresses只是告诉PostgreSQL要监听哪些地址,真正的「谁能访问」是由pg_hba.conf(和postgresql.conf同目录)控制的。添加以下规则:

# 允许本地通过Unix套接字连接(如果用psql不加-h参数的话)
local   all             all                                     trust
# 允许本地IPv4地址连接(用md5认证,输入密码)
host    all             all             127.0.0.1/32            md5
# 允许本地IPv6地址连接(如果需要的话)
host    all             all             ::1/128                 md5
# 允许指定公网IP连接(替换成你的实际IP,同样用md5认证)
host    all             all             172.211.xx.xx/32        md5
  • 如果你不需要IPv6支持,可以删掉::1/128那一行;
  • 认证方式trust表示本地无需密码(适合开发环境),生产环境建议换成md5scram-sha-256
  • 如果你的公网IP是动态的(ISP不定期更换),可以把/32改成对应的CIDR范围(比如172.211.xx.0/24,具体问你的ISP),但固定IP用/32最安全。

第三步:重启PostgreSQL服务

配置修改后必须重启服务才能生效,不同系统命令略有不同:

  • Ubuntu/Debian:
    sudo systemctl restart postgresql
    
  • CentOS/RHEL(以PostgreSQL 15为例):
    sudo systemctl restart postgresql-15
    
  • Windows:打开「服务」管理器,找到PostgreSQL服务右键重启即可。

额外注意事项

  1. 防火墙放行:如果你的服务器是云主机(阿里云/腾讯云等),别忘了在安全组里开放5432端口给172.211.xx.xx和本地IP;本地防火墙(ufw/firewalld)也要对应放行,否则即使PostgreSQL配置对了,请求也会被防火墙拦截。
  2. 验证配置
    • 本地测试:直接执行psql -U 你的用户名 -d 你的数据库名,应该能正常连接;
    • 公网测试:在指定IP的机器上执行psql -h 你的公网IP -U 你的用户名 -d 你的数据库名,输入密码后应该能连接;其他IP的机器尝试连接会被拒绝。

内容的提问来源于stack exchange,提问作者Ronaldo Lanhellas

火山引擎 最新活动