Настройка единого общедоступного 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-адреса брандмауэра в браузере вы увидите следующее:
Проверка исходящего из группы контейнеров трафика
Разверните следующий образец контейнера в виртуальной сети. При запуске он отправляет единичный 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.