tocdepth

2

Настройка доступа в интернет через 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-блок сети.

    Пример успешного ответа на запрос

    {
        "vpc": {
            "id": "7753e2db-7b2d-4c50-9ba3-aad204415037",
            "name": "vpc-nat-article-1",
            "description": "NAT GW scenario 1",
            "cidr": "192.168.0.0/16",
            "status": "CREATING",
            "routes": [],
            "enterprise_project_id": "0",
            "tenant_id": "project_id",
            "created_at": "2024-03-24T05:26:18",
            "updated_at": "2024-03-24T05:26:18"
        }
    }
    
  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 отключен.

    Пример успешного ответа на запрос

    {
        "subnet": {
            "id": "e119b08c-b0e4-475d-8168-12b69b987e79",
            "name": "subnet-servers-1",
            "description": "",
            "cidr": "192.168.1.0/24",
            "dnsList": [
                "100.125.13.59",
                "100.125.65.14"
            ],
            "status": "UNKNOWN",
            "vpc_id": "7753e2db-7b2d-4c50-9ba3-aad204415037",
            "ipv6_enable": false,
            "gateway_ip": "192.168.1.1",
            "dhcp_enable": true,
            "primary_dns": "100.125.13.59",
            "secondary_dns": "100.125.65.14",
            "neutron_network_id": "e119b08c-b0e4-475d-8168-12b69b987e79",
            "neutron_subnet_id": "549e01d1-b596-4c2e-8f9c-a953602d110c",
            "tenant_id": "10fa547da18027332f4cc0136b2faa85",
            "created_at": "2024-03-24T17:43:52",
            "updated_at": "2024-03-24T17:43:52"
        }
    }
    

    Одним из преимуществ использования 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 и не гарантирует постоянную скорость.

    Пример успешного ответа на запрос

    {
        "publicip": {
            "id": "2c5863da-53ce-4e88-b3b1-cb88b1104160",
            "type": "5_bgp",
            "public_ip_address": "87.242.121.169",
            "status": "PENDING_CREATE",
            "tenant_id": "project_id",
            "create_time": "2024-03-24 20:24:02",
            "bandwidth_size": 0,
            "enterprise_project_id": "0",
            "ip_version": 4,
            "public_border_group": "center"
        }
    }
    
  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-трансляций.

    Пример успешного ответа на запрос

    {
        "nat_gateway": {
            "id": "ca0b7048-3b98-4893-83c4-3dc21f3af6b2",
            "name": "nat-article-1",
            "description": "",
            "router_id": "7753e2db-7b2d-4c50-9ba3-aad204415037",
            "internal_network_id": "e119b08c-b0e4-475d-8168-12b69b987e79",
            "status": "PENDING_CREATE",
            "spec": "1",
            "tenant_id": "project_id",
            "created_at": "2024-03-24 21:57:02.598739",
            "admin_state_up": true,
            "enterprise_project_id": "0",
            "dnat_rules_limit": 200,
            "snat_rule_public_ip_limit": 20,
            "billing_info": ""
        }
    }
    
  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-блок.

    Пример успешного ответа на запрос

    {
        "snat_rule": {
            "id": "5cff9732-6b7e-4c8a-895d-8864116a870b",
            "nat_gateway_id": "ca0b7048-3b98-4893-83c4-3dc21f3af6b2",
            "network_id": "e119b08c-b0e4-475d-8168-12b69b987e79",
            "floating_ip_id": "2c5863da-53ce-4e88-b3b1-cb88b1104160",
            "floating_ip_address": "87.242.121.169",
            "status": "PENDING_CREATE",
            "created_at": "2024-03-25 08:05:37.049077",
            "tenant_id": "project_id",
            "admin_state_up": true,
            "source_type": 0,
            "description": "subnet-servers-1 snat rule"
        }
    }
    

    Добавленное правило дает доступ в интернет ВМ 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"
       }
    }
    

    Пример успешного ответа на запрос

    {
        "security_group": {
            "id": "9e280b64-8a91-4e27-a402-2164941267b1",
            "name": "sg-demo-1",
            "vpc_id": "7753e2db-7b2d-4c50-9ba3-aad204415037",
            "description": "7753e2db-7b2d-4c50-9ba3-aad204415037",
            "enterprise_project_id": "0",
            "security_group_rules": [
                {
                    "description": null,
                    "direction": "egress",
                    "ethertype": "IPv4",
                    "id": "508e5c6a-2972-45a9-b4bb-547277087bad",
                    "port_range_max": null,
                    "port_range_min": null,
                    "protocol": null,
                    "remote_group_id": null,
                    "remote_ip_prefix": null,
                    "security_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
                    "tenant_id": "10fa547da18027332f4cc0136b2faa85",
                    "remote_address_group_id": null
                },
                {
                    "description": null,
                    "direction": "egress",
                    "ethertype": "IPv6",
                    "id": "e2f13c5e-6878-47bb-b1ff-1e4b579b3fb6",
                    "port_range_max": null,
                    "port_range_min": null,
                    "protocol": null,
                    "remote_group_id": null,
                    "remote_ip_prefix": null,
                    "security_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
                    "tenant_id": "10fa547da18027332f4cc0136b2faa85",
                    "remote_address_group_id": null
                },
                {
                    "description": "",
                    "direction": "ingress",
                    "ethertype": "IPv4",
                    "id": "b964d4af-955d-45f7-9809-3a9b892c9dc8",
                    "port_range_max": null,
                    "port_range_min": null,
                    "protocol": null,
                    "remote_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
                    "remote_ip_prefix": null,
                    "security_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
                    "tenant_id": "10fa547da18027332f4cc0136b2faa85",
                    "remote_address_group_id": null
                },
                {
                    "description": "",
                    "direction": "ingress",
                    "ethertype": "IPv6",
                    "id": "55d84533-2aa6-4fbe-aff9-176be040588e",
                    "port_range_max": null,
                    "port_range_min": null,
                    "protocol": null,
                    "remote_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
                    "remote_ip_prefix": null,
                    "security_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
                    "tenant_id": "10fa547da18027332f4cc0136b2faa85",
                    "remote_address_group_id": null
                }
            ]
        }
    }
    

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

  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 группы, в которую нужно добавить правило.

    Пример успешного ответа на запрос

    {
        "security_group_rule": {
            "description": "",
            "direction": "ingress",
            "ethertype": "IPv4",
            "id": "6f4cda90-7932-4f4d-bd05-691135262e69",
            "port_range_max": 80,
            "port_range_min": 80,
            "protocol": "tcp",
            "remote_group_id": null,
            "remote_ip_prefix": null,
            "tenant_id": "10fa547da18027332f4cc0136b2faa85",
            "security_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
            "remote_address_group_id": null
        }
    }
    
  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 группы безопасности, трафик из которой нужно разрешить.

    Пример успешного ответа на запрос

    {
        "security_group_rule": {
            "description": "Allow traffic from sg-demo-2",
            "direction": "ingress",
            "ethertype": "IPv4",
            "id": "6a1af107-1da7-4b68-800c-d326a60d0ca4",
            "port_range_max": null,
            "port_range_min": null,
            "protocol": null,
            "remote_group_id": "4be07b86-5588-4c7f-9795-acedfaa9d771",
            "remote_ip_prefix": null,
            "tenant_id": "10fa547da18027332f4cc0136b2faa85",
            "security_group_id": "9e280b64-8a91-4e27-a402-2164941267b1",
            "remote_address_group_id": null
        }
    }
    
  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 — внешний порт, по которому производится обращение для получения доступа к сервису.

    Пример успешного ответа на запрос

    {
        "dnat_rule": {
            "id": "7c421d7e-1af0-4ee1-9b28-05c25d53949d",
            "floating_ip_address": "45.9.27.171",
            "tenant_id": "10fa547da18027332f4cc0136b2faa85",
            "nat_gateway_id": "c9997f19-217b-44de-b5e2-72fd6f1ad153",
            "protocol": "tcp",
            "port_id": "3b0f9123-d902-43e6-9000-07f93f78dd8e",
            "private_ip": "",
            "internal_service_port": 80,
            "floating_ip_id": "65da27ef-161a-4ca4-a6de-7dbe02bb0b42",
            "external_service_port": 8090,
            "created_at": "2024-03-31 16:55:27.727554",
            "status": "PENDING_CREATE",
            "admin_state_up": true,
            "description": "DNAT rule to access web"
        }
    }
    
  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 free tier
для Dev & Test
Получить