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


Ограничение сетевого трафика с помощью Брандмауэр Azure в Служба Azure Kubernetes (AKS)

Узнайте, как использовать правила исходящей сети и полное доменное имя для кластеров AKS для управления исходящим трафиком с помощью Брандмауэр Azure в AKS. Чтобы упростить эту конфигурацию, Брандмауэр Azure предоставляет тег Служба Azure Kubernetes полного доменного имени (AzureKubernetesServiceFQDN), который ограничивает исходящий трафик из кластера AKS. В этой статье показано, как настроить правила трафика кластера AKS с помощью брандмауэра Azure.

Примечание.

Тег FQDN содержит все полные доменные имена, перечисленные в правилах исходящей сети и полное доменное имя для кластеров AKS, и автоматически обновляется.

Для рабочих сценариев рекомендуется использовать не менее 20 интерфейсных IP-адресов в Брандмауэр Azure, чтобы избежать проблем с исчерпанием портов SNAT.

Ниже приведен пример архитектуры развертывания.

Заблокированная топология

  • Общедоступный входящий трафик принудительно проходит через фильтры брандмауэра
    • Узлы агента AKS изолированы в выделенной подсети
    • Брандмауэр Azure развертывается в собственной подсети
    • Правило DNAT преобразует общедоступный IP-адрес брандмауэра в интерфейсный IP-адрес подсистемы балансировки нагрузки.
  • Исходящие запросы начинаются с узлов агента на внутренний 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"

Создание виртуальной сети с несколькими подсетями

Подготовьте виртуальную сеть с двумя отдельными подсетями: один для кластера и один для брандмауэра. При необходимости можно создать ее для внутреннего входящего трафика службы.

Пустая топология сети

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

    az group create --name $RG --location $LOC
    
  2. Создайте виртуальную сеть с двумя подсетями для размещения кластера 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".

Брандмауэр и UDR

  1. Создайте стандартный ресурс общедоступного IP-адреса SKU с помощью az network public-ip create команды. Этот ресурс будет использоваться в качестве Брандмауэр Azure внешнего адреса.

    az network public-ip create --resource-group $RG -n $FWPUBLICIP_NAME --location $LOC --sku "Standard"
    
  2. Зарегистрируйте расширение cli Брандмауэр Azure, чтобы создать Брандмауэр Azure с помощью az extension add команды.

    az extension add --name azure-firewall
    
  3. Создайте Брандмауэр 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-сервер, указанный выше. Это позволяет брандмауэру автоматически переводить полное доменное имя.

  1. Создайте Брандмауэр 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
    
  2. После успешного выполнения предыдущей команды сохраните внешний 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.

  1. Создайте пустую таблицу маршрутов, связанную с заданной подсетью с помощью az network route-table create команды. В таблице маршрутов будет определен следующий прыжок к созданному выше брандмауэру Azure. С каждой подсетью может быть связана одна таблица маршрутов (или ноль).

    az network route-table create --resource-group $RG --location $LOC --name $FWROUTE_TABLE_NAME
    
  2. Создайте маршруты в таблице маршрутов для подсетей с помощью 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).
  1. Создайте сетевые правила с помощью 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'
    
  2. Создайте правило приложения с помощью 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 тип .

aks-deploy

Целевая подсеть для развертывания определяется переменной среды $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 создаст назначаемое системой удостоверение 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. Кроме того, можно настроить прыжки с необходимым инструментом внутри отдельной подсети в виртуальной сети брандмауэра.

  1. Получите IP-адрес с помощью следующей команды:

    CURRENT_IP=$(dig @resolver1.opendns.com ANY myip.opendns.com +short)
    
  2. Добавьте IP-адрес в утвержденные диапазоны с помощью az aks update команды.

    az aks update --resource-group $RG --name $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/32
    
  3. Настройте kubectl подключение к кластеру az aks get-credentials AKS с помощью команды.

    az aks get-credentials --resource-group $RG --name $AKSNAME
    

Развертывание общедоступной службы в AKS

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

Общедоступная служба DNAT

  1. Ознакомьтесь с манифестом краткого руководства по демонстрации магазина AKS, чтобы просмотреть все созданные ресурсы.

  2. Разверните службу с помощью 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.

  1. Получите внутренний 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
    
  2. Получите IP-адрес службы с помощью kubectl get svc store-front команды.

    SERVICE_IP=$(kubectl get svc store-front -o jsonpath='{.status.loadBalancer.ingress[*].ip}')
    
  3. Добавьте правило 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, открытое в локальном браузере.

На этой странице можно просмотреть продукты, добавить их в корзину, а затем разместить заказ.

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

Чтобы очистить ресурсы Azure, удалите группу ресурсов AKS с помощью az group delete команды.

az group delete --name $RG

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

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