AWS EC2 实例无法在特定端口上看到另一个实例

AWS EC2 实例无法在特定端口上看到另一个实例

我使用 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 进行设置,您可以在许多情况下重复使用它。

相关内容