当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 <数据库名>