Ограничение сетевого трафика с помощью Брандмауэр Azure в Служба Azure Kubernetes (AKS)
Узнайте, как использовать правила исходящей сети и полное доменное имя для кластеров AKS для управления исходящим трафиком с помощью Брандмауэр Azure в AKS. Чтобы упростить эту конфигурацию, Брандмауэр Azure предоставляет тег Служба Azure Kubernetes полного доменного имени (AzureKubernetesService
FQDN), который ограничивает исходящий трафик из кластера AKS. В этой статье показано, как настроить правила трафика кластера AKS с помощью брандмауэра Azure.
Примечание.
Тег FQDN содержит все полные доменные имена, перечисленные в правилах исходящей сети и полное доменное имя для кластеров AKS, и автоматически обновляется.
Для рабочих сценариев рекомендуется использовать не менее 20 интерфейсных IP-адресов в Брандмауэр Azure, чтобы избежать проблем с исчерпанием портов SNAT.
Ниже приведен пример архитектуры развертывания.
- Общедоступный входящий трафик принудительно проходит через фильтры брандмауэра
- Исходящие запросы начинаются с узлов агента на внутренний IP-адрес Брандмауэр Azure с помощью определяемого пользователем маршрута (UDR)
- Запросы от узлов агента AKS следуют UDR, который был размещен в подсети кластера AKS, был развернут в
- Брандмауэр Azure направляет исходящий трафик из виртуальной сети с клиентского компонента общедоступного IP-адреса
- Доступ к общедоступному Интернету или другим службам Azure осуществляется через IP-адрес клиентского компонента брандмауэра
- Доступ к плоскости управления AKS можно защитить с помощью авторизованных диапазонов IP-адресов сервера API, включая общедоступный IP-адрес брандмауэра.
- Внутренний трафик
- Для внутреннего трафика можно использовать внутреннюю подсистему балансировки нагрузки, которую можно изолировать в собственной подсети, а не наряду с общедоступным подсистемой балансировки нагрузки.
Настройка переменных среды
Определите набор переменных среды, которые будут использоваться при создании ресурсов.
PREFIX="aks-egress"
RG="${PREFIX}-rg"
LOC="eastus"
PLUGIN=azure
AKSNAME="${PREFIX}"
VNET_NAME="${PREFIX}-vnet"
AKSSUBNET_NAME="aks-subnet"
# DO NOT CHANGE FWSUBNET_NAME - This is currently a requirement for Azure Firewall.
FWSUBNET_NAME="AzureFirewallSubnet"
FWNAME="${PREFIX}-fw"
FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
FWIPCONFIG_NAME="${PREFIX}-fwconfig"
FWROUTE_TABLE_NAME="${PREFIX}-fwrt"
FWROUTE_NAME="${PREFIX}-fwrn"
FWROUTE_NAME_INTERNET="${PREFIX}-fwinternet"
Создание виртуальной сети с несколькими подсетями
Подготовьте виртуальную сеть с двумя отдельными подсетями: один для кластера и один для брандмауэра. При необходимости можно создать ее для внутреннего входящего трафика службы.
Создайте группу ресурсов с помощью
az group create
команды.az group create --name $RG --location $LOC
Создайте виртуальную сеть с двумя подсетями для размещения кластера AKS и Брандмауэр Azure с помощью
az network vnet create
команд иaz network vnet subnet create
команд.# Dedicated virtual network with AKS subnet az network vnet create \ --resource-group $RG \ --name $VNET_NAME \ --location $LOC \ --address-prefixes 10.42.0.0/16 \ --subnet-name $AKSSUBNET_NAME \ --subnet-prefix 10.42.1.0/24 # Dedicated subnet for Azure Firewall (Firewall name can't be changed) az network vnet subnet create \ --resource-group $RG \ --vnet-name $VNET_NAME \ --name $FWSUBNET_NAME \ --address-prefix 10.42.2.0/24
Создание и настройка Брандмауэр Azure
Необходимо настроить Брандмауэр Azure правила для входящего и исходящего трафика. Основной целью брандмауэра является предоставление организациям возможности настроить детализированные входящий трафик и правила исходящего трафика в кластер AKS и выйти из него.
Внимание
Если кластер или приложение создает большое количество исходящих подключений, направленных на то же или небольшое подмножество назначений, может потребоваться больше ip-адресов внешнего интерфейса брандмауэра, чтобы избежать максимального количества портов на внешний IP-адрес.
Дополнительные сведения о создании Брандмауэр Azure с несколькими IP-адресами см. в статье "Создание Брандмауэр Azure с несколькими общедоступными IP-адресами с помощью Bicep".
Создайте стандартный ресурс общедоступного IP-адреса SKU с помощью
az network public-ip create
команды. Этот ресурс будет использоваться в качестве Брандмауэр Azure внешнего адреса.az network public-ip create --resource-group $RG -n $FWPUBLICIP_NAME --location $LOC --sku "Standard"
Зарегистрируйте расширение cli Брандмауэр Azure, чтобы создать Брандмауэр Azure с помощью
az extension add
команды.az extension add --name azure-firewall
Создайте Брандмауэр Azure и включите DNS-прокси с помощью
az network firewall create
команды и установите для нее значениеtrue
--enable-dns-proxy
.az network firewall create --resource-group $RG --name $FWNAME --location $LOC --enable-dns-proxy true
Настройка общедоступного IP-адреса в Брандмауэр Azure может занять несколько минут. После его готовности IP-адрес, созданный ранее, можно назначить интерфейсу брандмауэра.
Примечание.
Чтобы использовать полное доменное имя в правилах сети, нам нужен dns-прокси-сервер. Если dns-прокси включен, брандмауэр прослушивает порт 53 и пересылает DNS-запросы на DNS-сервер, указанный выше. Это позволяет брандмауэру автоматически переводить полное доменное имя.
Создайте Брандмауэр Azure IP-конфигурацию с помощью
az network firewall ip-config create
команды.az network firewall ip-config create --resource-group $RG --firewall-name $FWNAME --name $FWIPCONFIG_NAME --public-ip-address $FWPUBLICIP_NAME --vnet-name $VNET_NAME
После успешного выполнения предыдущей команды сохраните внешний IP-адрес брандмауэра для последующей настройки.
FWPUBLIC_IP=$(az network public-ip show --resource-group $RG --name $FWPUBLICIP_NAME --query "ipAddress" -o tsv) FWPRIVATE_IP=$(az network firewall show --resource-group $RG --name $FWNAME --query "ipConfigurations[0].privateIPAddress" -o tsv)
Примечание.
Если вы используете безопасный доступ к серверу API AKS с разрешениями диапазонов IP-адресов, необходимо добавить общедоступный IP-адрес брандмауэра в разрешенный диапазон IP-адресов.
Создание маршрута с прыжком для Брандмауэр Azure
Azure автоматически направляет трафик между подсетями Azure, виртуальными и локальными сетями. Если вы хотите изменить любую из маршрутизации Azure по умолчанию, можно создать таблицу маршрутов.
Внимание
Для исходящего типа UDR (userDefinedRouting
) требуется маршрут для 0.0.0.0/0/0 и назначения следующего прыжка NVA в таблице маршрутов.
Таблица маршрутов уже имеет значение по умолчанию 0.0.0.0/0 в Интернете. Без общедоступного IP-адреса для Azure, используемого для преобразования сетевых адресов источника (SNAT), просто добавление этого маршрута не обеспечит исходящее подключение к Интернету. AKS проверяет, что вы не создаете маршрут 0.0.0.0/0, указывающий на Интернет, а не шлюз, NVA и т. д. При использовании исходящего типа UDR общедоступный IP-адрес подсистемы балансировки нагрузки для входящих запросов не создается, если служба типа loadbalancer не настроена. AKS никогда не создает общедоступный IP-адрес для исходящих запросов , если вы задаете исходящий тип UDR.
Дополнительные сведения см. в разделе "Правила исходящего трафика" для Azure Load Balancer.
Создайте пустую таблицу маршрутов, связанную с заданной подсетью с помощью
az network route-table create
команды. В таблице маршрутов будет определен следующий прыжок к созданному выше брандмауэру Azure. С каждой подсетью может быть связана одна таблица маршрутов (или ноль).az network route-table create --resource-group $RG --location $LOC --name $FWROUTE_TABLE_NAME
Создайте маршруты в таблице маршрутов для подсетей с помощью
az network route-table route create
команды.az network route-table route create --resource-group $RG --name $FWROUTE_NAME --route-table-name $FWROUTE_TABLE_NAME --address-prefix 0.0.0.0/0 --next-hop-type VirtualAppliance --next-hop-ip-address $FWPRIVATE_IP az network route-table route create --resource-group $RG --name $FWROUTE_NAME_INTERNET --route-table-name $FWROUTE_TABLE_NAME --address-prefix $FWPUBLIC_IP/32 --next-hop-type Internet
Сведения о переопределении системных маршрутов Azure по умолчанию или добавлении дополнительных маршрутов в таблицу маршрутов подсети см. в документации по таблице маршрутов виртуальной сети.
Добавление правил брандмауэра
Примечание.
Для приложений за пределами пространства имен kube-system или gatekeeper-system, которые должны взаимодействовать с сервером API, требуется дополнительное сетевое правило, позволяющее tcp-связи через порт 443 для IP-адреса сервера API, а также добавление правила приложения для fqdn-tag AzureKubernetesService
.
В этом разделе рассматриваются три сетевых правила и правило приложения, которое можно использовать для настройки в брандмауэре. Возможно, потребуется адаптировать эти правила на основе развертывания.
- Первое сетевое правило разрешает доступ к порту 9000 через TCP.
- Второе правило сети разрешает доступ к порту 1194 и 123 через UDP. Если вы развертываете в Microsoft Azure под управлением 21Vianet, ознакомьтесь с правилами сети, управляемыми 21Vianet. Оба этих правила разрешают трафик, предназначенный только для CIDR региона Azure в этой статье, которая является восточной частью США.
- Третье сетевое правило открывает порт 123 в
ntp.ubuntu.com
полное доменное имя через UDP. Добавление полного доменного имени в качестве сетевого правила является одной из конкретных функций Брандмауэр Azure, поэтому вам потребуется адаптировать его при использовании собственных параметров. - Четвертые и пятые правила сети позволяют получать контейнеры из реестра контейнеров GitHub (ghcr.io) и Docker Hub (docker.io).
Создайте сетевые правила с помощью
az network firewall network-rule create
команды.az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'apiudp' --protocols 'UDP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 1194 --action allow --priority 100 az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'apitcp' --protocols 'TCP' --source-addresses '*' --destination-addresses "AzureCloud.$LOC" --destination-ports 9000 az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'time' --protocols 'UDP' --source-addresses '*' --destination-fqdns 'ntp.ubuntu.com' --destination-ports 123 az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'ghcr' --protocols 'TCP' --source-addresses '*' --destination-fqdns ghcr.io pkg-containers.githubusercontent.com --destination-ports '443' az network firewall network-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwnr' --name 'docker' --protocols 'TCP' --source-addresses '*' --destination-fqdns docker.io registry-1.docker.io production.cloudflare.docker.com --destination-ports '443'
Создайте правило приложения с помощью
az network firewall application-rule create
команды.az network firewall application-rule create --resource-group $RG --firewall-name $FWNAME --collection-name 'aksfwar' --name 'fqdn' --source-addresses '*' --protocols 'http=80' 'https=443' --fqdn-tags "AzureKubernetesService" --action allow --priority 100
Дополнительные сведения о Брандмауэр Azure см. в документации по Брандмауэр Azure.
Привязка таблицы маршрутизации к AKS
Чтобы связать кластер с брандмауэром, выделенная выше подсеть для подсети кластера должна ссылаться на созданную выше таблицу маршрутизации. az network vnet subnet update
Используйте команду, чтобы связать таблицу маршрутов с AKS.
az network vnet subnet update --resource-group $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --route-table $FWROUTE_TABLE_NAME
Развертывание кластера AKS, который соответствует правилам исходящего трафика
Теперь можно развернуть кластер AKS в существующей виртуальной сети. Вы будете использовать исходящий userDefinedRouting
тип, который гарантирует, что любой исходящий трафик принудительно выполняется через брандмауэр, и другие пути исходящего трафика не будут существовать. Кроме того, можно использовать исходящий loadBalancer
тип .
Целевая подсеть для развертывания определяется переменной среды $SUBNETID
. Задайте значение для идентификатора подсети с помощью следующей команды:
SUBNETID=$(az network vnet subnet show --resource-group $RG --vnet-name $VNET_NAME --name $AKSSUBNET_NAME --query id -o tsv)
Вы определите тип исходящего трафика для использования UDR, который уже существует в подсети. Эта конфигурация позволит AKS пропустить установку и подготовку IP-адресов для балансировщика нагрузки.
Совет
В развертывание кластера можно добавить дополнительные функции, такие как частные кластеры.
Вы можете добавить функцию AKS для авторизованных диапазонов IP-адресов сервера API, чтобы ограничить доступ сервера API только к общедоступной конечной точке брандмауэра. Функция "диапазоны разрешенных IP-адресов" отмечается на схеме как необязательная. При включении функции авторизованного диапазона IP-адресов для ограничения доступа к серверу API средства разработчика должны использовать прыжки из виртуальной сети брандмауэра или добавить все конечные точки разработчика в авторизованный диапазон IP-адресов.
- Создание кластера AKS с удостоверениями, назначенными системой
- Создание кластера AKS с удостоверениями, назначенными пользователем
Примечание.
AKS создаст назначаемое системой удостоверение kubelet в группе ресурсов узла, если не указать собственное управляемое удостоверение kubelet.
Для определяемой пользователем маршрутизации назначаемое системой удостоверение поддерживает только подключаемый модуль сети CNI.
Создайте кластер AKS с помощью управляемого удостоверения, назначаемого системой, с подключаемым модулем сети CNI с помощью az aks create
команды.
az aks create --resource-group $RG --name $AKSNAME --location $LOC \
--node-count 3 \
--network-plugin azure \
--outbound-type userDefinedRouting \
--vnet-subnet-id $SUBNETID \
--api-server-authorized-ip-ranges $FWPUBLIC_IP \
--generate-ssh-keys
Разрешение доступа разработчика к серверу API
Если вы использовали авторизованные диапазоны IP-адресов для кластера на предыдущем шаге, необходимо добавить IP-адреса инструментов разработчика в список утвержденных диапазонов IP-адресов, чтобы получить доступ к серверу API. Кроме того, можно настроить прыжки с необходимым инструментом внутри отдельной подсети в виртуальной сети брандмауэра.
Получите IP-адрес с помощью следующей команды:
CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
Добавьте IP-адрес в утвержденные диапазоны с помощью
az aks update
команды.az aks update --resource-group $RG --name $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
Настройте
kubectl
подключение к кластеруaz aks get-credentials
AKS с помощью команды.az aks get-credentials --resource-group $RG --name $AKSNAME
Развертывание общедоступной службы в AKS
Теперь можно приступить к раскрытию служб и развертыванию приложений в этом кластере. В этом примере мы предоставим общедоступную службу, но вы также можете предоставить внутреннюю службу с помощью внутренней подсистемы балансировки нагрузки.
Ознакомьтесь с манифестом краткого руководства по демонстрации магазина AKS, чтобы просмотреть все созданные ресурсы.
Разверните службу с помощью
kubectl apply
команды.kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-quickstart.yaml
Разрешить входящий трафик через Брандмауэр Azure
Внимание
Если вы используете Брандмауэр Azure для ограничения исходящего трафика и создания UDR для принудительного передачи всего исходящего трафика, убедитесь, что вы создаете соответствующее правило DNAT в Брандмауэр Azure, чтобы правильно разрешить трафик входящего трафика. Использование Брандмауэра Azure в сочетании с определяемыми пользователем маршрутами нарушает передачу входящего трафика из-за асимметричной маршрутизации. Проблема возникает, если подсеть AKS имеет маршрут по умолчанию, который переходит к частному IP-адресу брандмауэра, но вы используете общедоступную подсистему балансировки нагрузки — входящий трафик или службу Kubernetes типа loadBalancer
. В этом случае входящий трафик подсистемы балансировки нагрузки поступает через общедоступный IP-адрес, а обратный путь проходит через частный IP-адрес брандмауэра. Так как брандмауэр отслеживает состояние и не имеет информации об активных сеансах, он отбрасывает возвращаемые пакеты. Сведения о том, как интегрировать Брандмауэр Azure с подсистемой балансировки нагрузки для входящего трафика или служб, см. в статье Интеграция Брандмауэра Azure с Azure Load Balancer (цен. категория "Стандартный").
Чтобы настроить входящий трафик, необходимо написать правило DNAT в Брандмауэр Azure. Чтобы проверить возможность подключения к нашему кластеру, для общедоступного IP-адреса клиентского компонента брандмауэра определяется правило, направляющего его на внутренний IP-адрес, предоставляемый внутренней службой. Целевой адрес можно настроить. Преобразованный адрес должен представлять собой IP-адрес внутреннего балансировщика нагрузки. Преобразованный порт должен представлять собой предоставленный порт для вашей службы Kubernetes. Кроме того, необходимо указать внутренний IP-адрес, назначенный подсистеме балансировки нагрузки, созданной службой Kubernetes.
Получите внутренний IP-адрес, назначенный подсистеме
kubectl get services
балансировки нагрузки, с помощью команды.kubectl get services
IP-адрес будет указан в столбце
EXTERNAL-IP
, как показано в следующем примере выходных данных:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 9m10s order-service ClusterIP 10.0.104.144 <none> 3000/TCP 11s product-service ClusterIP 10.0.237.60 <none> 3002/TCP 10s rabbitmq ClusterIP 10.0.161.128 <none> 5672/TCP,15672/TCP 11s store-front LoadBalancer 10.0.89.139 20.39.18.6 80:32271/TCP 10s
Получите IP-адрес службы с помощью
kubectl get svc store-front
команды.SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
Добавьте правило NAT с помощью
az network firewall nat-rule create
команды.az network firewall nat-rule create --collection-name exampleset --destination-addresses $FWPUBLIC_IP --destination-ports 80 --firewall-name $FWNAME --name inboundrule --protocols Any --resource-group $RG --source-addresses '*' --translated-port 80 --action Dnat --priority 100 --translated-address $SERVICE_IP
Проверка подключения
Перейдите к IP-адресу клиентского компонента брандмауэра Azure в браузере, чтобы проверить подключение.
Вы увидите приложение магазина AKS. В этом примере общедоступный IP-адрес брандмауэра был 52.253.228.132
.
На этой странице можно просмотреть продукты, добавить их в корзину, а затем разместить заказ.
Очистка ресурсов
Чтобы очистить ресурсы Azure, удалите группу ресурсов AKS с помощью az group delete
команды.
az group delete --name $RG
Следующие шаги
В этой статье вы узнали, как защитить исходящий трафик с помощью Брандмауэр Azure. При необходимости можно обобщить описанные выше действия, чтобы перенаправить трафик в предпочитаемое решение исходящего трафика после документации по исходящему типуuserDefinedRoute
.
Azure Kubernetes Service