Настройка доступа в интернет через NAT Gateway из одного VPC

В этом сценарии описано, как развернуть две виртуальные машины ECS в одном VPC и настроить им доступ в интернет через NAT-шлюз, а также опубликовать в интернет на одной из машин NGINX.

../../_images/schm__recommendations__adv__network-api__one-vpc.svg

Создание VPC — первый шаг при разворачивании инфраструктуры в облаке. По умолчанию виртуальная частная сеть VPC — изолированный сегмент, который недоступен снаружи и из других сетей.

  1. Чтобы начать работу с API, получите токен авторизации. Он нужен для всех API-запросов в этом сценарии.

  2. Чтобы создать VPC, отправьте POST-запрос:

    https : // vpc . ru - moscow - 1. hc . sbercloud . ru / v1 / { project_id } / vpcs

    Где project_id — ID проекта.

    Примечание

    Чтобы узнать ID проекта, в правом верхнем углу консоли Advanced наведите курсор на имя пользователя и выберите My Credentials.

    В этот запрос добавьте заголовок X-Auth-Token и токен авторизации из заголовка X-Subject-Token, полученный на первом шаге.

    ../../_images/recommendations__adv__network-api-header.png

    В этом сценарии по умолчанию во всех запросах будет использоваться этот заголовок и POST-запрос, если не указано иное.

    В теле запроса задайте параметры сети:

    {
    "vpc" :{
    "name" : "vpc-nat-article-1" ,
    "description" : "NAT GW scenario 1" ,
    "cidr" : "192.168.0.0/16"
    }
    }

    Где:

    • name — название сети.

    • description – описание сети.

    • cidr — CIDR-блок сети.

  3. В сети vpc-nat-article-1 создайте две подсети (192.168.1.0/24 и 192.168.2.0/24) из выделенного CIDR-блока:

    https : // vpc . ru - moscow - 1. hc . sbercloud . ru / v1 / { project_id } / subnets

    В теле запроса задайте параметры подсети:

    {
    "subnet" :{
    "name" : "subnet-servers-1" ,
    "description" : "" ,
    "cidr" : "192.168.1.0/24" ,
    "gateway_ip" : "192.168.1.1" ,
    "ipv6_enable" : false ,
    "dhcp_enable" : true ,
    "primary_dns" : "100.125.13.59" ,
    "secondary_dns" : "100.125.65.14" ,
    "dnsList" :[
    "100.125.13.59" ,
    "100.125.65.14"
    ],
    "vpc_id" : "7753e2db-7b2d-4c50-9ba3-aad204415037"
    }
    }

    Где:

    • name — название подсети.

    • vpc_id — ID VPC, в котором нужно создать подсети.

    В качестве DNS использованы внутренние DNS облака, которые позволяют получить доступ к различным внутренним сервисам облака.

    Для создаваемых подсетей IPv6 отключен.

    Одним из преимуществ использования API является большая гибкость в настройке сетевых функций облака, например, в случае создания подсетей можно отключить протокол DHCP и создать подсеть меньшего размера, чем позволяет консоль через веб-интерфейс.

  4. Выделите два публичных адреса Elastic IP для организации SNAT и DNAT на NAT-шлюзе:

    https : // vpc . ru - moscow - 1. hc . sbercloud . ru / v1 / { proroject_id } / publicips

    В теле запроса укажите:

    {
    "publicip" :{
    "type" : "5_bgp" ,
    "ip_version" : 4
    },
    "bandwidth" :{
    "name" : "bandwidth1" ,
    "size" : 5 ,
    "share_type" : "PER"
    }
    }

    Где:

    • type — 5_bgp означает автоматическое восстановление доступности IP-адреса после аварии, а также выбирает оптимальный путь прохождения трафика для источника этого адреса при сбое сетевого соединения.

    • size — полоса пропускания в Мбит/с.

    • share_type — PER означает выделенную полосу трафика под определенный адрес. Значение WHOLE позволяет использовать общую полосу несколькими EIP и не гарантирует постоянную скорость.

  5. В консоли Advanced создайте две виртуальные машины ecs-demo-1 и ecs-demo-2 с ОС Linux в подсетях subnet-servers-1 и subnet-servers-2 соответственно без назначения EIP.

  6. С помощью Postman создайте NAT-шлюз:

    https : // nat . ru - moscow - 1. hc . sbercloud . ru / v2 / { project_id } / nat_gateways

    В теле запроса укажите:

    {
    "nat_gateway" :{
    "name" : "nat-article-1" ,
    "description" : "" ,
    "router_id" : "7753e2db-7b2d-4c50-9ba3-aad204415037" ,
    "internal_network_id" : "e119b08c-b0e4-475d-8168-12b69b987e79" ,
    "spec" : "1" ,
    "enterprise_project_id" : "0"
    }
    }

    Где:

    • name — название NAT-шлюза.

    • router_id — ID VPC, в котором нужно создать NAT-шлюз.

    • internal_network_id — ID подсети для NAT-шлюза.

    • spec — спецификация шлюза. В этом примере 1 — спецификация small, поддерживающая до 10 000 SNAT-трансляций.

  7. Для доступа ВМ в интернет добавьте SNAT-правило:

    https : // nat . ru - moscow - 1. hc . sbercloud . ru / v2 / { project_id } / snat_rules

    В теле запроса укажите:

    {
    "snat_rule" :{
    "nat_gateway_id" : "ca0b7048-3b98-4893-83c4-3dc21f3af6b2" ,
    "network_id" : "e119b08c-b0e4-475d-8168-12b69b987e79" ,
    "source_type" : 0 ,
    "floating_ip_id" : "2c5863da-53ce-4e88-b3b1-cb88b1104160" ,
    "description" : "subnet-servers-1 snat rule"
    }
    }

    Где:

    • nat_gateway_id — ID NAT-шлюза, для которого нужно создать SNAT-правило.

    • network_id — ID подсети NAT-шлюза.

    • floating_ip_id — ID EIP, который будет использоваться для NAT-трансляций.

    • source_type — 0 означает, что в качестве источника для NAT может использоваться как network_id, так и CIDR-блок.

    Добавленное правило дает доступ в интернет ВМ ecs-demo-1 в подсети subnet-servers-1.

  8. Перед открытием доступа к ВМ из интернета создайте для них группы безопасности (sg-demo-1 и sg-demo-2):

    https : // vpc . ru - moscow - 1. hc . sbercloud . ru / v1 / { project_id } / security - groups

    В теле запроса укажите:

    {
    "security_group" :{
    "name" : "sg-demo-1" ,
    "vpc_id" : "7753e2db-7b2d-4c50-9ba3-aad204415037"
    }
    }

    По умолчанию правила в группе разрешают весь входящий трафик от ресурсов из этой же группы. Весь остальной входящий трафик запрещен. Весь исходящий трафик разрешен.

  9. В группе безопасности sg-demo-1 добавьте правило, разрешающее весь входящий трафик на порт 8090:

    https : // vpc . ru - moscow - 1. hc . sbercloud . ru / v1 / { project_id } / security - group - rules

    В теле запроса укажите:

    {
    "security_group_rule" :{
    "direction" : "ingress" ,
    "port_range_min" : "80" ,
    "ethertype" : "IPv4" ,
    "port_range_max" : "80" ,
    "protocol" : "tcp" ,
    "security_group_id" : "9e280b64-8a91-4e27-a402-2164941267b1"
    }
    }

    Где:

    • direction — направление правила. Это правило работает на входящий в сторону ВМ трафик.

    • port_range_min, port_range_max — диапазон портов, на которые распространяется правило.

    • ethertype — версия IP-протоколов (IPv4 или IPv6).

    • protocol — тип транспортного протокола.

    • security_group_id — ID группы, в которую нужно добавить правило.

  10. В группу безопасности sg-demo-1 добавьте правило, разрешающее входящий трафик из группы sg-demo-2, а в группу безопасности sg-demo-2 добавьте правило, разрешающее входящий трафик из группы sg-demo-1.

    В теле запроса укажите:

    {
    "security_group_rule" : {
    "description" : "Allow traffic from sg-demo-2" ,
    "direction" : "ingress" ,
    "ethertype" : "IPv4" ,
    "remote_group_id" : "4be07b86-5588-4c7f-9795-acedfaa9d771" ,
    "security_group_id" : "9e280b64-8a91-4e27-a402-2164941267b1"
    }
    }

    Где remote_group_id — ID группы безопасности, трафик из которой нужно разрешить.

  11. В консоли Advanced прикрепите группы безопасности к соответствующим виртуальным машинам ECS.

  12. Перед созданием DNAT-правила получите port-id виртуальной машины ecs-demo-1 с помощью GET-запроса:

    https : // ecs . ru - moscow - 1. hc . sbercloud . ru / v1 / { project_id } / cloudservers / { ecs_id }

    Заголовок ответа OS-EXT-IPS:port_id содержит необходимую информацию.

  13. Чтобы сделать ВМ ecs-demo-1 доступной из интернета, создайте DNAT-правило для NAT-шлюза:

    https : // nat . ru - moscow - 1. hc . sbercloud . ru / v2 / { project_id } / dnat_rules

    В теле запроса укажите:

    {
    "dnat_rule" :{
    "floating_ip_id" : "65da27ef-161a-4ca4-a6de-7dbe02bb0b42" ,
    "nat_gateway_id" : "c9997f19-217b-44de-b5e2-72fd6f1ad153" ,
    "port_id" : "3b0f9123-d902-43e6-9000-07f93f78dd8e" ,
    "internal_service_port" : 80 ,
    "protocol" : "tcp" ,
    "external_service_port" : 8090 ,
    "description" : "DNAT rule to access web"
    }
    }

    Где:

    • floating_ip_id — ID EIP.

    • nat_gateway_id — ID NAT-шлюза.

    • port_id — port_id виртуальной машины, который был получен ранее.

    • internal_service_port — порт, на котором развернут сервис на машине.

    • protocol — транспортный протокол, для которого выполняется трансляция.

    • external_service_port — внешний порт, по которому производится обращение для получения доступа к сервису.

  14. В консоли Advanced подключитесь к ВМ ecs-demo-1 и проверьте доступность ВМ ecs-demo-2 из подсети subnet-servers-2:

    ping 192 .168.2.240
  15. Проверьте работу SNAT-правила:

    ping cloud.ru

    Правила групп безопасности настроены корректно.

  16. Чтобы проверить работу DNAT-правила и соответствующих правил группы безопасности, установите пакет nginx:

    apt-get install -y nginx
  17. Проверьте статус nginx:

    systemctl status nginx.service
  18. Чтобы проверить доступность ВМ, в браузере перейдите по IP-адресу виртуальной машины с указанием порта 8090:

../../_images/recommendations__adv__network-api.png

Соединение установлено. Правила настроены корректно.

Evolution