返回首页 您好

PostgreSQL数据库对外开放配置

发表时间:2026.03.11 10:17 浏览量:3

当postgresql只内对开放端口的场景下, 需要开放端口对外时,可以这样操作。

对内开放端口的netstat情况:

netstat -anp  | grep post
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN      902/postgres
tcp6       0      0 ::1:5432                :::*                    LISTEN      902/postgres

netstat 输出结果显示,当前 PostgreSQL 数据库只监听了本机地址(127.0.0.1 和 ::1),这意味着它只能接受来自服务器本地的连接,确实没有对外开放。要让数据库能够被外部访问,需要进行一些配置调整。


1. 当前端口开放情况分析

监听地址:127.0.0.1 (IPv4) 和 ::1 (IPv6)。这两个都是标准的回环(loopback)地址,仅代表服务器自己,外部网络无法通过这个地址连接到你的数据库。

端口状态:LISTEN 表示 PostgreSQL 服务正在 5432 端口上正常运行并等待连接。

进程:902/postgres 指明了这个监听服务是由进程 ID 为 902 的 postgres 进程提供的。

2. 如何将数据库对外开放

要让数据库对外开放,主要分三步:修改监听地址、配置访问权限、重启服务并放行防火墙。

第一步:修改监听地址
需要修改 PostgreSQL 的主配置文件 postgresql.conf,让数据库监听所有网络接口,而不仅仅是本地。

找到配置文件:文件通常位于 /etc/postgresql/<版本号>/main/postgresql.conf(常见于 Debian/Ubuntu 系统)或 /var/lib/pgsql/<版本号>/data/postgresql.conf(常见于 CentOS/RHEL 系统)。你可以使用 find / -name postgresql.conf 命令来定位它。

修改参数:使用文本编辑器(如 vim 或 nano)打开该文件,找到 listen_addresses 这一行。将其值从 'localhost' 修改为 '*',表示监听所有可用的网络接口。

# 修改前
#listen_addresses = 'localhost'

# 修改后
listen_addresses = '*'

安全提示:在生产环境中,更安全的做法是指定具体的内网 IP 地址,例如 listen_addresses = '192.168.1.100',而不是使用 '*',以减小攻击面。

第二步:配置客户端访问控制
修改完监听地址后,还需要在 pg_hba.conf 文件中配置访问规则,明确允许哪些外部 IP 可以连接。

找到配置文件:pg_hba.conf 通常和 postgresql.conf 在同一个目录下。

添加访问规则:在文件末尾添加一行规则,告诉 PostgreSQL 允许来自特定网络或所有网络的连接请求。例如,要允许所有 IP 地址使用密码(md5)方式连接所有数据库,可以添加:

# TYPE  DATABASE  USER  ADDRESS     METHOD
host    all       all   0.0.0.0/0   md5

0.0.0.0/0:表示允许所有 IPv4 地址。你也可以根据需要限制为特定的网段,如 192.168.1.0/24。

METHOD:md5 是一种常用的密码认证方式。从安全角度考虑,如果您的 PostgreSQL 版本和客户端支持,推荐使用更安全的 scram-sha-256 替代 md5。


第三步:重启服务与防火墙设置

配置完成后,需要重启 PostgreSQL 服务使更改生效,并确保防火墙允许外部访问 5432 端口。

重启 PostgreSQL 服务:

# 对于使用 systemd 的 Linux 系统(如 CentOS 7+, Debian 8+, Ubuntu 16+)
sudo systemctl restart postgresql

# 或者在某些系统上服务名可能不同,如 postgresql-12
# sudo systemctl restart postgresql-12

防火墙放行 5432 端口:

如果使用 firewalld (常见于 CentOS/RHEL):

sudo firewall-cmd --permanent --add-port=5432/tcp
sudo firewall-cmd --reload


如果使用 ufw (常见于 Ubuntu/Debian):

sudo ufw allow 5432/tcp


配置完成后验证

检查监听状态:再次运行 netstat -anp | grep 5432 或 ss -tulnp | grep 5432。如果配置成功,你应该会看到 PostgreSQL 监听了 0.0.0.0:5432(表示所有 IPv4 地址)或具体的服务器 IP 地址。

测试远程连接:从另一台机器尝试连接,替换 <服务器IP> 为你的服务器公网或内网地址:

psql -h <服务器IP> -p 5432 -U <用户名> -d <数据库名>


陕ICP备2024031593号-2