Skip to content

PostgreSQL 网络与防火墙设置

网络配置基础

PostgreSQL 的网络配置是确保数据库安全和可访问性的重要组成部分。正确的网络配置可以保护数据库免受未授权访问,同时确保合法用户能够正常连接。

PostgreSQL 网络架构

PostgreSQL 使用客户端-服务器架构,通过 TCP/IP 协议进行通信:

  • 服务器端:监听指定的 IP 地址和端口,接受客户端连接请求
  • 客户端:通过网络连接到服务器,发送 SQL 命令并接收结果
  • 默认端口:PostgreSQL 默认使用 5432 端口进行通信

监听地址配置

PostgreSQL 的监听地址配置决定了服务器接受哪些网络接口上的连接请求。

  1. 默认配置

默认情况下,PostgreSQL 只监听本地回环地址(127.0.0.1),这意味着只能从本机访问数据库。

  1. 修改监听地址

要允许远程连接,需要修改 postgresql.conf 文件中的 listen_addresses 参数:

txt
# 监听所有可用网络接口
listen_addresses = '*'

# 只监听特定 IP 地址
listen_addresses = '192.168.1.100,127.0.0.1'
  1. 端口配置

如果需要使用非默认端口,可以修改 port 参数:

txt
# 使用自定义端口
port = 5433

PostgreSQL 连接设置

客户端认证配置

PostgreSQL 使用 pg_hba.conf 文件来控制客户端的访问认证。该文件定义了哪些客户端可以连接到哪个数据库,使用什么认证方法。

  1. 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 等)
  1. 常见认证规则示例
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
  1. 认证方法选择
  • scram-sha-256:推荐的密码认证方法,提供更强的安全性
  • md5:传统的密码认证方法,仍在广泛使用,但安全性较低
  • trust:完全信任,不进行密码验证,仅在安全环境中使用
  • peer:通过操作系统用户名进行认证,仅适用于本地连接
  • ident:通过外部 ident 服务器进行认证,适用于 TCP/IP 连接

连接数限制

PostgreSQL 允许的最大连接数由 postgresql.conf 文件中的 max_connections 参数控制:

txt
# 设置最大连接数
max_connections = 100

对于生产环境,建议根据服务器资源和应用需求合理设置最大连接数。

防火墙配置

防火墙是保护 PostgreSQL 服务器的重要安全措施,可以限制哪些 IP 地址和端口可以访问服务器。

Linux 防火墙配置

iptables 配置

  1. 允许本地连接
bash
# 允许本地回环地址访问
iptables -A INPUT -i lo -j ACCEPT
  1. 允许 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
  1. 保存 iptables 规则
bash
# CentOS/RHEL 7
service iptables save

# CentOS/RHEL 8+ 或 Ubuntu
iptables-save > /etc/iptables/rules.v4

firewalld 配置

对于使用 firewalld 的系统(如 CentOS/RHEL 8+):

  1. 允许 PostgreSQL 服务
bash
# 允许 PostgreSQL 服务
sudo firewall-cmd --permanent --add-service=postgresql

# 重新加载防火墙规则
sudo firewall-cmd --reload
  1. 允许特定 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 --reload

Windows 防火墙配置

  1. 通过图形界面配置
  • 打开 "Windows Defender 防火墙" → "高级设置"
  • 选择 "入站规则" → "新建规则"
  • 选择 "端口" → 输入 PostgreSQL 端口(默认 5432)
  • 选择 "允许连接"
  • 选择适用的网络类型(域、专用、公共)
  • 为规则命名并保存
  1. 通过 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:

  1. AWS 安全组
  • 登录 AWS 控制台,导航到 EC2 → 安全组
  • 创建或编辑安全组,添加入站规则
  • 协议:TCP
  • 端口范围:5432
  • 源:特定 IP 地址或 CIDR 范围
  1. Azure 网络安全组
  • 登录 Azure 门户,导航到网络安全组
  • 添加入站安全规则
  • 源:特定 IP 地址或 CIDR 范围
  • 目标端口范围:5432
  • 协议:TCP
  • 操作:允许
  1. 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 认证方法,避免使用 trustmd5

txt
# 在 pg_hba.conf 中使用 scram-sha-256 认证
host    all             all             192.168.1.0/24          scram-sha-256

3. 限制连接来源

只允许必要的 IP 地址或网络访问 PostgreSQL:

txt
# 只允许特定网络访问
host    all             all             192.168.1.0/24          scram-sha-256

4. 使用非默认端口

考虑使用非默认端口来减少恶意扫描:

txt
# 使用自定义端口
port = 5433

5. 启用 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 = 100

7. 定期审查连接日志

启用连接日志,定期审查异常连接尝试:

txt
# 启用连接日志
log_connections = on
log_disconnections = on

8. 使用连接池

对于高并发场景,使用连接池(如 PgBouncer 或 Pgpool-II)来管理数据库连接,减少服务器资源消耗:

  • 减少 PostgreSQL 服务器的连接数
  • 提高连接复用率
  • 支持连接请求排队和负载均衡

常见问题(FAQ)

Q1: 如何允许远程连接到 PostgreSQL?

A1: 允许远程连接需要完成以下步骤:

  1. 修改 postgresql.conf 文件,设置 listen_addresses = '*' 或特定 IP 地址
  2. 修改 pg_hba.conf 文件,添加允许远程连接的认证规则
  3. 配置防火墙,允许 PostgreSQL 端口的访问
  4. 重启 PostgreSQL 服务

Q2: 为什么我无法远程连接到 PostgreSQL?

A2: 无法远程连接可能的原因包括:

  1. listen_addresses 参数配置不正确
  2. pg_hba.conf 中没有允许远程连接的规则
  3. 防火墙阻止了 PostgreSQL 端口的访问
  4. PostgreSQL 服务没有运行
  5. 客户端使用了错误的 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: 可以使用以下方法测试连接:

  1. 使用 psql 命令
bash
# 本地连接
psql -h localhost -U postgres

# 远程连接
psql -h 192.168.1.100 -U postgres -d mydatabase
  1. 使用 telnet 命令
bash
telnet 192.168.1.100 5432
  1. 使用 nc 命令
bash
nc -zv 192.168.1.100 5432

Q5: 如何安全地配置 PostgreSQL 网络?

A5: 安全的 PostgreSQL 网络配置包括:

  1. 限制监听地址,只监听必要的网络接口
  2. 使用强认证方法(scram-sha-256)
  3. 限制连接来源,只允许必要的 IP 地址访问
  4. 配置防火墙,限制 PostgreSQL 端口的访问
  5. 启用 SSL/TLS 加密
  6. 合理设置最大连接数
  7. 启用连接日志,定期审查

Q6: 如何修改 PostgreSQL 的默认端口?

A6: 修改 postgresql.conf 文件中的 port 参数:

txt
# 使用自定义端口
port = 5433

修改后需要重启 PostgreSQL 服务才能生效。

Q7: 如何允许所有 IP 地址访问 PostgreSQL?

A7: 虽然不推荐,但可以通过以下配置允许所有 IP 地址访问:

  1. 修改 postgresql.conf
txt
listen_addresses = '*'
  1. 修改 pg_hba.conf
txt
host    all             all             0.0.0.0/0               scram-sha-256
host    all             all             ::/0                    scram-sha-256
  1. 配置防火墙允许所有 IP 地址访问 5432 端口

Q8: 如何使用 SSL 连接到 PostgreSQL?

A8: 使用 SSL 连接需要:

  1. 服务器端启用 SSL 配置
  2. 客户端连接时指定 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 网络性能的方法包括:

  1. 使用高速网络连接
  2. 启用 SSL 会话缓存
  3. 调整 TCP 缓冲区大小
  4. 使用连接池减少连接开销
  5. 优化查询,减少网络数据传输量
  6. 考虑使用本地连接(如果可能)