You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS EC2 Web实例无法连通PostgreSQL实例5432端口故障排查

EC2 Web服务与PostgreSQL连通异常排查

问题场景

通过CloudFormation部署了同VPC下的两台EC2实例:

  • 实例1:部署Apache Web服务
  • 实例2:部署PostgreSQL数据库

当前连通性异常现象:

  • Web服务器无法telnet连通数据库实例的5432端口
  • 数据库实例可正常telnet连通Web服务器的80端口
  • 数据库实例本地telnet localhost 5432正常,数据库服务进程运行无异常

初始安全组CloudFormation配置如下:

"TheWebServerSecurityGroup" : {
  "Type" : "AWS::EC2::SecurityGroup",
  "Properties" : {
    "GroupDescription" : "Security Group for The web-server instance",
    "SecurityGroupIngress" : [
      { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" },
      { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" }
    ],
    "VpcId" : { "Ref": "TheVPC" },
    "Tags" :  [ { "Key": "Name", "Value":  "TheWebServerSecurityGroup" } ]
  }
},
"TheDBSecurityGroup" : {
  "Type" : "AWS::EC2::SecurityGroup",
  "Properties" : {
    "GroupDescription" : "Security Group for The DB instance",
    "SecurityGroupIngress" : [
      { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0" },
      { "IpProtocol" : "tcp", "FromPort" : "5432", "ToPort" : "5432", "CidrIp" : "0.0.0.0/0" }
    ],
    "VpcId" : { "Ref": "TheVPC" },
    "Tags" :  [ { "Key": "Name", "Value":  "TheDBSecurityGroup" } ]
  }
}

后续尝试添加如下入站/出站规则后出现新问题:实例无法通过yum安装软件包;仅添加入站规则不配置出站时,原连通问题仍存在。

"TheOutboundRule": {
  "Type": "AWS::EC2::SecurityGroupEgress",
  "Properties":{
      "IpProtocol": "tcp",
      "FromPort": 0,
      "ToPort": 5432,
      "DestinationSecurityGroupId": {
          "Fn::GetAtt": [
              "TheDBSecurityGroup",
              "GroupId"
          ]
      },
      "GroupId": {
          "Fn::GetAtt": [
              "TheWebServerSecurityGroup",
              "GroupId"
          ]
      }
  }
},
"TheInboundRule": {
  "Type": "AWS::EC2::SecurityGroupIngress",
  "Properties":{
      "IpProtocol": "tcp",
      "FromPort": 0,
      "ToPort": 5432,
      "SourceSecurityGroupId": {
          "Fn::GetAtt": [
              "TheWebServerSecurityGroup",
              "GroupId"
          ]
      },
      "GroupId": {
          "Fn::GetAtt": [
              "TheDBSecurityGroup",
              "GroupId"
          ]
      }
  }
}

问题根因分析

1. 初始配置下5432端口不通的原因

初始配置中两个安全组都没有自定义出站规则,AWS默认会给新建安全组添加「允许所有协议、所有端口到任意目标」的出站规则,同时DB安全组已经放通了0.0.0.0/0的5432入站,安全组层面本身是通的,问题出在数据库侧配置:

  • PostgreSQL默认postgresql.conf中listen_addresses参数值为localhost,仅监听环回地址的请求,不会响应外部网卡的5432连接,这也是本地telnet localhost正常、外部访问失败的最常见原因。
  • PostgreSQL默认pg_hba.conf客户端认证规则仅放行本地连接,未添加允许Web服务器网段访问的认证规则,外部请求会被直接拒绝。
  • 数据库实例操作系统层面防火墙(firewalld/iptables)未放通5432端口入站,外部请求被系统防火墙拦截。

2. 添加自定义规则后yum无法使用的原因

AWS安全组的规则逻辑是:只要为安全组添加任意一条自定义出站规则,默认的全通出站规则就会被自动删除。
你添加的TheOutboundRule仅允许Web服务器安全组的出站流量访问DB安全组的0-5432端口,完全没有放通访问yum源所需的80/443端口出站流量,自然无法正常安装软件包。

3. 仅添加入站规则仍不通的原因

你添加的DB入站规则本身没有配置错误,如果此时连通性仍异常,还是上述数据库侧配置问题,和安全组无关。

修复建议

  • 安全组配置优化:
    • 非必要不要修改Web服务器安全组的默认全通出站规则,如果要做严格出站管控,必须额外添加规则放通80、443等业务所需端口的出站权限。
    • 数据库安全组的5432端口不要开放0.0.0.0/0权限,存在极大公网攻击风险,直接将入站源设置为Web服务器的安全组ID即可,仅放行Web服务器的访问请求。
  • 数据库侧配置修复:
    1. 编辑PostgreSQL配置文件postgresql.conf,将listen_addresses参数修改为*,保存后退出。
    2. 编辑客户端认证配置文件pg_hba.conf,添加对应Web服务器网段的访问规则,示例:host all all 10.0.0.0/24 scram-sha-256(网段替换为VPC实际私有网段,认证方式替换为实际使用的模式)。
    3. 检查系统防火墙规则,放通5432端口入站,测试阶段可以临时关闭防火墙验证连通性。
    4. 重启PostgreSQL服务让配置生效。

内容的提问来源于stack exchange,提问作者altern

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:33:38