Поделиться через


Маршрутизация сетевого трафика с помощью таблицы маршрутов при использовании PowerShell

По умолчанию Azure автоматически маршрутизирует трафик между всеми подсетями в виртуальной сети. Для переопределения маршрутизации Azure по умолчанию можно создать собственные маршруты. Возможность создания настраиваемых маршрутов полезна, если, к примеру, требуется маршрутизировать трафик между подсетями через виртуальный сетевой модуль. Вы узнаете, как выполнять следующие задачи:

  • Создание таблицы маршрутов
  • Создание маршрута
  • Создание виртуальной сети с несколькими подсетями
  • Связывание таблицы маршрутов с подсетью
  • создание виртуального сетевого модуля, который перенаправляет трафик;
  • развертывание виртуальных машин в разных подсетях;
  • направление трафика из одной подсети в другую через виртуальный сетевой модуль.

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе.

Azure Cloud Shell

В Azure есть Azure Cloud Shell, интерактивная оболочка среды, с которой можно работать в браузере. Для работы со службами Azure можно использовать Bash или PowerShell с Cloud Shell. Для запуска кода из этой статьи можно использовать предварительно установленные команды Cloud Shell. Ничего дополнительного в локальной среде устанавливать не нужно.

Начало работы с Azure Cloud Shell

Вариант Пример и ссылка
Нажмите кнопку Попробовать в правом верхнем углу блока кода или команд. При нажатии кнопки Попробовать код или команда не копируется в Cloud Shell автоматически. Снимок экрана: пример открытия Azure Cloud Shell с помощью кнопки
Чтобы открыть Cloud Shell в браузере, перейдите по адресу https://shell.azure.com или нажмите кнопку Запуск Cloud Shell. Кнопка запуска Azure Cloud Shell.
Нажмите кнопку Cloud Shell в строке меню в правом верхнем углу окна портала Azure. Снимок экрана: кнопка

Чтобы использовать Azure Cloud Shell, выполните следующие действия:

  1. Запустите Cloud Shell.

  2. Нажмите кнопку Копировать в блоке кода (или блоке команд), чтобы скопировать код или команду.

  3. Вставьте код или команду в окно сеанса Cloud Shell, нажав клавиши CTRL+SHIFT+V в Windows и Linux или CMD+SHIFT+V в macOS.

  4. Нажмите клавишу ВВОД, чтобы запустить код или команду.

Чтобы установить и использовать 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.