Skip to content

PostgreSQL 端口管理

端口管理概述

端口管理是PostgreSQL数据库安全的重要组成部分,合理的端口配置可以有效减少攻击面,提高数据库系统的安全性。PostgreSQL默认使用5432端口,但在生产环境中,建议根据实际情况进行调整。

默认端口

PostgreSQL默认使用的端口如下:

组件默认端口说明
PostgreSQL主服务5432用于客户端连接的默认端口
PostgreSQL复制连接5432主从复制也使用主服务端口(可通过配置分离)
PgBouncer6432常用的PostgreSQL连接池工具
pgpool-II9999高级连接池和负载均衡工具
repmgr5432基于主服务端口进行集群管理
Patroni8008Patroni API服务端口

端口配置方法

修改主服务端口

编辑postgresql.conf文件修改主服务端口:

ini
# 在postgresql.conf中修改
port = 5433          # 监听的TCP端口号
listen_addresses = '*'  # 允许的连接地址,生产环境建议指定具体IP

重启服务使配置生效

bash
# Linux系统
sudo systemctl restart postgresql-14

# Windows系统
net stop postgresql-x64-14
net start postgresql-x64-14

# macOS系统
brew services restart postgresql@14

验证端口变更

bash
# 使用ps命令验证
ps aux | grep postgres | grep -E "-p|--port"

# 使用netstat或ss命令验证
ss -tuln | grep 5433

# 使用pg_isready命令验证
pg_isready -p 5433 -h localhost

端口安全最佳实践

1. 避免使用默认端口

默认端口5432是攻击者的主要目标,建议修改为非默认端口:

ini
port = 15432  # 使用高位端口,减少被扫描发现的概率

2. 限制监听地址

不要使用listen_addresses = '*',建议只监听必要的IP地址:

ini
# 只监听本地回环地址和特定业务IP
listen_addresses = '127.0.0.1,192.168.1.100'

3. 配置防火墙规则

使用防火墙限制只允许特定IP访问数据库端口:

bash
# 使用iptables(CentOS 7及以下)
iptables -A INPUT -p tcp --dport 15432 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 15432 -j DROP

# 使用firewalld(CentOS 8/RHEL 8)
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="15432" protocol="tcp" accept'
firewall-cmd --reload

4. 使用连接池隔离数据库端口

将数据库主服务端口仅开放给连接池,客户端通过连接池访问数据库:

客户端 → 连接池(6432端口) → 数据库(15432端口)

多实例端口管理

在同一台服务器上运行多个PostgreSQL实例时,需要为每个实例配置不同的端口:

1. 使用initdb初始化多实例

bash
# 初始化第一个实例(默认端口5432)
initdb -D /data/pgdata1

# 初始化第二个实例(端口5433)
initdb -D /data/pgdata2

2. 为每个实例配置不同端口

ini
# 第一个实例:/data/pgdata1/postgresql.conf
port = 5432

# 第二个实例:/data/pgdata2/postgresql.conf  
port = 5433

3. 启动多实例

bash
# 启动第一个实例
pg_ctl -D /data/pgdata1 start

# 启动第二个实例  
pg_ctl -D /data/pgdata2 start

4. 验证多实例端口

bash
ss -tuln | grep postgres

云环境下的端口管理

AWS RDS PostgreSQL端口配置

  1. 在RDS控制台创建实例时指定端口
  2. 通过安全组控制访问IP
  3. 建议使用非默认端口

阿里云RDS PostgreSQL端口配置

  1. 在RDS实例创建或修改时设置端口
  2. 通过白名单控制访问IP
  3. 支持VPC内网访问

腾讯云PostgreSQL端口配置

  1. 在实例管理中修改端口
  2. 通过安全组和网络ACL控制访问
  3. 支持私有网络访问

端口监控与故障排查

1. 监控端口连接数

sql
-- 查看当前连接数
SELECT count(*) FROM pg_stat_activity;

-- 按端口查看连接数
SELECT client_port, count(*) FROM pg_stat_activity GROUP BY client_port;

2. 查看端口监听状态

bash
# Linux
sudo netstat -tuln | grep postgres

# Windows
netstat -an | findstr "5432"

3. 排查端口连接失败问题

bash
# 检查端口是否开放
telnet 192.168.1.100 5432

# 使用nc命令检查
nc -zv 192.168.1.100 5432

# 检查防火墙规则
firewall-cmd --list-all

版本差异

PostgreSQL 9.x及之前版本

  • 默认端口配置方式相同
  • 监听地址默认值为localhost,需要显式修改为*或具体IP

PostgreSQL 10及之后版本

  • 引入了postgresql.auto.conf文件,配置优先级高于postgresql.conf
  • 支持通过ALTER SYSTEM命令在线修改端口配置:
sql
ALTER SYSTEM SET port = 5433;
-- 修改后需要重启服务生效

PostgreSQL 13及之后版本

  • 增强了端口安全检查
  • 支持更细粒度的连接控制

最佳实践总结

  1. 修改默认端口:将5432端口修改为非默认端口,减少被扫描风险
  2. 限制监听地址:只监听必要的IP地址,避免使用listen_addresses = '*'
  3. 配置防火墙:使用防火墙严格限制访问数据库端口的IP范围
  4. 使用连接池:将数据库端口仅开放给连接池,客户端通过连接池访问
  5. 多实例端口规划:在同一服务器上运行多个实例时,合理规划端口范围
  6. 云环境安全组:在云环境中,严格配置安全组规则,只允许必要的IP访问
  7. 定期审计:定期检查端口配置和访问日志,及时发现异常访问
  8. 版本升级:保持PostgreSQL版本更新,享受最新的端口安全特性

通过合理的端口管理,可以有效提高PostgreSQL数据库的安全性,减少潜在的安全风险。在实际生产环境中,应根据业务需求和安全策略,制定适合的端口管理方案。