Skip to content

PostgreSQL 防火墙配置

防火墙配置概述

防火墙是保护PostgreSQL数据库安全的重要防线,通过配置防火墙规则,可以严格控制哪些IP地址和端口能够访问数据库服务器。合理的防火墙配置可以有效防止未授权访问和恶意攻击,提高数据库系统的安全性。

Linux系统防火墙配置

iptables配置(CentOS 7及以下版本)

iptables是Linux系统传统的防火墙管理工具,在CentOS 7及以下版本中广泛使用。

1. 查看当前iptables规则

bash
iptables -L -n --line-numbers

2. 允许特定IP访问PostgreSQL端口

bash
# 允许192.168.1.0/24网段访问5432端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 5432 -j ACCEPT

# 允许10.0.0.100单IP访问5432端口
iptables -A INPUT -p tcp -s 10.0.0.100 --dport 5432 -j ACCEPT

3. 允许本地回环地址访问

bash
iptables -A INPUT -i lo -j ACCEPT

4. 拒绝其他所有访问PostgreSQL端口的请求

bash
iptables -A INPUT -p tcp --dport 5432 -j DROP

5. 保存iptables规则

bash
# CentOS 6
service iptables save

# CentOS 7
iptables-save > /etc/sysconfig/iptables

6. 重启iptables服务

bash
# CentOS 6
service iptables restart

# CentOS 7
systemctl restart iptables

firewalld配置(CentOS 8/RHEL 8及以上版本)

firewalld是CentOS 8/RHEL 8及以上版本默认的防火墙管理工具,提供了更友好的管理界面和动态更新机制。

1. 查看firewalld状态

bash
systemctl status firewalld

2. 启用并启动firewalld

bash
systemctl enable firewalld
systemctl start firewalld

3. 允许特定IP访问PostgreSQL端口

bash
# 允许192.168.1.0/24网段访问5432端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="5432" protocol="tcp" accept'

# 允许10.0.0.100单IP访问5432端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.100" port port="5432" protocol="tcp" accept'

4. 允许PostgreSQL服务

bash
# 查看是否有PostgreSQL服务定义
firewall-cmd --get-services | grep postgresql

# 如果有,可以直接允许服务
firewall-cmd --permanent --add-service=postgresql

5. 重新加载firewalld规则

bash
firewall-cmd --reload

6. 查看已配置的规则

bash
firewall-cmd --list-all
firewall-cmd --list-rich-rules

Windows系统防火墙配置

图形界面配置

  1. 打开"Windows Defender 防火墙"控制台
  2. 点击"高级设置" -> "入站规则" -> "新建规则"
  3. 选择"端口" -> "TCP" -> "特定本地端口",输入"5432"
  4. 选择"允许连接"
  5. 选择应用场景(域、专用、公用)
  6. 输入规则名称,如"PostgreSQL 5432"
  7. 点击"完成"

命令行配置

powershell
# 允许特定IP访问5432端口
New-NetFirewallRule -DisplayName "PostgreSQL Allow 192.168.1.0/24" -Direction Inbound -Protocol TCP -LocalPort 5432 -RemoteAddress 192.168.1.0/24 -Action Allow

# 允许所有IP访问5432端口(不推荐)
New-NetFirewallRule -DisplayName "PostgreSQL Allow All" -Direction Inbound -Protocol TCP -LocalPort 5432 -Action Allow

# 查看防火墙规则
Get-NetFirewallRule -DisplayName "PostgreSQL*"

macOS系统防火墙配置

图形界面配置

  1. 打开"系统偏好设置" -> "安全性与隐私" -> "防火墙"
  2. 点击"防火墙选项" -> "添加应用程序"
  3. 选择PostgreSQL的可执行文件(通常位于/Library/PostgreSQL/14/bin/postgres
  4. 点击"添加" -> "好"

命令行配置

bash
# 启用防火墙
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on

# 允许PostgreSQL服务
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /Library/PostgreSQL/14/bin/postgres
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /Library/PostgreSQL/14/bin/postgres

云环境防火墙配置

AWS安全组配置

  1. 登录AWS管理控制台,进入EC2服务
  2. 选择"安全组" -> "创建安全组"
  3. 输入安全组名称和描述
  4. 在"入站规则"中添加:
    • 类型:PostgreSQL
    • 协议:TCP
    • 端口范围:5432
    • 源:选择允许访问的IP范围(如192.168.1.0/24)
  5. 在"出站规则"中保持默认设置(允许所有流量)
  6. 点击"创建安全组"
  7. 将创建的安全组关联到PostgreSQL RDS实例或EC2实例

阿里云安全组配置

  1. 登录阿里云控制台,进入ECS服务
  2. 选择"安全组" -> "创建安全组"
  3. 选择网络类型(专有网络VPC或经典网络)
  4. 输入安全组名称和描述
  5. 在"入方向"中添加规则:
    • 授权策略:允许
    • 协议类型:PostgreSQL(5432)
    • 端口范围:5432/5432
    • 授权对象:允许访问的IP范围(如192.168.1.0/24)
  6. 点击"确定"
  7. 将安全组关联到PostgreSQL RDS实例或ECS实例

腾讯云安全组配置

  1. 登录腾讯云控制台,进入CVM服务
  2. 选择"安全组" -> "新建"
  3. 选择网络环境(VPC或基础网络)
  4. 输入安全组名称和描述
  5. 在"入站规则"中添加:
    • 类型:自定义TCP
    • 端口:5432
    • 源IP:允许访问的IP范围(如192.168.1.0/24)
    • 策略:允许
  6. 点击"确定"
  7. 将安全组关联到PostgreSQL实例或CVM实例

防火墙规则最佳实践

1. 最小权限原则

只允许必要的IP地址和端口访问数据库,避免使用"0.0.0.0/0"开放给所有IP。

bash
# 推荐:只允许特定网段访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="5432" protocol="tcp" accept'

# 不推荐:开放给所有IP
firewall-cmd --permanent --add-port=5432/tcp

2. 限制访问源IP

根据业务需求,严格限制能够访问数据库的IP地址范围。

3. 使用非默认端口

结合端口管理,使用非默认端口可以进一步提高安全性。

4. 定期审查防火墙规则

定期审查和清理不再需要的防火墙规则,避免规则堆积导致安全风险。

5. 防火墙规则分层

在生产环境中,建议使用多层防火墙防护:

  • 外部防火墙:限制公网访问
  • 内部防火墙:限制内部网段访问
  • 主机防火墙:限制主机级别的访问

防火墙规则管理

规则备份与恢复

iptables规则备份与恢复

bash
# 备份规则
iptables-save > /etc/iptables/rules.v4

# 恢复规则
iptables-restore < /etc/iptables/rules.v4

firewalld规则备份与恢复

bash
# 备份规则
firewall-cmd --runtime-to-permanent
cp -r /etc/firewalld /etc/firewalld.backup

# 恢复规则
cp -r /etc/firewalld.backup/* /etc/firewalld/
firewall-cmd --reload

规则审计

定期审计防火墙规则,确保规则符合安全策略:

bash
# 审计iptables规则
iptables -L -n -v

# 审计firewalld规则
firewall-cmd --list-all-zones

防火墙故障排查

1. 检查防火墙状态

bash
# iptables状态
service iptables status

# firewalld状态
systemctl status firewalld

2. 检查端口是否开放

bash
# 使用telnet测试端口连通性
telnet 192.168.1.100 5432

# 使用nc命令测试
nc -zv 192.168.1.100 5432

3. 检查防火墙规则是否生效

bash
# 检查iptables规则
iptables -L -n | grep 5432

# 检查firewalld规则
firewall-cmd --list-ports | grep 5432
firewall-cmd --list-rich-rules | grep 5432

4. 临时关闭防火墙测试

bash
# 临时关闭iptables
service iptables stop

# 临时关闭firewalld
systemctl stop firewalld

注意:在生产环境中,临时关闭防火墙可能带来安全风险,应谨慎操作。

版本差异

PostgreSQL与防火墙版本兼容性

PostgreSQL版本推荐防火墙版本说明
9.x及以下iptables (CentOS 6/7)传统防火墙管理
10-12iptables/firewalld (CentOS 7/8)支持两种防火墙管理方式
13及以上firewalld (CentOS 8/RHEL 8+)推荐使用firewalld进行管理

不同Linux发行版的防火墙差异

发行版默认防火墙工具配置方式
CentOS 6iptablesservice iptables
CentOS 7firewalld (iptables可选)systemctl firewalld
CentOS 8/RHEL 8firewalldsystemctl firewalld
Ubuntu 16.04ufwufw命令
Ubuntu 18.04+ufwufw命令
Debian 9+ufwufw命令

最佳实践总结

  1. 采用最小权限原则:只允许必要的IP地址和端口访问数据库
  2. 结合端口管理:使用非默认端口,进一步提高安全性
  3. 使用多层防火墙:外部防火墙+内部防火墙+主机防火墙
  4. 定期审查规则:定期清理和更新防火墙规则
  5. 备份规则配置:定期备份防火墙规则,以便恢复
  6. 云环境安全组:在云环境中,严格配置安全组规则
  7. 测试规则有效性:配置完成后,测试连接是否正常
  8. 记录规则变更:记录所有防火墙规则的变更,便于审计

通过合理配置和管理防火墙,可以有效保护PostgreSQL数据库免受未授权访问和恶意攻击,提高数据库系统的安全性和可靠性。在实际生产环境中,应根据业务需求和安全策略,制定适合的防火墙配置方案。