Из этого краткого руководства вы узнаете, как создать шлюз NAT с помощью портала Azure, Azure CLI, PowerShell, Bicep, шаблона ARM и Terraform. Служба шлюза NAT обеспечивает исходящее подключение для виртуальных машин в Azure.
Создание шлюза NAT.
Перед развертыванием ресурса шлюза NAT и других ресурсов требуется создать группу ресурсов, которая будет содержать развертываемые ресурсы. На следующих шагах вы создадите группу ресурсов, ресурс шлюза NAT и общедоступный IP-адрес. Можно использовать один или несколько ресурсов общедоступного IP-адреса, префиксов общедоступных IP-адресов или обоих.
Сведения о префиксах общедоступного IP-адреса и шлюзе NAT см. в разделе "Управление шлюзом NAT".
В поле поиска в верхней части портала введите сетевой шлюз NAT. В результатах поиска выберите NAT-шлюзы.
Нажмите кнопку +Создать.
В разделе Создание шлюза NAT на вкладке Основные сведения введите или выберите следующие сведения:
Настройки |
Ценность |
Сведения о проекте |
|
Подписка |
Выберите подписку Azure. |
Группа ресурсов |
Выберите Создать новое.
Введите test-rg.
Нажмите кнопку ОК. |
Сведения об инстанции |
|
Имя шлюза NAT |
Ввод шлюза NAT |
Регион |
Выберите Восточный США 2 |
Зона доступности |
Выберите "Нет зоны". |
Время ожидания простоя TCP (минуты) |
Сохраните значение по умолчанию 4. |
Сведения о зонах доступности и шлюзе NAT см. в разделе шлюза NAT и зон доступности.
Откройте вкладку Outbound IP (Исходящий IP-адрес) или нажмите кнопку Next: Outbound IP (Далее: исходящий IP-адрес) внизу страницы.
На вкладке Outbound IP (Исходящий IP-адрес) введите или выберите следующие значения параметров:
Настройки |
Ценность |
Общедоступные IP-адреса |
Выберите Создание общедоступного IP-адреса.
В поле "Имя" введите public-ip-nat.
Нажмите кнопку ОК. |
Перейдите на вкладку Просмотр и создание или нажмите синюю кнопку Просмотр и создание внизу страницы.
Нажмите кнопку "Создать".
Создание виртуальной сети и узла бастиона
Следующая процедура создает виртуальную сеть с ресурсной подсетью, подсетью Azure Bastion и узлом Azure Bastion.
На портале найдите и выберите "Виртуальные сети".
На странице Виртуальные сети выберите команду + Создать.
На вкладке Основные сведения подменю Создать виртуальную сеть введите или выберите нижеприведенную информацию:
Настройки |
Ценность |
Сведения о проекте |
|
Подписка |
Выберите подписку. |
Группа ресурсов |
Выберите test-rg. |
Сведения об инстанции |
|
Имя |
Введите vnet-1. |
Регион |
Выберите регион (США) Восточная часть США 2. |
Нажмите кнопку "Далее ", чтобы перейти на вкладку "Безопасность ".
Выберите "Включить бастион Azure" в разделе "Бастион Azure" на вкладке "Безопасность".
Бастион Azure использует браузер для подключения к виртуальным машинам в виртуальной сети через безопасную оболочку (SSH) или протокол удаленного рабочего стола (RDP) с помощью частных IP-адресов. Виртуальные машины не нуждаются в общедоступных IP-адресах, клиентском программном обеспечении или специальной конфигурации. Дополнительные сведения о Бастионе Azure см. в статье "Бастион Azure"
Замечание
Почасовая тарификация начинается с момента развертывания Бастиона, независимо от объема исходящего трафика. Дополнительные сведения см. в разделе "Цены и номера SKU". Если вы развертываете Бастион в рамках руководства или теста, рекомендуется удалить этот ресурс после завершения работы с ним.
Введите или выберите следующие сведения в Azure Bastion:
Настройки |
Ценность |
Имя хоста Azure Bastion |
Введите бастион. |
Общедоступный IP-адрес Бастиона Azure |
Выберите " Создать общедоступный IP-адрес".
Введите public-ip-bastion в поле "Имя".
Нажмите кнопку ОК. |
Нажмите Далее, чтобы перейти на вкладку IP-адреса.
В поле адресного пространства в подсетях выберите подсеть по умолчанию .
В разделе "Изменить подсеть" введите или выберите следующие сведения:
Настройки |
Ценность |
Назначение подсети |
Оставьте значение «По умолчанию». |
Имя |
Введите subnet-1. |
IPv4 |
|
Диапазон адресов IPv4 |
Оставьте значение по умолчанию 10.0.0.0/16. |
Начальный адрес |
Оставьте значение по умолчанию 10.0.0.0. |
Размер |
Оставьте значение по умолчанию /24(256 адресов). |
Безопасность |
|
Шлюз NAT |
Выберите nat-gateway. |
Нажмите кнопку "Сохранить".
Выберите "Проверка и создание " в нижней части экрана и при прохождении проверки нажмите кнопку "Создать".
Создание тестовой виртуальной машины
Следующая процедура создает тестовую виртуальную машину с именем vm-1 в виртуальной сети.
На портале найдите и выберите "Виртуальные машины".
На виртуальных машинах нажмите кнопку +Создать, а затем виртуальную машину Azure.
На вкладке Основные сведения страницы Создание виртуальной машины введите или выберите следующие значения параметров:
Настройки |
Ценность |
Сведения о проекте |
|
Подписка |
Выберите подписку. |
Группа ресурсов |
Выберите test-rg. |
Сведения об инстанции |
|
Название виртуальной машины |
Введите vm-1. |
Регион |
Выберите регион Восточная часть США 2. |
Параметры доступности |
Выберите "Не требуется избыточность инфраструктуры". |
Тип безопасности |
Оставьте значение по умолчанию "Стандартный". |
Изображение |
Выберите Ubuntu Server 22.04 LTS — x64 Gen2. |
Архитектура виртуальной машины |
Оставьте значение по умолчанию x64. |
Размер |
Выберите размер. |
Учетная запись администратора |
|
Тип аутентификации |
выберите Пароль. |
Имя пользователя |
Введите azureuser. |
Пароль |
Введите пароль. |
Подтверждение пароля |
Повторно введите пароль. |
Правила входящего порта |
|
Общедоступные входящие порты |
Выберите "Нет". |
Выберите вкладку "Сеть" в верхней части страницы.
На вкладке Сеть введите или выберите следующие значения параметров:
Настройки |
Ценность |
Сетевой интерфейс |
|
Виртуальная сеть |
Выберите vnet-1. |
Подсеть |
Выберите субсеть-1 (10.0.0.0/24). |
Общедоступный IP-адрес |
Выберите "Нет". |
Группа безопасности сети NIC |
Выберите Дополнительно. |
Настройка группы безопасности сети |
Выберите Создать новое.
Введите nsg-1 для имени.
Оставьте остальные значения по умолчанию и нажмите кнопку "ОК". |
Оставьте остальные параметры по умолчанию и нажмите кнопку "Просмотр и создание".
Проверьте параметры и выберите Создать.
Замечание
Виртуальные машины в виртуальной сети с узлом бастиона не требуют общедоступных IP-адресов. Бастион предоставляет общедоступный IP-адрес, а виртуальные машины используют частные IP-адреса для обмена данными в сети. Вы можете удалить общедоступные IP-адреса из любых виртуальных машин в размещенных виртуальных сетях бастиона. Дополнительные сведения см. в разделе "Отсообщение общедоступного IP-адреса" с виртуальной машины Azure.
Замечание
Azure предоставляет IP-адрес исходящего доступа по умолчанию для виртуальных машин, которые либо не назначены общедоступным IP-адресом, либо находятся в серверном пуле внутренней подсистемы балансировки нагрузки Azure. Механизм IP-адреса исходящего трафика по умолчанию предоставляет исходящий IP-адрес, который нельзя настроить.
IP-адрес исходящего доступа по умолчанию отключен при возникновении одного из следующих событий:
- Общедоступный IP-адрес назначается виртуальной машине.
- Виртуальная машина размещается в серверном пуле стандартной подсистемы балансировки нагрузки с правилами исходящего трафика или без нее.
- Ресурс Azure NAT Gateway присвоен подсети виртуальной машины.
Виртуальные машины, созданные с помощью масштабируемых наборов виртуальных машин в гибком режиме оркестрации, не имеют исходящего доступа по умолчанию.
Дополнительные сведения об исходящих подключениях в Azure см. в статье об исходящем доступе по умолчанию в Azure и использовании преобразования исходящих сетевых адресов (SNAT) для исходящих подключений.
Создайте группу ресурсов
Создайте группу ресурсов с помощью New-AzResourceGroup. Группа ресурсов Azure является логическим контейнером, в котором происходит развертывание ресурсов Azure и управление ими.
В следующем примере создается группа ресурсов с именем test-rg в расположении eastus2 :
$rsg = @{
Name = 'test-rg'
Location = 'eastus2'
}
New-AzResourceGroup @rsg
Создание шлюза NAT
В этом разделе описано, как создать шлюз NAT и вспомогательные ресурсы.
## Create public IP address for NAT gateway ##
$ip = @{
Name = 'public-ip-nat'
ResourceGroupName = 'test-rg'
Location = 'eastus2'
Sku = 'Standard'
AllocationMethod = 'Static'
Zone = 1,2,3
}
$publicIP = New-AzPublicIpAddress @ip
## Create NAT gateway resource ##
$nat = @{
ResourceGroupName = 'test-rg'
Name = 'nat-gateway'
IdleTimeoutInMinutes = '10'
Sku = 'Standard'
Location = 'eastus2'
PublicIpAddress = $publicIP
}
$natGateway = New-AzNatGateway @nat
## Create subnet config and associate NAT gateway to subnet##
$subnet = @{
Name = 'subnet-1'
AddressPrefix = '10.0.0.0/24'
NatGateway = $natGateway
}
$subnetConfig = New-AzVirtualNetworkSubnetConfig @subnet
## Create Azure Bastion subnet ##
$bastsubnet = @{
Name = 'AzureBastionSubnet'
AddressPrefix = '10.0.1.0/26'
}
$bastsubnetConfig = New-AzVirtualNetworkSubnetConfig @bastsubnet
## Create the virtual network ##
$net = @{
Name = 'vnet-1'
ResourceGroupName = 'test-rg'
Location = 'eastus2'
AddressPrefix = '10.0.0.0/16'
Subnet = $subnetConfig,$bastsubnetConfig
}
$vnet = New-AzVirtualNetwork @net
## Create public IP address for bastion host ##
$ip = @{
Name = 'public-ip'
ResourceGroupName = 'test-rg'
Location = 'eastus2'
Sku = 'Standard'
AllocationMethod = 'Static'
Zone = 1,2,3
}
$publicip = New-AzPublicIpAddress @ip
## Create bastion host ##
$bastion = @{
Name = 'bastion'
ResourceGroupName = 'test-rg'
PublicIpAddressRgName = 'test-rg'
PublicIpAddressName = 'public-ip'
VirtualNetworkRgName = 'test-rg'
VirtualNetworkName = 'vnet-1'
Sku = 'Basic'
}
New-AzBastion @bastion
Узлу бастиона может потребоваться несколько минут для развертывания. Дождитесь развертывания узла бастиона, прежде чем перейти к следующему разделу.
Создать виртуальную машину
В этом разделе описано, как создать виртуальную машину для тестирования шлюза NAT и проверить общедоступный IP-адрес исходящего подключения.
# Set the administrator and password for the VM ##
$cred = Get-Credential
## Place the virtual network into a variable ##
$vnet = Get-AzVirtualNetwork -Name 'vnet-1' -ResourceGroupName 'test-rg'
## Create network interface for virtual machine ##
$nic = @{
Name = "nic-1"
ResourceGroupName = 'test-rg'
Location = 'eastus2'
Subnet = $vnet.Subnets[0]
}
$nicVM = New-AzNetworkInterface @nic
## Create a virtual machine configuration ##
$vmsz = @{
VMName = 'vm-1'
VMSize = 'Standard_DS1_v2'
}
$vmos = @{
ComputerName = 'vm-1'
Credential = $cred
}
$vmimage = @{
PublisherName = 'Canonical'
Offer = '0001-com-ubuntu-server-jammy'
Skus = '22_04-lts-gen2'
Version = 'latest'
}
$vmConfig = New-AzVMConfig @vmsz `
| Set-AzVMOperatingSystem @vmos -Linux `
| Set-AzVMSourceImage @vmimage `
| Add-AzVMNetworkInterface -Id $nicVM.Id
## Create the virtual machine ##
$vm = @{
ResourceGroupName = 'test-rg'
Location = 'eastus2'
VM = $vmConfig
}
New-AzVM @vm
Прежде чем перейти к следующему разделу, дождитесь завершения создания виртуальной машины.
Создайте группу ресурсов
Создайте группу ресурсов с помощью az group create. Группа ресурсов Azure является логическим контейнером, в котором происходит развертывание ресурсов Azure и управление ими.
az group create \
--name test-rg \
--location eastus2
Создание шлюза NAT
В этом разделе описано, как создать шлюз NAT и вспомогательные ресурсы.
Создание общедоступного IP-адреса
Для доступа к Интернету требуется один или несколько общедоступных IP-адресов для шлюза NAT. Чтобы создать ресурс общедоступного IP-адреса, воспользуйтесь командой az network public-ip create.
az network public-ip create \
--resource-group test-rg \
--name public-ip-nat \
--sku Standard \
--allocation-method Static \
--location eastus2 \
--zone 1 2 3
Создание ресурса шлюза NAT
Создайте ресурс шлюза NAT с помощью az network nat gateway create. Шлюз NAT использует общедоступный IP-адрес, созданный на предыдущем шаге. Таймаут простоя установлен на 10 минут.
az network nat gateway create \
--resource-group test-rg \
--name nat-gateway \
--public-ip-addresses public-ip-nat \
--idle-timeout 10
Создание виртуальной сети и подсети
Создайте виртуальную сеть с именем vnet-1 с подсетью с именем subnet-1 с помощью az network vnet create. Диапазон IP-адресов для виртуальной сети: 10.0.0.0/16. Подсеть в виртуальной сети: 10.0.0.0/24.
az network vnet create \
--resource-group test-rg \
--name vnet-1 \
--address-prefix 10.0.0.0/16 \
--subnet-name subnet-1 \
--subnet-prefixes 10.0.0.0/24
Создание подсети Бастиона Azure
Создайте подсеть Бастиона Azure с именем AzureBastionSubnet с помощью az network vnet subnet create:
az network vnet subnet create \
--name AzureBastionSubnet \
--resource-group test-rg \
--vnet-name vnet-1 \
--address-prefix 10.0.1.0/26
Связывание шлюза NAT с подсетью
Свяжите шлюз NAT с подсетью с помощью az network vnet subnet update:
az network vnet subnet update \
--resource-group test-rg \
--vnet-name vnet-1 \
--name subnet-1 \
--nat-gateway nat-gateway
Создание общедоступного IP-адреса для узла Бастиона
Создайте общедоступный IP-адрес узла Бастиона с помощью az network public-ip create:
az network public-ip create \
--resource-group test-rg \
--name public-ip \
--sku Standard \
--location eastus2 \
--zone 1 2 3
Создание Бастионного хоста
Создайте узел Bastion Azure с помощью az network bastion create:
az network bastion create \
--name bastion \
--public-ip-address public-ip \
--resource-group test-rg \
--vnet-name vnet-1 \
--location eastus2
Развертывание узла Бастиона может занять несколько минут. Дождитесь развертывания узла Бастиона, прежде чем перейти к следующему разделу.
Создать виртуальную машину
Создайте виртуальную машину с именем vm-1 , чтобы проверить шлюз NAT и проверить общедоступный IP-адрес исходящего подключения. Используйте az vm create:
az vm create \
--resource-group test-rg \
--name vm-1 \
--image Ubuntu2204 \
--admin-username azureuser \
--authentication-type password \
--public-ip-address "" \
--subnet subnet-1 \
--vnet-name vnet-1
Прежде чем перейти к следующему разделу, дождитесь завершения создания виртуальной машины.
Шаблон Azure Resource Manager — это файл нотации объектов JavaScript (JSON), который определяет инфраструктуру и конфигурацию проекта. В шаблоне используется декларативный синтаксис. Вы описываете предполагаемое развертывание без написания последовательности команд программирования для создания развертывания.
Если среда соответствует предварительным требованиям и вы знакомы с использованием шаблонов ARM, нажмите кнопку Развертывание в Azure. На портале Azure откроется шаблон.
Проверьте шаблон
Шаблон, используемый в этом кратком руководстве, взят из шаблонов быстрого запуска Azure.
Этот шаблон настроен для создания:
Виртуальная машина Ubuntu развертывается в подсети, связанной с ресурсом шлюза NAT.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.25.53.49325",
"templateHash": "15583664434476061565"
}
},
"parameters": {
"vmname": {
"type": "string",
"defaultValue": "vm-1",
"metadata": {
"description": "Name of the virtual machine"
}
},
"vmsize": {
"type": "string",
"defaultValue": "Standard_D2s_v3",
"metadata": {
"description": "Size of the virtual machine"
}
},
"vnetname": {
"type": "string",
"defaultValue": "vnet-1",
"metadata": {
"description": "Name of the virtual network"
}
},
"subnetname": {
"type": "string",
"defaultValue": "subnet-1",
"metadata": {
"description": "Name of the subnet for virtual network"
}
},
"vnetaddressspace": {
"type": "string",
"defaultValue": "10.0.0.0/16",
"metadata": {
"description": "Address space for virtual network"
}
},
"vnetsubnetprefix": {
"type": "string",
"defaultValue": "10.0.0.0/24",
"metadata": {
"description": "Subnet prefix for virtual network"
}
},
"natgatewayname": {
"type": "string",
"defaultValue": "nat-gateway",
"metadata": {
"description": "Name of the NAT gateway"
}
},
"networkinterfacename": {
"type": "string",
"defaultValue": "nic-1",
"metadata": {
"description": "Name of the virtual machine nic"
}
},
"publicipname": {
"type": "string",
"defaultValue": "public-ip-nat",
"metadata": {
"description": "Name of the NAT gateway public IP"
}
},
"nsgname": {
"type": "string",
"defaultValue": "nsg-1",
"metadata": {
"description": "Name of the virtual machine NSG"
}
},
"adminusername": {
"type": "string",
"metadata": {
"description": "Administrator username for virtual machine"
}
},
"adminpassword": {
"type": "securestring",
"metadata": {
"description": "Administrator password for virtual machine"
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Name of resource group"
}
}
},
"resources": [
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2021-05-01",
"name": "[parameters('nsgname')]",
"location": "[parameters('location')]",
"properties": {
"securityRules": [
{
"name": "SSH",
"properties": {
"protocol": "Tcp",
"sourcePortRange": "*",
"destinationPortRange": "22",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*",
"access": "Allow",
"priority": 300,
"direction": "Inbound"
}
}
]
}
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2021-05-01",
"name": "[parameters('publicipname')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard"
},
"properties": {
"publicIPAddressVersion": "IPv4",
"publicIPAllocationMethod": "Static",
"idleTimeoutInMinutes": 4
}
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2021-11-01",
"name": "[parameters('vmname')]",
"location": "[parameters('location')]",
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmsize')]"
},
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "0001-com-ubuntu-server-jammy",
"sku": "22_04-lts-gen2",
"version": "latest"
},
"osDisk": {
"osType": "Linux",
"name": "[format('{0}_disk1', parameters('vmname'))]",
"createOption": "FromImage",
"caching": "ReadWrite",
"managedDisk": {
"storageAccountType": "Premium_LRS"
},
"diskSizeGB": 30
}
},
"osProfile": {
"computerName": "[parameters('vmname')]",
"adminUsername": "[parameters('adminusername')]",
"adminPassword": "[parameters('adminpassword')]",
"linuxConfiguration": {
"disablePasswordAuthentication": false,
"provisionVMAgent": true
},
"allowExtensionOperations": true
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkinterfacename'))]"
}
]
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/networkInterfaces', parameters('networkinterfacename'))]"
]
},
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2021-05-01",
"name": "[parameters('vnetname')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('vnetaddressspace')]"
]
},
"subnets": [
{
"name": "[parameters('subnetname')]",
"properties": {
"addressPrefix": "[parameters('vnetsubnetprefix')]",
"natGateway": {
"id": "[resourceId('Microsoft.Network/natGateways', parameters('natgatewayname'))]"
},
"privateEndpointNetworkPolicies": "Enabled",
"privateLinkServiceNetworkPolicies": "Enabled"
}
}
],
"enableDdosProtection": false,
"enableVmProtection": false
},
"dependsOn": [
"[resourceId('Microsoft.Network/natGateways', parameters('natgatewayname'))]"
]
},
{
"type": "Microsoft.Network/natGateways",
"apiVersion": "2021-05-01",
"name": "[parameters('natgatewayname')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard"
},
"properties": {
"idleTimeoutInMinutes": 4,
"publicIpAddresses": [
{
"id": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicipname'))]"
}
]
},
"dependsOn": [
"[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicipname'))]"
]
},
{
"type": "Microsoft.Network/virtualNetworks/subnets",
"apiVersion": "2021-05-01",
"name": "[format('{0}/{1}', parameters('vnetname'), 'subnet-1')]",
"properties": {
"addressPrefix": "[parameters('vnetsubnetprefix')]",
"natGateway": {
"id": "[resourceId('Microsoft.Network/natGateways', parameters('natgatewayname'))]"
},
"privateEndpointNetworkPolicies": "Enabled",
"privateLinkServiceNetworkPolicies": "Enabled"
},
"dependsOn": [
"[resourceId('Microsoft.Network/natGateways', parameters('natgatewayname'))]",
"[resourceId('Microsoft.Network/virtualNetworks', parameters('vnetname'))]"
]
},
{
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2021-05-01",
"name": "[parameters('networkinterfacename')]",
"location": "[parameters('location')]",
"properties": {
"ipConfigurations": [
{
"name": "ipconfig-1",
"properties": {
"privateIPAddress": "10.0.0.4",
"privateIPAllocationMethod": "Dynamic",
"subnet": {
"id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetname'), 'subnet-1')]"
},
"primary": true,
"privateIPAddressVersion": "IPv4"
}
}
],
"enableAcceleratedNetworking": false,
"enableIPForwarding": false,
"networkSecurityGroup": {
"id": "[resourceId('Microsoft.Network/networkSecurityGroups', parameters('nsgname'))]"
}
},
"dependsOn": [
"[resourceId('Microsoft.Network/networkSecurityGroups', parameters('nsgname'))]",
"[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('vnetname'), 'subnet-1')]"
]
}
],
"outputs": {
"location": {
"type": "string",
"value": "[parameters('location')]"
},
"name": {
"type": "string",
"value": "[parameters('natgatewayname')]"
},
"resourceGroupName": {
"type": "string",
"value": "[resourceGroup().name]"
},
"resourceId": {
"type": "string",
"value": "[resourceId('Microsoft.Network/natGateways', parameters('natgatewayname'))]"
}
}
}
В шаблоне определено девять ресурсов Azure.
Развертывание шаблона
Портал
Проверка развернутых ресурсов
Войдите на портал Azure.
В области слева выберите Группы ресурсов.
Выберите группу ресурсов, созданную при работе с предыдущим разделом. Имя группы ресурсов по умолчанию — myResourceGroupNAT.
Убедитесь, что в группе ресурсов созданы следующие ресурсы:
PowerShell
$location = Read-Host -Prompt "Enter the location (i.e. westcentralus)"
$templateUri = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.network/nat-gateway-1-vm/azuredeploy.json"
$resourceGroupName = "myResourceGroupNAT"
New-AzResourceGroup -Name $resourceGroupName -Location $location
New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateUri $templateUri
Azure CLI (Интерфейс командной строки для Azure)
read -p "Enter the location (i.e. westcentralus): " location
resourceGroupName="myResourceGroupNAT"
templateUri="https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.network/nat-gateway-1-vm/azuredeploy.json"
az group create \
--name $resourceGroupName \
--location $location
az deployment group create \
--resource-group $resourceGroupName \
--template-uri $templateUri
Проверьте файл Bicep
Файл Bicep, используемый в этом быстром старте, взят из шаблонов Azure Quickstart.
Этот файл Bicep настроен для создания:
Виртуальная машина Ubuntu развертывается в подсети, связанной с ресурсом шлюза NAT.
@description('Name of the virtual machine')
param vmname string = 'vm-1'
@description('Size of the virtual machine')
param vmsize string = 'Standard_D2s_v3'
@description('Name of the virtual network')
param vnetname string = 'vnet-1'
@description('Name of the subnet for virtual network')
param subnetname string = 'subnet-1'
@description('Address space for virtual network')
param vnetaddressspace string = '10.0.0.0/16'
@description('Subnet prefix for virtual network')
param vnetsubnetprefix string = '10.0.0.0/24'
@description('Name of the NAT gateway')
param natgatewayname string = 'nat-gateway'
@description('Name of the virtual machine nic')
param networkinterfacename string = 'nic-1'
@description('Name of the NAT gateway public IP')
param publicipname string = 'public-ip-nat'
@description('Name of the virtual machine NSG')
param nsgname string = 'nsg-1'
@description('Administrator username for virtual machine')
param adminusername string
@description('Administrator password for virtual machine')
@secure()
param adminpassword string
@description('Name of resource group')
param location string = resourceGroup().location
resource nsg 'Microsoft.Network/networkSecurityGroups@2021-05-01' = {
name: nsgname
location: location
properties: {
securityRules: [
{
name: 'SSH'
properties: {
protocol: 'Tcp'
sourcePortRange: '*'
destinationPortRange: '22'
sourceAddressPrefix: '*'
destinationAddressPrefix: '*'
access: 'Allow'
priority: 300
direction: 'Inbound'
}
}
]
}
}
resource publicip 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
name: publicipname
location: location
sku: {
name: 'Standard'
}
properties: {
publicIPAddressVersion: 'IPv4'
publicIPAllocationMethod: 'Static'
idleTimeoutInMinutes: 4
}
}
resource vm 'Microsoft.Compute/virtualMachines@2021-11-01' = {
name: vmname
location: location
properties: {
hardwareProfile: {
vmSize: vmsize
}
storageProfile: {
imageReference: {
publisher: 'Canonical'
offer: '0001-com-ubuntu-server-jammy'
sku: '22_04-lts-gen2'
version: 'latest'
}
osDisk: {
osType: 'Linux'
name: '${vmname}_disk1'
createOption: 'FromImage'
caching: 'ReadWrite'
managedDisk: {
storageAccountType: 'Premium_LRS'
}
diskSizeGB: 30
}
}
osProfile: {
computerName: vmname
adminUsername: adminusername
adminPassword: adminpassword
linuxConfiguration: {
disablePasswordAuthentication: false
provisionVMAgent: true
}
allowExtensionOperations: true
}
networkProfile: {
networkInterfaces: [
{
id: networkinterface.id
}
]
}
}
}
resource vnet 'Microsoft.Network/virtualNetworks@2021-05-01' = {
name: vnetname
location: location
properties: {
addressSpace: {
addressPrefixes: [
vnetaddressspace
]
}
subnets: [
{
name: subnetname
properties: {
addressPrefix: vnetsubnetprefix
natGateway: {
id: natgateway.id
}
privateEndpointNetworkPolicies: 'Enabled'
privateLinkServiceNetworkPolicies: 'Enabled'
}
}
]
enableDdosProtection: false
enableVmProtection: false
}
}
resource natgateway 'Microsoft.Network/natGateways@2021-05-01' = {
name: natgatewayname
location: location
sku: {
name: 'Standard'
}
properties: {
idleTimeoutInMinutes: 4
publicIpAddresses: [
{
id: publicip.id
}
]
}
}
resource subnet 'Microsoft.Network/virtualNetworks/subnets@2021-05-01' = {
parent: vnet
name: 'subnet-1'
properties: {
addressPrefix: vnetsubnetprefix
natGateway: {
id: natgateway.id
}
privateEndpointNetworkPolicies: 'Enabled'
privateLinkServiceNetworkPolicies: 'Enabled'
}
}
resource networkinterface 'Microsoft.Network/networkInterfaces@2021-05-01' = {
name: networkinterfacename
location: location
properties: {
ipConfigurations: [
{
name: 'ipconfig-1'
properties: {
privateIPAddress: '10.0.0.4'
privateIPAllocationMethod: 'Dynamic'
subnet: {
id: subnet.id
}
primary: true
privateIPAddressVersion: 'IPv4'
}
}
]
enableAcceleratedNetworking: false
enableIPForwarding: false
networkSecurityGroup: {
id: nsg.id
}
}
}
output location string = location
output name string = natgateway.name
output resourceGroupName string = resourceGroup().name
output resourceId string = natgateway.id
В файле Bicep определено девять ресурсов Azure:
Разверните BICEP-файл
Сохраните файл Bicep с именем main.bicep на локальном компьютере.
Разверните файл Bicep с помощью Azure CLI или Azure PowerShell.
Azure CLI (Интерфейс командной строки для Azure)
az group create --name exampleRG --location eastus
az deployment group create --resource-group exampleRG --template-file main.bicep --parameters adminusername=<admin-name>
PowerShell
New-AzResourceGroup -Name exampleRG -Location eastus
New-AzResourceGroupDeployment -ResourceGroupName exampleRG -TemplateFile ./main.bicep -adminusername "<admin-name>"
Замечание
Замените <admin-name> именем пользователя администратора для виртуальной машины. Вам также будет предложено ввести пароль администратора adminpassword.
После завершения развертывания должно отобразиться сообщение о том, что развертывание успешно выполнено.
Проверка развернутых ресурсов
Используйте портал Azure, Azure CLI или Azure PowerShell для получения списка ресурсов, развернутых в группе ресурсов.
Azure CLI (Интерфейс командной строки для Azure)
az resource list --resource-group exampleRG
PowerShell
Get-AzResource -ResourceGroupName exampleRG
Этот файл Terraform развертывает виртуальную сеть, ресурс шлюза NAT и виртуальную машину Ubuntu. Виртуальная машина Ubuntu развертывается в подсети, связанной с ресурсом шлюза NAT.
Сценарий также создает случайный открытый ключ SSH и связывает его с виртуальной машиной для безопасного доступа. Открытый ключ выводится в конце выполнения скрипта.
Сценарий использует поставщиков Random и AzAPI в дополнение к поставщику AzureRM. Случайный поставщик используется для создания уникального имени группы ресурсов и ключа SSH. Поставщик AzAPI используется для создания открытого ключа SSH.
Как и в случае с открытым ключом, имена созданной группы ресурсов, виртуальной сети, подсети и шлюза NAT печатаются при запуске скрипта.
Terraform позволяет определять, просматривать и развертывать облачную инфраструктуру. Используя Terraform, вы создаёте файлы конфигурации, применяя синтаксис HCL. Синтаксис HCL позволяет указать поставщика облачных служб, таких как Azure, и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации вы создаете план выполнения, который позволяет предварительно просмотреть изменения в инфраструктуре до их внедрения. После того как вы проверите изменения, примените план выполнения для развертывания инфраструктуры.
Создайте каталог для тестирования и выполнения примера кода Terraform и сделайте его текущим каталогом.
Создайте файл с именем main.tf
и вставьте следующий код:
# Resource Group
resource "azurerm_resource_group" "rg" {
location = var.resource_group_location
name = "${random_pet.prefix.id}-rg"
}
# Virtual Network
resource "azurerm_virtual_network" "my_terraform_network" {
name = "${random_pet.prefix.id}-vnet"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
# Subnet 1
resource "azurerm_subnet" "my_terraform_subnet_1" {
name = "subnet-1"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.my_terraform_network.name
address_prefixes = ["10.0.0.0/24"]
}
# Public IP address for NAT gateway
resource "azurerm_public_ip" "my_public_ip" {
name = "public-ip-nat"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Static"
sku = "Standard"
}
# NAT Gateway
resource "azurerm_nat_gateway" "my_nat_gateway" {
name = "nat-gateway"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
# Associate NAT Gateway with Public IP
resource "azurerm_nat_gateway_public_ip_association" "example" {
nat_gateway_id = azurerm_nat_gateway.my_nat_gateway.id
public_ip_address_id = azurerm_public_ip.my_public_ip.id
}
# Associate NAT Gateway with Subnet
resource "azurerm_subnet_nat_gateway_association" "example" {
subnet_id = azurerm_subnet.my_terraform_subnet_1.id
nat_gateway_id = azurerm_nat_gateway.my_nat_gateway.id
}
# Create public IP for virtual machine
resource "azurerm_public_ip" "my_public_ip_vm" {
name = "public-ip-vm"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Static"
sku = "Standard"
}
# Create Network Security Group and rule
resource "azurerm_network_security_group" "my_terraform_nsg" {
name = "nsg-1"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "SSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
# Create network interface
resource "azurerm_network_interface" "my_terraform_nic" {
name = "nic-1"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "my_nic_configuration"
subnet_id = azurerm_subnet.my_terraform_subnet_1.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.my_public_ip_vm.id
}
}
# Connect the security group to the network interface
resource "azurerm_network_interface_security_group_association" "example" {
network_interface_id = azurerm_network_interface.my_terraform_nic.id
network_security_group_id = azurerm_network_security_group.my_terraform_nsg.id
}
# Generate random text for a unique storage account name
resource "random_id" "random_id" {
keepers = {
# Generate a new ID only when a new resource group is defined
resource_group = azurerm_resource_group.rg.name
}
byte_length = 8
}
# Create storage account for boot diagnostics
resource "azurerm_storage_account" "my_storage_account" {
name = "diag${random_id.random_id.hex}"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
account_tier = "Standard"
account_replication_type = "LRS"
}
# Create virtual machine
resource "azurerm_linux_virtual_machine" "my_terraform_vm" {
name = "vm-1"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
network_interface_ids = [azurerm_network_interface.my_terraform_nic.id]
size = "Standard_DS1_v2"
os_disk {
name = "myOsDisk"
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
computer_name = "hostname"
admin_username = var.username
admin_ssh_key {
username = var.username
public_key = azapi_resource_action.ssh_public_key_gen.output.publicKey
}
boot_diagnostics {
storage_account_uri = azurerm_storage_account.my_storage_account.primary_blob_endpoint
}
}
resource "random_pet" "prefix" {
prefix = var.resource_group_name_prefix
length = 1
}
Создайте файл с именем outputs.tf
и вставьте следующий код:
output "resource_group_name" {
description = "The name of the created resource group."
value = azurerm_resource_group.rg.name
}
output "virtual_network_name" {
description = "The name of the created virtual network."
value = azurerm_virtual_network.my_terraform_network.name
}
output "subnet_name_1" {
description = "The name of the created subnet 1."
value = azurerm_subnet.my_terraform_subnet_1.name
}
output "nat_gateway"{
description = "The name of the created NAT gateway."
value = azurerm_nat_gateway.my_nat_gateway.id
}
Создайте файл с именем providers.tf
и вставьте следующий код:
terraform {
required_providers {
azapi = {
source = "azure/azapi"
version = "~>1.5"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~>3.0"
}
random = {
source = "hashicorp/random"
version = "~>3.0"
}
}
}
provider "azurerm" {
features {}
}
Создайте файл с именем ssh.tf
и вставьте следующий код:
resource "random_pet" "ssh_key_name" {
prefix = "ssh"
separator = ""
}
resource "azapi_resource_action" "ssh_public_key_gen" {
type = "Microsoft.Compute/sshPublicKeys@2022-11-01"
resource_id = azapi_resource.ssh_public_key.id
action = "generateKeyPair"
method = "POST"
response_export_values = ["publicKey", "privateKey"]
}
resource "azapi_resource" "ssh_public_key" {
type = "Microsoft.Compute/sshPublicKeys@2022-11-01"
name = random_pet.ssh_key_name.id
location = azurerm_resource_group.rg.location
parent_id = azurerm_resource_group.rg.id
}
output "key_data" {
value = azapi_resource_action.ssh_public_key_gen.output.publicKey
}
Создайте файл с именем variables.tf
и вставьте следующий код:
variable "resource_group_location" {
type = string
default = "eastus"
description = "Location of the resource group."
}
variable "resource_group_name_prefix" {
type = string
default = "rg"
description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription."
}
variable "username" {
type = string
description = "The username for the local account that will be created on the new VM."
default = "azureuser"
}
Запустите terraform init, чтобы инициализировать развертывание Terraform. Эта команда загружает поставщика Azure, необходимого для управления вашими ресурсами в Azure.
terraform init -upgrade
Основные моменты:
- Параметр
-upgrade
обновляет необходимые плагины провайдера до самой последней версии, которая соответствует ограничениям версии конфигурации.
Запустите команду terraform plan, чтобы создать план выполнения.
terraform plan -out main.tfplan
Основные моменты:
- Команда
terraform plan
создает план выполнения, но не выполняет его. Вместо этого он определяет, какие действия необходимы для создания конфигурации, указанной в ваших конфигурационных файлах. Данный шаблон позволяет вам убедиться, что план выполнения соответствует вашим ожиданиям, прежде чем вносить какие-либо изменения в реальные ресурсы.
- Необязательный параметр
-out
позволяет указать выходной файл для плана. Использование параметра -out
обеспечивает, что план, который вы просмотрели, будет применен точно в таком виде.
Выполните команду terraform apply, чтобы применить план выполнения к вашей облачной инфраструктуре.
terraform apply main.tfplan
Основные моменты:
- Пример команды
terraform apply
предполагает, что вы ранее выполнили команду terraform plan -out main.tfplan
.
- Если вы указали другое имя файла для параметра
-out
, используйте то же имя файла при вызове terraform apply
.
- Если вы не использовали параметр
-out
, вызовите terraform apply
без параметров.
Проверка результатов
Azure CLI (Интерфейс командной строки для Azure)
Получите имя группы ресурсов Azure.
resource_group_name=$(terraform output -raw resource_group_name)
Получите идентификатор шлюза NAT.
nat_gateway=$(terraform output -raw nat_gateway)
Запустите команду az network nat gateway show, чтобы отобразить подробную информацию о шлюзе NAT.
az network nat gateway show \
--resource-group $resource_group_name \
--ids $nat_gateway
PowerShell
Получите имя группы ресурсов Azure.
$resource_group_name=$(terraform output -raw resource_group_name)
Получите идентификатор шлюза NAT.
$nat_gateway=$(terraform output -raw nat_gateway)
Запустите Get-AzNatGateway, чтобы отобразить сведения о шлюзе NAT.
$nat = @{
Name = $nat_gateway
ResourceGroupName = $resource_group_name
}
Get-AzNatGateway @nat
В этом разделе описано, как протестировать шлюз NAT. Сначала вы обнаружите общедоступный IP-адрес шлюза NAT. Затем подключитесь к тестовой виртуальной машине и проверьте исходящее подключение через шлюз NAT.
Дополнительные сведения о шлюзе Azure NAT см. в следующем разделе: