Экземпляр AWS EC2 не видит другой экземпляр на определенном порту

Экземпляр AWS EC2 не видит другой экземпляр на определенном порту

Я создал два экземпляра EC2 с помощью CloudFormation — один для веб-сервера Apache, другой для базы данных PostgreSQL. По какой-то причине веб-сервер не может подключиться по telnet к экземпляру базы данных на порту 5432, хотя экземпляр базы данных может подключиться по telnet к экземпляру веб-сервера на порту 80. Когда я проверяю экземпляр базы данных с локального хоста, он работает нормально и успешно подключается по telnet к локальному хосту 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

Вы не определили выход для своих групп безопасности. Неограничен ли выход по умолчанию? Я нечасто использую SG с диапазонами CIDR. Предлагаю вам отредактировать свой вопрос, включив в консоль скриншот входа и выхода SG.

Я предпочитаю использовать правила групп безопасности для доступа внутри AWS, а не на основе CIDR. Поэтому я бы сделал следующее:

  • TheWebServerSecurityGroup разрешает выход в TheDBSecurityGroup через порт 5432
  • TheDBSecurityGroup разрешает вход из TheWebServerSecurityGroup на порт 5432
  • TheWebServerSecurityGroup разрешает входящий трафик с 0.0.0.0/0 на порт 443 - и, я полагаю, 80, если вам это нужно

Вместо того, чтобы разрешать порт 22, я предлагаю вам взглянуть наМенеджер сеанса. Он более безопасен, чем SSH, поскольку вы фактически получаете SSH из консоли AWS после входа в систему, но вам не нужно открывать порт 22. По памяти, сервер открывает порт 443 для конечной точки VPC (исходящий), которая ретранслирует входящий SSH. Его немного сложно настроить, но если вы сделаете это с помощью CloudFormation один раз, вы сможете использовать его повторно во многих ситуациях.

Связанный контент