Настройка доступа в интернет через NAT Gateway из одного VPC
В этом сценарии описано, как развернуть две виртуальные машины ECS в одном VPC и настроить им доступ в интернет через NAT-шлюз, а также опубликовать в интернет на одной из машин NGINX.
Создание VPC — первый шаг при разворачивании инфраструктуры в облаке. По умолчанию виртуальная частная сеть VPC — изолированный сегмент, который недоступен снаружи и из других сетей.
Чтобы начать работу с API, получите токен авторизации. Он нужен для всех API-запросов в этом сценарии.
Чтобы создать 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, полученный на первом шаге.
В этом сценарии по умолчанию во всех запросах будет использоваться этот заголовок и POST-запрос, если не указано иное.
В теле запроса задайте параметры сети:
{"vpc":{"name":"vpc-nat-article-1","description":"NAT GW scenario 1","cidr":"192.168.0.0/16"}}Где:
name — название сети.
description – описание сети.
cidr — CIDR-блок сети.
Пример успешного ответа на запросВ сети 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 и создать подсеть меньшего размера, чем позволяет консоль через веб-интерфейс.
Выделите два публичных адреса 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 и не гарантирует постоянную скорость.
Пример успешного ответа на запросВ консоли Advanced создайте две виртуальные машины ecs-demo-1 и ecs-demo-2 с ОС Linux в подсетях subnet-servers-1 и subnet-servers-2 соответственно без назначения EIP.
С помощью 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-трансляций.
Пример успешного ответа на запросДля доступа ВМ в интернет добавьте 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.
Перед открытием доступа к ВМ из интернета создайте для них группы безопасности (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"}}Пример успешного ответа на запросПо умолчанию правила в группе разрешают весь входящий трафик от ресурсов из этой же группы. Весь остальной входящий трафик запрещен. Весь исходящий трафик разрешен.
В группе безопасности 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 группы, в которую нужно добавить правило.
Пример успешного ответа на запросВ группу безопасности 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 группы безопасности, трафик из которой нужно разрешить.
Пример успешного ответа на запросВ консоли Advanced прикрепите группы безопасности к соответствующим виртуальным машинам ECS.
Перед созданием 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 содержит необходимую информацию.
Чтобы сделать ВМ 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 — внешний порт, по которому производится обращение для получения доступа к сервису.
Пример успешного ответа на запросВ консоли Advanced подключитесь к ВМ ecs-demo-1 и проверьте доступность ВМ ecs-demo-2 из подсети subnet-servers-2:
ping 192.168.2.240Проверьте работу SNAT-правила:
ping cloud.ruПравила групп безопасности настроены корректно.
Чтобы проверить работу DNAT-правила и соответствующих правил группы безопасности, установите пакет nginx:
apt-get install -y nginxПроверьте статус nginx:
systemctl status nginx.serviceЧтобы проверить доступность ВМ, в браузере перейдите по IP-адресу виртуальной машины с указанием порта 8090:

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