Маршрутизация сетевого трафика с помощью таблицы маршрутов при использовании PowerShell
По умолчанию Azure автоматически маршрутизирует трафик между всеми подсетями в виртуальной сети. Для переопределения маршрутизации Azure по умолчанию можно создать собственные маршруты. Возможность создания настраиваемых маршрутов полезна, если, к примеру, требуется маршрутизировать трафик между подсетями через виртуальный сетевой модуль. Вы узнаете, как выполнять следующие задачи:
- Создание таблицы маршрутов
- Создание маршрута
- Создание виртуальной сети с несколькими подсетями
- Связывание таблицы маршрутов с подсетью
- создание виртуального сетевого модуля, который перенаправляет трафик;
- развертывание виртуальных машин в разных подсетях;
- направление трафика из одной подсети в другую через виртуальный сетевой модуль.
Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.
Azure Cloud Shell
В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.
Начало работы с Azure Cloud Shell
Вариант | Пример и ссылка |
---|---|
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. | |
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. | |
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. |
Чтобы использовать Azure Cloud Shell, выполните следующие действия:
Запустите Cloud Shell.
Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.
Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.
Нажмите клавишу ВВОД, чтобы запустить код или команду.
Чтобы установить и использовать PowerShell локально для работы с этой статьей, вам понадобится модуль Azure PowerShell 1.0.0 или более поздней версии. Выполните командлет Get-Module -ListAvailable Az
, чтобы узнать установленную версию. Если вам необходимо выполнить обновление, ознакомьтесь со статьей, посвященной установке модуля Azure PowerShell. Если модуль PowerShell запущен локально, необходимо также выполнить командлет Connect-AzAccount
, чтобы создать подключение к Azure.
Создание таблицы маршрутов
Прежде чем создать таблицу маршрутов, создайте группу ресурсов с помощью командлета New-AzResourceGroup. В следующем примере создается группа ресурсов с именем myResourceGroup для всех ресурсов, создаваемых в этой статье.
New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS
Создайте таблицу маршрутов с помощью командлета New-AzRouteTable. В следующем примере создается таблица маршрутов с именем myRouteTablePublic.
$routeTablePublic = New-AzRouteTable `
-Name 'myRouteTablePublic' `
-ResourceGroupName myResourceGroup `
-location EastUS
Создание маршрута
Создайте маршрут путем извлечения объекта таблицы маршрутов с помощью командлета Get-AzRouteTable, создайте маршрут с помощью командлета Add-AzRouteConfig, а затем запишите конфигурацию маршрута в таблицу маршрутов с помощью командлета Set-AzRouteTable.
Get-AzRouteTable `
-ResourceGroupName "myResourceGroup" `
-Name "myRouteTablePublic" `
| Add-AzRouteConfig `
-Name "ToPrivateSubnet" `
-AddressPrefix 10.0.1.0/24 `
-NextHopType "VirtualAppliance" `
-NextHopIpAddress 10.0.2.4 `
| Set-AzRouteTable
Связывание таблицы маршрутов с подсетью
Чтобы связать таблицу маршрутов с подсетью, необходимо создать виртуальную сеть и подсеть. Создайте виртуальную сеть с помощью командлета New-AzVirtualNetwork. В следующем примере создается виртуальная сеть с именем myVirtualNetwork и префиксом адреса 10.0.0.0/16.
$virtualNetwork = New-AzVirtualNetwork `
-ResourceGroupName myResourceGroup `
-Location EastUS `
-Name myVirtualNetwork `
-AddressPrefix 10.0.0.0/16
Создайте три подсети путем создания трех конфигураций подсети с помощью командлета New-AzVirtualNetworkSubnetConfig. В следующем примере создается три конфигурации подсети: для общей (Public), частной (Private)подсети и подсети DMZ.
$subnetConfigPublic = Add-AzVirtualNetworkSubnetConfig `
-Name Public `
-AddressPrefix 10.0.0.0/24 `
-VirtualNetwork $virtualNetwork
$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig `
-Name Private `
-AddressPrefix 10.0.1.0/24 `
-VirtualNetwork $virtualNetwork
$subnetConfigDmz = Add-AzVirtualNetworkSubnetConfig `
-Name DMZ `
-AddressPrefix 10.0.2.0/24 `
-VirtualNetwork $virtualNetwork
Запишите конфигурацию подсети в виртуальную сеть с помощью командлета Set-AzVirtualNetwork, который создает подсети в виртуальной сети:
$virtualNetwork | Set-AzVirtualNetwork
Свяжите таблицу маршрутов myRouteTablePublic с общей подсетью с помощью командлета Set-AzVirtualNetworkSubnetConfig, а затем запишите конфигурацию подсети в виртуальную сеть с помощью командлета Set-AzVirtualNetwork.
Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $virtualNetwork `
-Name 'Public' `
-AddressPrefix 10.0.0.0/24 `
-RouteTable $myRouteTablePublic | `
Set-AzVirtualNetwork
Создание виртуального сетевого модуля
Виртуальный сетевой модуль представляет собой виртуальную машину, которая выполняет сетевые функции, такие как маршрутизация, защита брандмауэром или оптимизация доступа к глобальной сети.
Перед созданием виртуальной машины создайте сетевой интерфейс.
Создание сетевого интерфейса
Перед созданием сетевого интерфейса необходимо получить идентификатор виртуальной сети с помощью командлета Get-AzVirtualNetwork, а затем — идентификатор подсети с помощью командлета Get-AzVirtualNetworkSubnetConfig. Создайте сетевой интерфейс с помощью командлета New-AzNetworkInterface в подсети DMZ с включенной IP-пересылкой:
# Retrieve the virtual network object into a variable.
$virtualNetwork=Get-AzVirtualNetwork `
-Name myVirtualNetwork `
-ResourceGroupName myResourceGroup
# Retrieve the subnet configuration into a variable.
$subnetConfigDmz = Get-AzVirtualNetworkSubnetConfig `
-Name DMZ `
-VirtualNetwork $virtualNetwork
# Create the network interface.
$nic = New-AzNetworkInterface `
-ResourceGroupName myResourceGroup `
-Location EastUS `
-Name 'myVmNva' `
-SubnetId $subnetConfigDmz.Id `
-EnableIPForwarding
создание виртуальной машины;
Чтобы создать виртуальную машину и подключить к ней имеющийся сетевой интерфейс, сначала необходимо создать конфигурацию виртуальной машины с помощью командлета New-AzVMConfig. Конфигурация включает в себя сетевой интерфейс, созданный на предыдущем шаге. Когда появится запрос на ввод имени пользователя и пароля, выберите те, которые будут использоваться для входа в виртуальную машину.
# Create a credential object.
$cred = Get-Credential -Message "Enter a username and password for the VM."
# Create a VM configuration.
$vmConfig = New-AzVMConfig `
-VMName 'myVmNva' `
-VMSize Standard_DS2 | `
Set-AzVMOperatingSystem -Windows `
-ComputerName 'myVmNva' `
-Credential $cred | `
Set-AzVMSourceImage `
-PublisherName MicrosoftWindowsServer `
-Offer WindowsServer `
-Skus 2016-Datacenter `
-Version latest | `
Add-AzVMNetworkInterface -Id $nic.Id
Создайте виртуальную машину с созданной ранее конфигурацией с помощью командлета New-AzVM. В следующем примере создается виртуальная машина с именем myVmNva.
$vmNva = New-AzVM `
-ResourceGroupName myResourceGroup `
-Location EastUS `
-VM $vmConfig `
-AsJob
Чтобы можно было перейти к следующему шагу, параметр -AsJob
позволяет создать виртуальную машину в фоновом режиме.
Создание виртуальных машин
Создайте две виртуальные машины в виртуальной сети, чтобы в дальнейшем можно было проверить, что трафик из подсети Public направляется в подсеть Private через сетевой виртуальный модуль.
Создайте виртуальную машину в подсети Public с помощью командлета New-AzVM. В следующем примере создается виртуальная машина с именем myVmPublic в подсети Public в виртуальной сети myVirtualNetwork.
New-AzVm `
-ResourceGroupName "myResourceGroup" `
-Location "East US" `
-VirtualNetworkName "myVirtualNetwork" `
-SubnetName "Public" `
-ImageName "Win2016Datacenter" `
-Name "myVmPublic" `
-AsJob
Создайте виртуальную машину в подсети Private.
New-AzVm `
-ResourceGroupName "myResourceGroup" `
-Location "East US" `
-VirtualNetworkName "myVirtualNetwork" `
-SubnetName "Private" `
-ImageName "Win2016Datacenter" `
-Name "myVmPrivate"
Создание виртуальной машины занимает несколько минут. Не переходите к следующему шагу, пока не создастся виртуальная машина и Azure не вернет выходные данные в PowerShell.
Перенаправление трафика через виртуальный сетевой модуль
Чтобы получить общедоступный IP-адрес виртуальной машины myVmPrivate, выполните командлет Get-AzPublicIpAddress. Приведенный ниже пример возвращает общедоступный IP-адрес виртуальной машины myVmPrivate:
Get-AzPublicIpAddress `
-Name myVmPrivate `
-ResourceGroupName myResourceGroup `
| Select IpAddress
Для создания сеанса удаленного рабочего стола с виртуальной машиной myVmPrivate на локальном компьютере выполните следующую команду. Замените <publicIpAddress>
IP-адресом, полученным от предыдущей команды.
mstsc /v:<publicIpAddress>
Откройте загруженный RDP-файл. При появлении запроса выберите Подключиться.
Введите имя пользователя и пароль, которые вы указали при создании виртуальной машины (возможно, для этого придется выбрать Дополнительные варианты и Использовать другую учетную запись). Затем нажмите кнопку ОК. При входе в систему может появиться предупреждение о сертификате. Чтобы продолжить процесс подключения, выберите Да.
Для проверки маршрутизации позже будет использоваться команда tracert.exe
. Tracert использует протокол ICMP, который запрещен в брандмауэре Windows. Разрешите протокол ICMP в брандмауэре Windows, выполнив в интерфейсе PowerShell на виртуальной машине myVmPrivate следующую команду:
New-NetFirewallRule -DisplayName "Allow ICMPv4-In" -Protocol ICMPv4
Хотя в этой статье и используется команда трассировки для тестирования маршрутизации, мы рекомендуем не пропускать входящий трафик по протоколу ICMP через брандмауэр Windows в рабочей среде.
Вы уже включили в Azure IP-пересылку для сетевого интерфейса виртуальной машины, выполнив инструкции из раздела "Включение IP-пересылки". Операционная система или приложение, работающие на виртуальной машине, также должны уметь перенаправлять сетевой трафик. Включите IP-пересылку в операционной системе на myVmNva.
Из командной строки на виртуальной машине myVmPrivate подключитесь к виртуальной машине myVmNva по протоколу удаленного рабочего стола:
mstsc /v:myvmnva
Чтобы включить IP-пересылку в операционной системе, введите следующую команду PowerShell на виртуальной машине myVmNva:
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -Name IpEnableRouter -Value 1
Перезапустите виртуальную машину myVmNva. При этом автоматически завершится сеанс удаленного рабочего стола.
Когда виртуальная машина myVmNva перезапустится, создайте сеанс удаленного рабочего стола для виртуальной машины myVmPublic, сохраняя подключение к виртуальной машине myVmPrivate:
mstsc /v:myVmPublic
Разрешите протокол ICMP в брандмауэре Windows с помощью следующей команды PowerShell на виртуальной машине myVmPublic:
New-NetFirewallRule –DisplayName "Allow ICMPv4-In" –Protocol ICMPv4
Протестируйте маршрутизацию сетевого трафика к виртуальной машине myVmPrivate от виртуальной машины myVmPublic, выполнив следующую команду PowerShell на виртуальной машине myVmPublic:
tracert myVmPrivate
Ответ будет выглядеть примерно так:
Tracing route to myVmPrivate.vpgub4nqnocezhjgurw44dnxrc.bx.internal.cloudapp.net [10.0.1.4]
over a maximum of 30 hops:
1 <1 ms * 1 ms 10.0.2.4
2 1 ms 1 ms 1 ms 10.0.1.4
Trace complete.
Можно заметить, что первым прыжком указан частный IP-адрес виртуального сетевого модуля (10.0.2.4). Второй прыжок — 10.0.1.4. Это частный IP-адрес виртуальной машины myVmPrivate. Из-за маршрута, добавленного в таблицу маршрутов myRouteTablePublic и связанного с подсетью Public, трафик в Azure был маршрутизирован через NVA, а не напрямую в подсеть Private.
Закройте сеанс удаленного рабочего стола с виртуальной машиной myVmPublic, сохраняя подключение к виртуальной машине myVmPrivate.
Протестируйте маршрутизацию сетевого трафика к виртуальной машине myVmPublic от виртуальной машины myVmPrivate, выполнив следующую команду интерфейса командной строки на виртуальной машине myVmPrivate:
tracert myVmPublic
Ответ будет выглядеть примерно так:
Tracing route to myVmPublic.vpgub4nqnocezhjgurw44dnxrc.bx.internal.cloudapp.net [10.0.0.4]
over a maximum of 30 hops:
1 1 ms 1 ms 1 ms 10.0.0.4
Trace complete.
Вы увидите, что трафик направляется непосредственно от виртуальной машины myVmPrivate на виртуальную машину myVmPublic. По умолчанию Azure маршрутизирует трафик между подсетями напрямую.
Закройте сеанс удаленного рабочего стола с виртуальной машиной myVmPrivate.
Очистка ресурсов
Вы можете удалить ненужную группу ресурсов и все содержащиеся в ней ресурсы с помощью командлета Remove-AzResourceGroup.
Remove-AzResourceGroup -Name myResourceGroup -Force
Следующие шаги
При работе с этой статьей вы создали таблицу маршрутов и связали ее с подсетью. Вы создали простой сетевой виртуальный модуль, который направляет трафик из общедоступной подсети в частную подсеть. Azure Marketplace предоставляет широкий ассортимент предварительно настроенных виртуальных сетевых модулей для разных сетевых функций, например модули брандмауэра и оптимизации доступа к глобальной сети. См. дополнительные сведения о маршрутизации и управлении таблицей маршрутов.
Хотя в виртуальной сети можно развернуть множество ресурсов Azure, ресурсы для некоторых служб PaaS Azure развернуть невозможно. Тем не менее вы все же можете ограничить доступ к ресурсам некоторых служб PaaS в Azure трафиком только из подсети виртуальной сети. Сведения о том, как это сделать, см. в статье Ограничение сетевого доступа к ресурсам PaaS посредством конечных точек службы виртуальной сети с помощью Azure CLI.