我使用 CloudFormation 创建了两个 EC2 实例 - 一个用于 Apache Web 服务器,另一个用于 PostgreSQL DB。由于某种原因,Web 服务器无法通过端口 5432 远程登录到 DB 实例,即使 DB 实例可以通过端口 80 远程登录到 Web 服务器实例。当我从本地主机检查 DB 实例时,它运行良好,并成功远程登录到本地主机 5432。每个实例有两个安全组:
"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" } ]
}
},
配置可能有什么问题?任何帮助都非常感谢。
UPD:我尝试添加以下入站/出站规则,但这样就无法通过 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
您尚未为安全组定义任何出口。默认出口不受限制吗?我很少使用具有 CIDR 范围的 SG。建议您编辑您的问题以在控制台中包含 SG 入口和出口的屏幕截图。
我更喜欢使用安全组间规则来进行 AWS 内部访问,而不是基于 CIDR。所以我会这样做:
- TheWebServerSecurityGroup 允许通过端口 5432 出口到 TheDBSecurityGroup
- TheDBSecurityGroup 允许 TheWebServerSecurityGroup 通过端口 5432 进入
- WebServerSecurityGroup 允许从 0.0.0.0/0 端口 443 进入 - 如果你需要的话我猜是 80
我建议你看一下,而不是允许端口 22会话管理器。它比 SSH 更安全,因为您在登录后可以从 AWS 控制台有效地获取 SSH,但不必打开端口 22。从内存中,服务器打开端口 443 到 VPC 端点(传出),从而中继 SSH。设置起来有点麻烦,但如果您使用 CloudFormation 进行设置,您可以在许多情况下重复使用它。