PostgreSQL 13 开启远程连接需修改 postgresql.conf 中的 listen_addresses 参数为 '*' 或特定 IP,并同时配置 pg_hba.conf 允许远程主机认证。生产环境直接监听所有接口存在安全风险,建议结合防火墙和白名单限制。
先说结论:仅修改 postgresql.conf 不足以开启远程连接,必须同步调整 pg_hba.conf 认证规则并重启服务。
- 适合:开发测试环境或已配置安全组的生产数据库
- 先准备:确认配置文件路径、具备 sudo 权限、备份原配置
- 验收:验证端口监听状态、远程客户端成功登录
命令速用版
以下命令适用于 Debian/Ubuntu 系默认路径,CentOS/RHEL 路径见分步处理章节。
sudo nano /etc/postgresql/13/main/postgresql.conf
# 修改行为:listen_addresses = '*'
sudo nano /etc/postgresql/13/main/pg_hba.conf
# 新增行:host all all 0.0.0.0/0 md5
sudo systemctl restart postgresql为什么会这样
PostgreSQL 默认配置仅监听 localhost 是为了防止未经授权的 network 访问。
数据库安装后默认 listen_addresses 值为 'localhost',且 pg_hba.conf 通常只信任本地连接。这种“宅”属性是安全默认值,避免数据库暴露在公网。开启远程连接本质是修改监听网卡范围并定义哪些 IP 可以通过密码认证。
分步处理
按顺序执行以下步骤,每步完成后检查确认点。
1. 定位配置文件路径
不同操作系统路径不同,使用 find 命令确认:sudo find / -name 'postgresql.conf' 2>/dev/null
常见路径:Debian/Ubuntu 为 /etc/postgresql/13/main/,CentOS/RHEL 为 /var/lib/pgsql/13/data/。
2. 修改监听地址
编辑 postgresql.conf,找到 listen_addresses 参数。
操作:将 #listen_addresses = 'localhost' 改为 listen_addresses = '*'。
风险边界:'*' 表示监听所有网卡,生产环境建议指定内网 IP。
3. 配置客户端认证
编辑同目录下的 pg_hba.conf 文件。
操作:在文件末尾添加 host all all 0.0.0.0/0 md5。
风险边界:避免使用 trust 方法,否则无需密码即可连接;md5 或 scram-sha-256 更安全。
4. 重启数据库服务
配置修改后必须重启生效。
命令:sudo systemctl restart postgresql 或 sudo systemctl restart postgresql-13。
检查点:服务状态 active (running)。
5. 开放防火墙端口
如果系统启用防火墙,需放行 5432 端口。
命令:sudo ufw allow 5432/tcp 或 sudo firewall-cmd `--add-port`=5432/tcp `--permanent`。
怎么验证是否生效
通过端口监听状态和远程客户端连接两方面验证。
1. 检查端口监听
执行命令:ss -lnt | grep 5432
生效标志:看到 0.0.0.0:5432 或 :::5432,而非 127.0.0.1:5432。
2. 远程连接测试
在另一台机器执行:psql -U postgres -h 服务器 IP -p 5432
生效标志:提示输入密码且登录成功,无 FATAL: no pg_hba.conf entry 错误。
常见坑
配置过程中容易忽略的细节导致连接失败。
- 认证方法错误:pg_hba.conf 中使用了 trust 导致安全风险,或使用了 md5 但用户密码未设置。
- 防火墙拦截:数据库服务已重启但云服务商安全组未放行 5432 端口。
- 配置文件未重载:修改后仅 reload 而非 restart,部分监听参数需重启生效。
- 路径混淆:CentOS 和 Ubuntu 配置文件路径不同,修改了错误目录下的文件。
常见问题
修改配置后服务启动失败怎么办?
检查配置文件语法错误。
查看日志 /var/log/postgresql/postgresql-13-main.log 或使用 journalctl -u postgresql 定位错误行,通常是拼写错误或缩进问题。
远程连接提示密码认证失败?
确认数据库用户已设置密码。
使用 psql -U postgres 登录后执行 \password 设置密码,确保 pg_hba.conf 认证方法与密码状态匹配。
监听地址修改后仍只监听 localhost?
确认修改的是正确的 postgresql.conf 文件。
使用 SHOW config_file; 命令查看当前服务加载的配置文件路径,确保编辑路径一致。
参考来源
- PostgreSQL 13/14 远程连接配置全攻略:从 listen_addresses 到 pg_hba.conf
- PostgreSQL 开启远程连接配置教程
- PostgreSQL 配置远程连接简单图文教程例子解析
- 如何配置 PostgreSQL 允许远程连接 - 以 Odoo 数据库为例
- CentOS 7 安装 PostgreSQL 13 完整实践教程
- PostgreSQL 13 配置允许远程连接