- tocdepth
2
Настройка доступа в интернет через 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": { "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" } }
В сети 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 и создать подсеть меньшего размера, чем позволяет консоль через веб-интерфейс.
Выделите два публичных адреса 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" } }
В консоли 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-трансляций.
Пример успешного ответа на запрос
{ "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": "" } }
Для доступа ВМ в интернет добавьте 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.
Перед открытием доступа к ВМ из интернета создайте для них группы безопасности (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 } ] } }
По умолчанию правила в группе разрешают весь входящий трафик от ресурсов из этой же группы. Весь остальной входящий трафик запрещен. Весь исходящий трафик разрешен.
В группе безопасности 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 } }
В группу безопасности 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 } }
В консоли 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
— внешний порт, по которому производится обращение для получения доступа к сервису.
Пример успешного ответа на запрос
{ "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" } }
В консоли 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:
Соединение установлено. Правила настроены корректно.
для Dev & Test