Kontrolowanie ruchu wychodzącego dla wystąpienia usługi Azure Spring Apps

Ten artykuł dotyczy: ✔️ Java ✔️ C#

Ten artykuł dotyczy: ✔️ Podstawowa/Standardowa ✔️ Enterprise

W tym artykule opisano sposób zabezpieczania ruchu wychodzącego z aplikacji hostowanych w usłudze Azure Spring Apps. Artykuł zawiera przykład trasy zdefiniowanej przez użytkownika. Trasa zdefiniowana przez użytkownika to zaawansowana funkcja, która umożliwia pełną kontrolę ruchu wychodzącego. Możesz użyć trasy zdefiniowanej przez użytkownika w scenariuszach, takich jak brak zezwolenia na automatyczne generowanie publicznego adresu IP usługi Azure Spring Apps.

Wymagania wstępne

Tworzenie sieci wirtualnej przy użyciu trasy zdefiniowanej przez użytkownika

Na poniższej ilustracji przedstawiono przykład sieci wirtualnej usługi Azure Spring Apps korzystającej z trasy zdefiniowanej przez użytkownika (UDR).

Diagram przedstawiający architekturę sieci wirtualnej usługi Azure Spring Apps korzystającej z trasy zdefiniowanej przez użytkownika.

Na tym diagramie przedstawiono następujące cechy architektury:

  • Publiczny ruch przychodzący musi przepływać przez filtry zapory.
  • Każde wystąpienie usługi Azure Spring Apps jest izolowane w ramach dedykowanej podsieci.
  • Klienci posiadają zaporę i zarządzają nią.
  • Ta struktura zapewnia, że zapora umożliwia prawidłowe środowisko dla wszystkich potrzebnych funkcji.
  • Usługa Azure Spring Apps nie generuje automatycznie zasobów publicznych adresów IP.

Definiowanie zmiennych środowiskowych

W poniższym przykładzie pokazano, jak zdefiniować zestaw zmiennych środowiskowych, które mają być używane podczas tworzenia zasobów:

export PREFIX="asa-egress"
export RG="${PREFIX}-rg"
export LOC="eastus"
export ASANAME="${PREFIX}"
export VNET_NAME="${PREFIX}-vnet"
export ASA_APP_SUBNET_NAME="asa-app-subnet"
export ASA_SERVICE_RUNTIME_SUBNET_NAME="asa-service-runtime-subnet"
# Do not change FWSUBNET_NAME. This is currently a requirement for Azure Firewall.
export FWSUBNET_NAME="AzureFirewallSubnet"
export FWNAME="${PREFIX}-fw"
export FWPUBLICIP_NAME="${PREFIX}-fwpublicip"
export FWIPCONFIG_NAME="${PREFIX}-fwconfig"
export APP_ROUTE_TABLE_NAME="${PREFIX}-app-rt"
export SERVICE_RUNTIME_ROUTE_TABLE_NAME="${PREFIX}-service-runtime-rt"
export FWROUTE_NAME="${PREFIX}-fwrn"
export ASA_NAME="${PREFIX}-instance"

Tworzenie sieci wirtualnej z wieloma podsieciami

W tej sekcji pokazano, jak aprowizować sieć wirtualną z trzema oddzielnymi podsieciami: jedną dla aplikacji użytkownika, jedną dla środowiska uruchomieniowego usługi i jedną dla zapory.

Najpierw utwórz grupę zasobów, jak pokazano w poniższym przykładzie:

# Create a resource group.

az group create --name $RG --location $LOC

Następnie utwórz sieć wirtualną z trzema podsieciami, aby hostować wystąpienia usługi Azure Spring Apps i Azure Firewall, jak pokazano w poniższym przykładzie:

# Dedicated virtual network with an Azure Spring Apps app subnet.

az network vnet create \
    --resource-group $RG \
    --name $VNET_NAME \
    --location $LOC \
    --address-prefixes 10.42.0.0/16 \
    --subnet-name $ASA_APP_SUBNET_NAME \
    --subnet-prefix 10.42.1.0/24

# Dedicated subnet for the Azure Spring Apps service runtime subnet.

az network vnet subnet create \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME\
    --address-prefix 10.42.2.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.3.0/24

Konfigurowanie wystąpienia usługi Azure Firewall przy użyciu trasy zdefiniowanej przez użytkownika

Użyj następującego polecenia, aby utworzyć i skonfigurować wystąpienie usługi Azure Firewall z trasą zdefiniowaną przez użytkownika oraz skonfigurować reguły ruchu wychodzącego usługi Azure Firewall. Zapora umożliwia skonfigurowanie szczegółowych reguł ruchu wychodzącego z usługi Azure Spring Apps.

Ważne

Jeśli klaster lub aplikacja tworzy dużą liczbę połączeń wychodzących kierowanych do tego samego miejsca docelowego lub do małego podzbioru miejsc docelowych, może być konieczne użycie większej liczby adresów IP frontonu zapory, aby uniknąć osiągnięcia maksymalnej liczby portów na adres IP frontonu. Aby uzyskać więcej informacji na temat tworzenia wystąpienia usługi Azure Firewall z wieloma adresami IP, zobacz Szybki start: tworzenie wystąpienia usługi Azure Firewall z wieloma publicznymi adresami IP — szablon usługi ARM. Utwórz zasób publicznego adresu IP jednostki SKU w warstwie Standardowa do użycia jako adres frontonu usługi Azure Firewall.

az network public-ip create \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME -l $LOC \
    --sku "Standard"

W poniższym przykładzie pokazano, jak zainstalować rozszerzenie interfejsu wiersza polecenia usługi Azure Firewall w wersji zapoznawczej i wdrożyć usługę Azure Firewall:

# Install the Azure Firewall preview CLI extension.

az extension add --name azure-firewall

# Deploy Azure Firewall.

az network firewall create \
    --resource-group $RG \
    --name $FWNAME -l $LOC \
    --enable-dns-proxy true

W poniższym przykładzie pokazano, jak przypisać utworzony adres IP do frontonu zapory.

Uwaga

Skonfigurowanie publicznego adresu IP do wystąpienia usługi Azure Firewall może potrwać kilka minut. Aby użyć w pełni kwalifikowanej nazwy domeny (FQDN) w regułach sieci, włącz serwer proxy DNS. Po włączeniu serwera proxy zapora nasłuchuje na porcie 53 i przekazuje żądania DNS do określonego serwera DNS. Następnie zapora może automatycznie przetłumaczyć nazwę FQDN.

# Configure the firewall IP address.

az network firewall ip-config create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --name $FWIPCONFIG_NAME \
    --public-ip-address $FWPUBLICIP_NAME \
    --vnet-name $VNET_NAME

Po zakończeniu operacji zapisz adres IP frontonu zapory na potrzeby konfiguracji później, jak pokazano w poniższym przykładzie:

# Capture the firewall IP address for later use.

export FWPUBLIC_IP=$(az network public-ip show \
    --resource-group $RG \
    --name $FWPUBLICIP_NAME \
    --query "ipAddress" \
    --output tsv)
export FWPRIVATE_IP=$(az network firewall show \
    --resource-group $RG \
    --name $FWNAME \
    --query "ipConfigurations[0].privateIPAddress" \
    --output tsv | tr -d '[:space:]')

Tworzenie trasy zdefiniowanej przez użytkownika z przeskokiem do usługi Azure Firewall

Platforma Azure automatycznie kieruje ruchem między podsieciami platformy Azure, sieciami wirtualnymi i sieciami lokalnymi. Jeśli chcesz zmienić domyślny routing na platformie Azure, utwórz tabelę tras.

W poniższym przykładzie pokazano, jak utworzyć tabelę tras, która ma być skojarzona z określoną podsiecią. Tabela tras definiuje następny przeskok, tak jak w utworzonym wystąpieniu usługi Azure Firewall. Każda podsieć może mieć skojarzona jedną tabelę tras lub nie ma skojarzonej tabeli tras.

# Create a user-defined route and add a route for Azure Firewall.

az network route-table create \
    --resource-group $RG -l $LOC \
    --name $APP_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $APP_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP
az network route-table create \
    --resource-group $RG -l $LOC \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME
az network route-table route create \
    --resource-group $RG \
    --name $FWROUTE_NAME \
    --route-table-name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --address-prefix 0.0.0.0/0 \
    --next-hop-type VirtualAppliance \
    --next-hop-ip-address $FWPRIVATE_IP

Dodawanie reguł zapory

W poniższym przykładzie pokazano, jak dodać reguły do zapory. Aby uzyskać więcej informacji, zobacz Obowiązki klienta dotyczące uruchamiania usługi Azure Spring Apps w sieci wirtualnej.

# Add firewall network rules.

az network firewall network-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'asafwnr' \
    --name 'springcloudtcp' \
    --protocols 'TCP' \
    --source-addresses '*' \
    --destination-addresses "AzureCloud" \
    --destination-ports 443 445 \
    --action allow \
    --priority 100

# Add firewall application rules.

az network firewall application-rule create \
    --resource-group $RG \
    --firewall-name $FWNAME \
    --collection-name 'aksfwar'\
    --name 'fqdn' \
    --source-addresses '*' \
    --protocols 'https=443' \
    --fqdn-tags "AzureKubernetesService" \
    --action allow \
    --priority 100

Kojarzenie tabel tras z podsieciami

Aby skojarzyć klaster z zaporą, upewnij się, że dedykowana podsieć klastra odwołuje się do utworzonej tabeli tras. Podsieci środowiska uruchomieniowego aplikacji i usługi muszą być skojarzone z odpowiednimi tabelami tras. W poniższym przykładzie pokazano, jak skojarzyć tabelę tras z podsiecią:

# Associate the route table with a next hop to the firewall for the Azure Spring Apps subnet.

az network vnet subnet update \
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_APP_SUBNET_NAME \
    --route-table $APP_ROUTE_TABLE_NAME

az network vnet subnet update 
    --resource-group $RG \
    --vnet-name $VNET_NAME \
    --name $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --route-table $SERVICE_RUNTIME_ROUTE_TABLE_NAME

Dodawanie roli dostawcy zasobów usługi Azure Spring Apps

W poniższym przykładzie pokazano, jak dodać rolę dostawcy zasobów usługi Azure Spring Apps. Rola jest przypisywana do wszystkich użytkowników zidentyfikowanych przez ciąg e8de9221-a19c-4c81-b814-fd37c6caf9d2:

export VIRTUAL_NETWORK_RESOURCE_ID=$(az network vnet show \
    --name $VNET_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)

az role assignment create \
    --role "Owner" \
    --scope ${VIRTUAL_NETWORK_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

export APP_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $APP_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)
    
az role assignment create \
    --role "Owner" \
    --scope ${APP_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2
    
export SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID=$(az network route-table show \
    --name $SERVICE_RUNTIME_ROUTE_TABLE_NAME \
    --resource-group $RG \
    --query "id" \
    --output tsv)
    
az role assignment create \
    --role "Owner" \
    --scope ${SERVICE_RUNTIME_ROUTE_TABLE_RESOURCE_ID} \
    --assignee e8de9221-a19c-4c81-b814-fd37c6caf9d2

Tworzenie wystąpienia usługi Azure Spring Apps z routingiem zdefiniowanym przez użytkownika

W poniższym przykładzie pokazano, jak utworzyć wystąpienie usługi Azure Spring Apps z routingiem zdefiniowanym przez użytkownika:

az spring create \
    --name $ASA_NAME \
    --resource-group $RG \
    --vnet $VNET_NAME \
    --app-subnet $ASA_APP_SUBNET_NAME \
    --service-runtime-subnet $ASA_SERVICE_RUNTIME_SUBNET_NAME \
    --outbound-type userDefinedRouting

Teraz możesz uzyskać dostęp do publicznego adresu IP zapory z Internetu. Zapora kieruje ruch do podsieci usługi Azure Spring Apps zgodnie z regułami routingu.

Następne kroki