外观
PostgreSQL 网络与防火墙设置
网络配置基础
PostgreSQL 的网络配置是确保数据库安全和可访问性的重要组成部分。正确的网络配置可以保护数据库免受未授权访问,同时确保合法用户能够正常连接。
PostgreSQL 网络架构
PostgreSQL 使用客户端-服务器架构,通过 TCP/IP 协议进行通信:
- 服务器端:监听指定的 IP 地址和端口,接受客户端连接请求
- 客户端:通过网络连接到服务器,发送 SQL 命令并接收结果
- 默认端口:PostgreSQL 默认使用 5432 端口进行通信
监听地址配置
PostgreSQL 的监听地址配置决定了服务器接受哪些网络接口上的连接请求。
- 默认配置
默认情况下,PostgreSQL 只监听本地回环地址(127.0.0.1),这意味着只能从本机访问数据库。
- 修改监听地址
要允许远程连接,需要修改 postgresql.conf 文件中的 listen_addresses 参数:
txt
# 监听所有可用网络接口
listen_addresses = '*'
# 只监听特定 IP 地址
listen_addresses = '192.168.1.100,127.0.0.1'- 端口配置
如果需要使用非默认端口,可以修改 port 参数:
txt
# 使用自定义端口
port = 5433PostgreSQL 连接设置
客户端认证配置
PostgreSQL 使用 pg_hba.conf 文件来控制客户端的访问认证。该文件定义了哪些客户端可以连接到哪个数据库,使用什么认证方法。
- pg_hba.conf 格式
每个认证规则由以下字段组成:
TYPE DATABASE USER ADDRESS METHOD- TYPE:连接类型(local、host、hostssl、hostnossl)
- DATABASE:允许访问的数据库名称
- USER:允许连接的用户名
- ADDRESS:客户端 IP 地址或网络地址
- METHOD:认证方法(trust、reject、md5、scram-sha-256、ident、peer、ldap 等)
- 常见认证规则示例
txt
# 允许本地用户通过 Unix 套接字连接到任何数据库,使用 peer 认证
local all all peer
# 允许本地用户通过 TCP/IP 连接到任何数据库,使用 scram-sha-256 认证
host all all 127.0.0.1/32 scram-sha-256
# 允许特定网络的用户连接到任何数据库,使用 scram-sha-256 认证
host all all 192.168.1.0/24 scram-sha-256
# 允许任何 IP 地址的用户连接到特定数据库,使用 scram-sha-256 认证
host mydatabase myuser 0.0.0.0/0 scram-sha-256
# 允许 IPv6 地址的用户连接到任何数据库,使用 scram-sha-256 认证
host all all ::1/128 scram-sha-256- 认证方法选择
- scram-sha-256:推荐的密码认证方法,提供更强的安全性
- md5:传统的密码认证方法,仍在广泛使用,但安全性较低
- trust:完全信任,不进行密码验证,仅在安全环境中使用
- peer:通过操作系统用户名进行认证,仅适用于本地连接
- ident:通过外部 ident 服务器进行认证,适用于 TCP/IP 连接
连接数限制
PostgreSQL 允许的最大连接数由 postgresql.conf 文件中的 max_connections 参数控制:
txt
# 设置最大连接数
max_connections = 100对于生产环境,建议根据服务器资源和应用需求合理设置最大连接数。
防火墙配置
防火墙是保护 PostgreSQL 服务器的重要安全措施,可以限制哪些 IP 地址和端口可以访问服务器。
Linux 防火墙配置
iptables 配置
- 允许本地连接
bash
# 允许本地回环地址访问
iptables -A INPUT -i lo -j ACCEPT- 允许 PostgreSQL 端口访问
bash
# 允许特定 IP 地址访问 PostgreSQL 端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5432 -j ACCEPT
# 允许所有 IP 地址访问 PostgreSQL 端口(不推荐)
iptables -A INPUT -p tcp --dport 5432 -j ACCEPT- 保存 iptables 规则
bash
# CentOS/RHEL 7
service iptables save
# CentOS/RHEL 8+ 或 Ubuntu
iptables-save > /etc/iptables/rules.v4firewalld 配置
对于使用 firewalld 的系统(如 CentOS/RHEL 8+):
- 允许 PostgreSQL 服务
bash
# 允许 PostgreSQL 服务
sudo firewall-cmd --permanent --add-service=postgresql
# 重新加载防火墙规则
sudo firewall-cmd --reload- 允许特定 IP 地址访问
bash
# 允许特定 IP 地址访问 PostgreSQL 端口
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="5432" accept'
# 重新加载防火墙规则
sudo firewall-cmd --reloadWindows 防火墙配置
- 通过图形界面配置
- 打开 "Windows Defender 防火墙" → "高级设置"
- 选择 "入站规则" → "新建规则"
- 选择 "端口" → 输入 PostgreSQL 端口(默认 5432)
- 选择 "允许连接"
- 选择适用的网络类型(域、专用、公共)
- 为规则命名并保存
- 通过 PowerShell 配置
powershell
# 允许 PostgreSQL 端口
typeof PowerShell 命令
New-NetFirewallRule -DisplayName "PostgreSQL" -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow
# 只允许特定 IP 地址访问
New-NetFirewallRule -DisplayName "PostgreSQL Restricted" -Direction Inbound -Protocol TCP -LocalPort 5432 -RemoteAddress 192.168.1.0/24 -Action Allow云平台防火墙配置
如果 PostgreSQL 部署在云平台上,需要配置云平台的安全组或网络 ACL:
- AWS 安全组
- 登录 AWS 控制台,导航到 EC2 → 安全组
- 创建或编辑安全组,添加入站规则
- 协议:TCP
- 端口范围:5432
- 源:特定 IP 地址或 CIDR 范围
- Azure 网络安全组
- 登录 Azure 门户,导航到网络安全组
- 添加入站安全规则
- 源:特定 IP 地址或 CIDR 范围
- 目标端口范围:5432
- 协议:TCP
- 操作:允许
- Google Cloud 防火墙规则
- 登录 Google Cloud 控制台,导航到 VPC 网络 → 防火墙
- 创建防火墙规则
- 方向:入站
- 目标:所有实例或特定实例
- 源 IP 范围:特定 IP 地址或 CIDR 范围
- 协议和端口:tcp:5432
网络安全最佳实践
1. 限制监听地址
只监听必要的网络接口,避免使用 listen_addresses = '*' 除非确实需要:
txt
# 只监听特定 IP 地址
listen_addresses = '192.168.1.100,127.0.0.1'2. 使用强认证方法
优先使用 scram-sha-256 认证方法,避免使用 trust 或 md5:
txt
# 在 pg_hba.conf 中使用 scram-sha-256 认证
host all all 192.168.1.0/24 scram-sha-2563. 限制连接来源
只允许必要的 IP 地址或网络访问 PostgreSQL:
txt
# 只允许特定网络访问
host all all 192.168.1.0/24 scram-sha-2564. 使用非默认端口
考虑使用非默认端口来减少恶意扫描:
txt
# 使用自定义端口
port = 54335. 启用 SSL/TLS
为 PostgreSQL 连接启用 SSL/TLS 加密,保护数据传输安全:
txt
# 启用 SSL
ssl = on
# SSL 证书配置
ssl_cert_file = '/path/to/server.crt'
ssl_key_file = '/path/to/server.key'
ssl_ca_file = '/path/to/root.crt'6. 限制连接数
根据服务器资源合理设置最大连接数:
txt
# 设置适当的最大连接数
max_connections = 1007. 定期审查连接日志
启用连接日志,定期审查异常连接尝试:
txt
# 启用连接日志
log_connections = on
log_disconnections = on8. 使用连接池
对于高并发场景,使用连接池(如 PgBouncer 或 Pgpool-II)来管理数据库连接,减少服务器资源消耗:
- 减少 PostgreSQL 服务器的连接数
- 提高连接复用率
- 支持连接请求排队和负载均衡
常见问题(FAQ)
Q1: 如何允许远程连接到 PostgreSQL?
A1: 允许远程连接需要完成以下步骤:
- 修改
postgresql.conf文件,设置listen_addresses = '*'或特定 IP 地址 - 修改
pg_hba.conf文件,添加允许远程连接的认证规则 - 配置防火墙,允许 PostgreSQL 端口的访问
- 重启 PostgreSQL 服务
Q2: 为什么我无法远程连接到 PostgreSQL?
A2: 无法远程连接可能的原因包括:
listen_addresses参数配置不正确pg_hba.conf中没有允许远程连接的规则- 防火墙阻止了 PostgreSQL 端口的访问
- PostgreSQL 服务没有运行
- 客户端使用了错误的 IP 地址或端口
Q3: 如何查看 PostgreSQL 当前监听的地址和端口?
A3: 可以使用以下命令查看:
bash
# 使用 netstat 命令
netstat -tuln | grep 5432
# 使用 ss 命令
ss -tuln | grep 5432
# 从 PostgreSQL 内部查看
psql -c "SHOW listen_addresses;"
psql -c "SHOW port;"Q4: 如何测试 PostgreSQL 连接?
A4: 可以使用以下方法测试连接:
- 使用 psql 命令
bash
# 本地连接
psql -h localhost -U postgres
# 远程连接
psql -h 192.168.1.100 -U postgres -d mydatabase- 使用 telnet 命令
bash
telnet 192.168.1.100 5432- 使用 nc 命令
bash
nc -zv 192.168.1.100 5432Q5: 如何安全地配置 PostgreSQL 网络?
A5: 安全的 PostgreSQL 网络配置包括:
- 限制监听地址,只监听必要的网络接口
- 使用强认证方法(scram-sha-256)
- 限制连接来源,只允许必要的 IP 地址访问
- 配置防火墙,限制 PostgreSQL 端口的访问
- 启用 SSL/TLS 加密
- 合理设置最大连接数
- 启用连接日志,定期审查
Q6: 如何修改 PostgreSQL 的默认端口?
A6: 修改 postgresql.conf 文件中的 port 参数:
txt
# 使用自定义端口
port = 5433修改后需要重启 PostgreSQL 服务才能生效。
Q7: 如何允许所有 IP 地址访问 PostgreSQL?
A7: 虽然不推荐,但可以通过以下配置允许所有 IP 地址访问:
- 修改
postgresql.conf:
txt
listen_addresses = '*'- 修改
pg_hba.conf:
txt
host all all 0.0.0.0/0 scram-sha-256
host all all ::/0 scram-sha-256- 配置防火墙允许所有 IP 地址访问 5432 端口
Q8: 如何使用 SSL 连接到 PostgreSQL?
A8: 使用 SSL 连接需要:
- 服务器端启用 SSL 配置
- 客户端连接时指定 SSL 选项
bash
# 使用 psql 连接时指定 SSL 选项
psql "host=192.168.1.100 port=5432 dbname=mydatabase user=postgres sslmode=require"Q9: 如何查看当前的连接数?
A9: 可以使用以下命令查看当前连接数:
bash
# 从 PostgreSQL 内部查看
psql -c "SELECT count(*) FROM pg_stat_activity;"
psql -c "SHOW max_connections;"Q10: 如何优化 PostgreSQL 网络性能?
A10: 优化 PostgreSQL 网络性能的方法包括:
- 使用高速网络连接
- 启用 SSL 会话缓存
- 调整 TCP 缓冲区大小
- 使用连接池减少连接开销
- 优化查询,减少网络数据传输量
- 考虑使用本地连接(如果可能)
