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服务器的访问请求。
- 数据库侧配置修复:
- 编辑PostgreSQL配置文件
postgresql.conf,将listen_addresses参数修改为*,保存后退出。 - 编辑客户端认证配置文件
pg_hba.conf,添加对应Web服务器网段的访问规则,示例:host all all 10.0.0.0/24 scram-sha-256(网段替换为VPC实际私有网段,认证方式替换为实际使用的模式)。 - 检查系统防火墙规则,放通5432端口入站,测试阶段可以临时关闭防火墙验证连通性。
- 重启PostgreSQL服务让配置生效。
- 编辑PostgreSQL配置文件
内容的提问来源于stack exchange,提问作者altern
相关产品推荐
相关产品推荐

