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


Настройка единого общедоступного IP-адреса для исходящего и входящего в группу контейнеров трафика

Настройка группы контейнеров с внешним IP-адресом позволяет внешним клиентам использовать IP-адрес для доступа к контейнеру в группе. Например, браузер может получить доступ к веб-приложению, выполняющемуся в контейнере. Однако в настоящее время для исходящего трафика группа контейнеров использует другой IP-адрес. Этот IP-адрес исходящего трафика не предоставляется программным способом, что усложняет мониторинг группы контейнеров и настройку правил брандмауэра клиента.

В этой статье описаны действия по настройке группы контейнеров в виртуальной сети, интегрированной с Брандмауэром Azure. Настроив определяемый пользователем маршрут к группе контейнеров и правила брандмауэра, можно маршрутизировать и определять трафик, идущий к группе контейнеров и из нее. Входящий и исходящий трафик контейнеров использует общедоступный IP-адрес брандмауэра. Несколько групп контейнеров, развернутых в подсети виртуальной сети, могут использовать один IP-адрес исходящего трафика.

В этой статье Azure CLI используется для создания следующих ресурсов для этого сценария.

  • Группы контейнеров, развернутые в делегированной подсети виртуальной сети
  • Брандмауэр Azure, развернутый в сети со статическим общедоступным IP-адресом
  • Определяемый пользователем маршрут в подсети групп контейнеров
  • Правило NAT для приема данных брандмауэром и правило приложения для исходящих данных

Затем необходимо проверить входящие и исходящие данные из примеров групп контейнеров через брандмауэр.

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

Необходимые компоненты

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

Запуск Azure Cloud Shell

Azure Cloud Shell — это бесплатная интерактивная оболочка, с помощью которой можно выполнять действия, описанные в этой статье. Она включает предварительно установленные общие инструменты Azure и настроена для использования с вашей учетной записью.

Чтобы открыть Cloud Shell, просто выберите Попробовать в правом верхнем углу блока кода. Cloud Shell можно также запустить в отдельной вкладке браузера, перейдя на страницу https://shell.azure.com.

Когда откроется Cloud Shell, убедитесь, что для вашей среды выбран вариант Bash. В последующих сеансах в среде Bash будет использоваться Azure CLI. Нажмите кнопку Копировать, чтобы скопировать блоки кода. Вставьте код в Cloud Shell и нажмите клавишу ВВОД, чтобы выполнить его.

Вход в Azure

Проверка подлинности Cloud Shell автоматически производится с данными той учетной записи, с которой был осуществлен вход. Используйте следующий сценарий для входа с помощью другой подписки, заменив subscriptionId идентификатором подписки Azure.

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

subscription="subscriptionId" # Set Azure subscription ID here

az account set -s $subscription # ...or use 'az login'

Дополнительные сведения см. в интерактивном режиме для задания активной подписки или входа.

Примечание.

Скачать полный скрипт можно здесь.

Начало работы

В этом учебнике используется случайная переменная. Если вы использовали существующую группу ресурсов, измените значение этой переменной соответствующим образом.

resourceGroup=resourceGroup$RANDOM

Группа ресурсов Azure. Если у вас еще нет группы ресурсов Azure, создайте ее с помощью команды az group create. Измените значение расположения соответствующим образом.

az group create --name $resourceGroup --location eastus

Развертывание ACI в виртуальной сети

В типичном случае у вас уже может быть виртуальная сеть Azure для развертывания группы контейнеров. В целях демонстрации следующие команды создают виртуальную сеть и подсеть при создании группы контейнеров. Подсеть делегирована службе "Экземпляры контейнеров Azure".

Группа контейнеров запускает небольшое веб-приложение из образа aci-helloworld. Как показано в других статьях документации, этот образ упаковывает небольшое веб-приложение, написанное на Node.js, которое обслуживает статическую HTML-страницу.

Создайте группу контейнеров с помощью команды az container create:

az container create \
  --name appcontainer \
  --resource-group $resourceGroup \
  --image mcr.microsoft.com/azuredocs/aci-helloworld \
  --vnet aci-vnet \
  --vnet-address-prefix 10.0.0.0/16 \
  --subnet aci-subnet \
  --subnet-address-prefix 10.0.0.0/24

Совет

Измените значение --subnet address-prefix для пространства IP-адресов, которое требуется в подсети. Наименьшая поддерживаемая подсеть — /29, она предоставляет восемь IP-адресов. Некоторые IP-адреса зарезервированы для использования в Azure.

Для использования на более позднем этапе необходим частный IP-адрес группы контейнеров. Получите его, выполнив команду [az container show][az-container-show]:

aciPrivateIp="$(az container show --name appcontainer \
  --resource-group $resourceGroup \
  --query ipAddress.ip --output tsv)"

Развертывание брандмауэра Azure в сети

В следующих разделах описано, как развернуть брандмауэр Azure в виртуальной сети с помощью Azure CLI. Дополнительную информацию см. в разделе Руководство по развертыванию и настройке службы "Брандмауэр Azure" с помощью портала Azure.

Сначала используйте команду az network vnet subnet create, чтобы добавить для брандмауэра подсеть с именем AzureFirewallSubnet. AzureFirewallSubnet — это обязательное имя этой подсети.

az network vnet subnet create \
  --name AzureFirewallSubnet \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet   \
  --address-prefix 10.0.1.0/26

Используйте следующие команды Azure CLI для создания брандмауэра в подсети.

Добавьте расширение брандмауэра в Azure CLI, если оно еще не установлено, с помощью команды az extension add:

az extension add --name azure-firewall

Создайте ресурсы брандмауэра с помощью команды az network firewall create :

az network firewall create \
  --name myFirewall \
  --resource-group $resourceGroup \
  --location eastus

az network public-ip create \
  --name fw-pip \
  --resource-group $resourceGroup \
  --location eastus \
  --allocation-method static \
  --sku standard
    
az network firewall ip-config create \
  --firewall-name myFirewall \
  --name FW-config \
  --public-ip-address fw-pip \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet

Обновите конфигурацию брандмауэра с помощью команды az network firewall update:

az network firewall update \
  --name myFirewall \
  --resource-group $resourceGroup

Получите частный IP-адрес брандмауэра с помощью команды az network firewall ip-config list. Этот частный IP-адрес будет использоваться в другой команде далее.

fwPrivateIp="$(az network firewall ip-config list \
  --resource-group $resourceGroup \
  --firewall-name myFirewall \
  --query "[].privateIpAddress" --output tsv)"

Позже можно получить общедоступный IP-адрес с помощью команды az network public-ip show. Этот общедоступный IP-адрес будет использоваться в другой команде далее.

fwPublicIp="$(az network public-ip show \
  --name fw-pip \
  --resource-group $resourceGroup \
  --query ipAddress --output tsv)"

Установка определяемого пользователем маршрута в подсети ACI

Чтобы отвлечь трафик к брандмауэру Azure, определите используемый маршрут в подсети ACI. См. статью Управление сетевым трафиком.

Создание таблицы маршрутов

Сначала выполните команду az network route-table create, чтобы создать таблицу маршрутов. Создайте таблицу маршрутов в том же регионе, в котором находится виртуальная сеть.

az network route-table create \
  --name Firewall-rt-table \
  --resource-group $resourceGroup \
  --location eastus \
  --disable-bgp-route-propagation true

Создание маршрута

Создайте маршрут в таблице маршрутов с помощью команды az network route-table route create. Чтобы направить трафик в брандмауэр, задайте тип следующего прыжка в значение VirtualAppliance и передайте частный IP-адрес брандмауэра в качестве адреса следующего прыжка.

az network route-table route create \
  --resource-group $resourceGroup \
  --name DG-Route \
  --route-table-name Firewall-rt-table \
  --address-prefix 0.0.0.0/0 \
  --next-hop-type VirtualAppliance \
  --next-hop-ip-address $fwPrivateIp

Связывание таблицы маршрутов с подсетью ACI

Выполните команду az network vnet subnet update, чтобы сопоставить созданную ранее таблицу маршрутов с подсетью службы экземпляров контейнеров Azure.

az network vnet subnet update \
  --name aci-subnet \
  --resource-group $resourceGroup \
  --vnet-name aci-vnet \
  --address-prefixes 10.0.0.0/24 \
  --route-table Firewall-rt-table

Настройка правил в брандмауэре

По умолчанию Брандмауэр Azure запрещает (блокирует) входящий и исходящий трафик.

Настройка правила NAT на брандмауэре в подсети ACI

Создайте правило NAT на брандмауэре, чтобы перевести и отфильтровать входящий интернет-трафик в контейнер приложения, который ранее был запущен в сети. Больше информации можно получить в статье Фильтрация входящего интернет-трафика с помощью DNAT-службы Брандмауэра Azure.

Создайте правило NAT и коллекцию с помощью команды az network firewall nat-rule create:

az network firewall nat-rule create \
  --firewall-name myFirewall \
  --collection-name myNATCollection \
  --action dnat \
  --name myRule \
  --protocols TCP \
  --source-addresses '*' \
  --destination-addresses $fwPublicIp \
  --destination-ports 80 \
  --resource-group $resourceGroup \
  --translated-address $aciPrivateIp \
  --translated-port 80 \
  --priority 200

При необходимости добавьте дополнительные правила NAT, чтобы отфильтровать трафик по другим IP-адресам в подсети. Например, другие группы контейнеров в подсети могут открывать IP-адреса для входящего трафика, или при перезапуске группе контейнеров могут быть назначены другие внутренние IP-адреса.

Создание правила исходящего приложения в брандмауэре

Чтобы создать правило исходящего трафика в брандмауэре, выполните команду az network firewall application-rule create. Этот пример правила разрешает доступ к полному доменному имени checkip.dyndns.org из подсети, делегированной в службу "Экземпляры контейнеров Azure". Доступ к сайту по протоколу HTTP используется на следующем шаге для подтверждения IP-адреса исходящего трафика из службы Экземпляров контейнеров Azure.

az network firewall application-rule create \
  --collection-name myAppCollection \
  --firewall-name myFirewall \
  --name Allow-CheckIP \
  --protocols Http=80 Https=443 \
  --resource-group $resourceGroup \
  --target-fqdns checkip.dyndns.org \
  --source-addresses 10.0.0.0/24 \
  --priority 200 \
  --action Allow

Проверка доступа к группе контейнеров через брандмауэр

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

Проверка входящего в группу контейнеров трафика

Проверьте входящий доступ к appcontainer запущенной в виртуальной сети, перейдя по общедоступному IP-адресу брандмауэра. Ранее вы должны были сохранить общедоступный IP-адрес в переменной $FW_PUBLIC_IP.

echo $fwPublicIp

Она выводит выходные данные следующего вида:

52.142.18.133

Если правило NAT в брандмауэре настроено должным образом, при вводе общедоступного IP-адреса брандмауэра в браузере вы увидите следующее:

Перейти к общедоступному IP-адресу брандмауэра

Проверка исходящего из группы контейнеров трафика

Разверните следующий образец контейнера в виртуальной сети. При запуске он отправляет единичный HTTP-запрос в http://checkip.dyndns.org, который отображает IP-адрес отправителя (IP-адрес выхода). Если правило приложения на брандмауэре настроено правильно, то будет возвращен общедоступный IP-адрес брандмауэра.

az container create \
  --resource-group $resourceGroup \
  --name testegress \
  --image mcr.microsoft.com/azuredocs/aci-tutorial-sidecar \
  --command-line "curl -s http://checkip.dyndns.org" \
  --restart-policy OnFailure \
  --vnet aci-vnet \
  --subnet aci-subnet

Просмотрите журналы контейнеров, чтобы убедиться, что IP-адрес совпадает с общедоступным IP-адресом брандмауэра.

az container logs \
  --resource-group $resourceGroup \
  --name testegress 

Она выводит выходные данные следующего вида:

<html><head><title>Current IP Check</title></head><body>Current IP Address: 52.142.18.133</body></html>

Очистка ресурсов

Вы можете удалить ненужную группу ресурсов, масштабируемый набор и все связанные ресурсы с помощью команды az group delete, как показано ниже. При использовании параметра --no-wait управление возвращается в командную строку без ожидания завершения операции. Параметр --yes подтверждает, что вы хотите удалить ресурсы без другого запроса.

az group delete --name $resourceGroup --yes --no-wait

Следующие шаги

В этой статье вы произвели настройку группы контейнеров в виртуальной сети за Брандмауэром Azure. Вы настроили определяемые пользователем маршруты и правила NAT и приложений в брандмауэре. С помощью этой конфигурации вы настроите один статический IP-адрес для входящих и исходящих данных из экземпляров контейнеров Azure.

Дополнительные сведения об управлении трафиком и защите ресурсов Azure см. в документации по Брандмауэру Azure.