Share via


移轉至 Azure 防火牆進階版

您可以將 Azure 防火牆標準版移轉至 Azure 防火牆進階版,以利用新的進階版功能。 如需 Azure 防火牆進階版功能的詳細資訊,請參閱 Azure 防火牆進階版功能

本文將引導您執行必要步驟,手動將標準版防火牆和原則移轉至進階版。

提示

變更 Azure 防火牆 SKU 且不需要停機的最簡單方式,就是使用變更 SKU 功能。 如需詳細資訊,請參閱 Azure 防火牆輕鬆升級/降級設定

開始移轉之前,請先瞭解效能考量事項,並事先規劃必要的維護期間。 預期通常會停機 20-30 分鐘。

需要執行下列一般步驟,才能成功移轉:

  1. 根據您的現有標準版原則或傳統規則建立新的進階版原則。 在此步驟結束時,您的新進階版原則將會包含您所有現有的規則和原則設定。
  2. 使用停止/啟動,將Azure 防火牆從標準版移轉至進階版
  3. 將新建立的進階版原則附加至進階版防火牆

重要

目前不支援升級在東南亞部署可用性區域的標準版防火牆。

如果您使用 Terraform 來部署 Azure 防火牆,您可以使用 Terraform 移轉至 Azure 防火牆進階版。 如需詳細資訊,請參閱使用 Terraform 將 Azure 防火牆標準版移轉至進階版

效能考量

從標準 SKU 移轉時,必須考量效能。 IDPS 和 TLS 檢查是計算密集型作業。 進階版 SKU 會使用更強大的 VM SKU,其可調整為比標準版 SKU 相還高的輸送量。 如需更多有關 Azure 防火牆效能的資訊,請參閱 Azure 防火牆效能

Microsoft 建議客戶在其 Azure 部署中執行完整規模的測試,以確保防火牆服務效能符合您的期望。

停機

在計劃性維護期間移轉防火牆,因為當您使用停止/啟動將 Azure 防火牆從標準版移轉至進階版時,將會有停機時間。

將傳統規則移轉至標準版原則

在移轉過程中,您可能需要將傳統防火牆規則移轉至標準版原則。 您可以使用 Azure 入口網站來執行這項工作:

  1. 從 Azure 入口網站中,選取您的標準版防火牆。 在 [概觀] 頁面上,選取 [移轉至防火牆原則]。

    Migrate to firewall policy

  2. 在 [移轉至防火牆原則] 頁面上,選取 [檢閱 + 建立]。

  3. 選取 建立

    部署需要數分鐘的時間才能完成。

您也可以使用 Azure PowerShell,從 Azure 防火牆移轉現有的傳統版規則,以建立原則。 如需詳細資訊,請參閱使用 PowerShell,將 Azure 防火牆設定移轉至 Azure 防火牆原則

使用 Azure PowerShell 移轉現有的原則

Transform-Policy.ps1 是Azure PowerShell 指令碼,可從現有的標準版原則中建立新的進階版原則。

假設有標準版防火牆原則識別碼,指令碼會將其轉換成進階版 Azure 防火牆原則。 指令碼會先連線到您的 Azure 帳戶、提取原則、轉換/新增各種參數,然後上傳新的進階版原則。 新的進階原則名為 <previous_policy_name>_premium。 如果是子原則轉換,則會保留父原則的連結。

使用範例:

Transform-Policy -PolicyId /subscriptions/XXXXX-XXXXXX-XXXXX/resourceGroups/some-resource-group/providers/Microsoft.Network/firewallPolicies/policy-name

重要

指令碼不會移轉威脅情報和 SNAT 私人範圍設定。 在繼續並手動移轉這些設定之前,您必須留意這些設定。 否則,您可能會在新的升級防火牆中遇到不一致的流量篩選。

此指令碼需要最新的 Azure PowerShell。 執行 Get-Module -ListAvailable Az 可查看已安裝的版本。 如果您需要安裝,請參閱安裝 Azure PowerShell 模組

<#
    .SYNOPSIS
        Given an Azure firewall policy id the script will transform it to a Premium Azure firewall policy.
        The script will first pull the policy, transform/add various parameters and then upload a new premium policy.
        The created policy will be named <previous_policy_name>_premium if no new name provided else new policy will be named as the parameter passed.
    .Example
        Transform-Policy -PolicyId /subscriptions/XXXXX-XXXXXX-XXXXX/resourceGroups/some-resource-group/providers/Microsoft.Network/firewallPolicies/policy-name -NewPolicyName <optional param for the new policy name>
#>

param (
    #Resource id of the azure firewall policy.
    [Parameter(Mandatory=$true)]
    [string]
    $PolicyId,

    #new filewallpolicy name, if not specified will be the previous name with the '_premium' suffix
    [Parameter(Mandatory=$false)]
    [string]
    $NewPolicyName = ""
)
$ErrorActionPreference = "Stop"
$script:PolicyId = $PolicyId
$script:PolicyName = $NewPolicyName

function ValidatePolicy {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [Object]
        $Policy
    )

    Write-Host "Validating resource is as expected"

    if ($null -eq $Policy) {
        Write-Error "Received null policy"
        exit(1)
    }
    if ($Policy.GetType().Name -ne "PSAzureFirewallPolicy") {
        Write-Error "Resource must be of type Microsoft.Network/firewallPolicies"
        exit(1)
    }

    if ($Policy.Sku.Tier -eq "Premium") {
        Write-Host "Policy is already premium" -ForegroundColor Green
        exit(1)
    }
}

function GetPolicyNewName {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Azure.Commands.Network.Models.PSAzureFirewallPolicy]
        $Policy
    )

    if (-not [string]::IsNullOrEmpty($script:PolicyName)) {
        return $script:PolicyName
    }

    return $Policy.Name + "_premium"
}

function TransformPolicyToPremium {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Azure.Commands.Network.Models.PSAzureFirewallPolicy]
        $Policy
    )
    $NewPolicyParameters = @{
                        Name = (GetPolicyNewName -Policy $Policy)
                        ResourceGroupName = $Policy.ResourceGroupName
                        Location = $Policy.Location
                        BasePolicy = $Policy.BasePolicy.Id
                        ThreatIntelMode = $Policy.ThreatIntelMode
                        ThreatIntelWhitelist = $Policy.ThreatIntelWhitelist
                        PrivateRange = $Policy.PrivateRange
                        DnsSetting = $Policy.DnsSettings
                        SqlSetting = $Policy.SqlSetting
                        ExplicitProxy  = $Policy.ExplicitProxy
                        DefaultProfile  = $Policy.DefaultProfile
                        Tag = $Policy.Tag
                        SkuTier = "Premium"
    }

    Write-Host "Creating new policy"
    $premiumPolicy = New-AzFirewallPolicy @NewPolicyParameters

    Write-Host "Populating rules in new policy"
    foreach ($ruleCollectionGroup in $Policy.RuleCollectionGroups) {
        $ruleResource = Get-AzResource -ResourceId $ruleCollectionGroup.Id
        $ruleToTransfom = Get-AzFirewallPolicyRuleCollectionGroup -AzureFirewallPolicy $Policy -Name $ruleResource.Name
        $ruleCollectionGroup = @{
            FirewallPolicyObject = $premiumPolicy
            Priority = $ruleToTransfom.Properties.Priority
            Name = $ruleToTransfom.Name
        }

        if ($ruleToTransfom.Properties.RuleCollection.Count) {
            $ruleCollectionGroup["RuleCollection"] = $ruleToTransfom.Properties.RuleCollection
        }

        Set-AzFirewallPolicyRuleCollectionGroup @ruleCollectionGroup
    }
}

function ValidateAzNetworkModuleExists {
    Write-Host "Validating needed module exists"
    $networkModule = Get-InstalledModule -Name "Az.Network" -MinimumVersion 4.5 -ErrorAction SilentlyContinue
    if ($null -eq $networkModule) {
        Write-Host "Please install Az.Network module version 4.5.0 or higher, see instructions: https://github.com/Azure/azure-powershell#installation"
        exit(1)
    }
    $resourceModule = Get-InstalledModule -Name "Az.Resources" -MinimumVersion 4.2 -ErrorAction SilentlyContinue
    if ($null -eq $resourceModule) {
        Write-Host "Please install Az.Resources module version 4.2.0 or higher, see instructions: https://github.com/Azure/azure-powershell#installation"
        exit(1)
    }
    Import-Module Az.Network -MinimumVersion 4.5.0
    Import-Module Az.Resources -MinimumVersion 4.2.0
}

ValidateAzNetworkModuleExists
$policy = Get-AzFirewallPolicy -ResourceId $script:PolicyId
ValidatePolicy -Policy $policy
TransformPolicyToPremium -Policy $policy

使用停止/啟動來移轉 Azure 防火牆

如果您使用搭配防火牆原則的 Azure 防火牆標準版 SKU,您可以使用配置/解除配置方法來將防火牆 SKU 移轉至進階版。 VNet 中樞和安全中樞防火牆都支援此移轉方法。 當您移轉安全中樞部署時,其會保留防火牆公用 IP 位址。

Azure PowerShell 的最低版本需求為 6.5.0。 如需詳細資訊,請參閱 Az 6.5.0

移轉 VNET 中樞防火牆

  • 解除配置標準版防火牆

    $azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
    $azfw.Deallocate()
    Set-AzFirewall -AzureFirewall $azfw
    
  • 配置防火牆進階版 (單一公用 IP 位址)

    $azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
    $azfw.Sku.Tier="Premium"
    $vnet = Get-AzVirtualNetwork -ResourceGroupName "<resource-group-name>" -Name "<Virtual-Network-Name>"
    $publicip = Get-AzPublicIpAddress -Name "<Firewall-PublicIP-name>" -ResourceGroupName "<resource-group-name>"
    $azfw.Allocate($vnet,$publicip)
    Set-AzFirewall -AzureFirewall $azfw
    
  • 配置防火牆進階版 (多個公用 IP 位址)

    $azfw = Get-AzFirewall -Name "FW Name" -ResourceGroupName "RG Name"
    $azfw.Sku.Tier="Premium"
    $vnet = Get-AzVirtualNetwork -ResourceGroupName "RG Name" -Name "VNet Name"
    $publicip1 = Get-AzPublicIpAddress -Name "Public IP1 Name" -ResourceGroupName "RG Name"
    $publicip2 = Get-AzPublicIpAddress -Name "Public IP2 Name" -ResourceGroupName "RG Name"
    $azfw.Allocate($vnet,@($publicip1,$publicip2))
    Set-AzFirewall -AzureFirewall $azfw
    
  • 在強制通道模式中配置防火牆進階版

    $azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
    $azfw.Sku.Tier="Premium"
    $vnet = Get-AzVirtualNetwork -ResourceGroupName "<resource-group-name>" -Name "<Virtual-Network-Name>"
    $publicip = Get-AzPublicIpAddress -Name "<Firewall-PublicIP-name>" -ResourceGroupName "<resource-group-name>"
    $mgmtPip = Get-AzPublicIpAddress -ResourceGroupName "<resource-group-name>"-Name "<Management-PublicIP-name>"
    $azfw.Allocate($vnet,$publicip,$mgmtPip)
    Set-AzFirewall -AzureFirewall $azfw
    

移轉安全中樞防火牆

  • 解除配置標準版防火牆

    $azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
    $azfw.Deallocate()
    Set-AzFirewall -AzureFirewall $azfw
    
  • 配置防火牆進階版

    $azfw = Get-AzFirewall -Name "<firewall-name>" -ResourceGroupName "<resource-group-name>"
    $hub = get-azvirtualhub -ResourceGroupName "<resource-group-name>" -name "<vWANhub-name>"
    $azfw.Sku.Tier="Premium"
    $azfw.Allocate($hub.id)
    Set-AzFirewall -AzureFirewall $azfw
    

將進階原則附加至進階防火牆

您可以使用 Azure 入口網站,將進階版原則附加至新的進階版防火牆:

Screenshot showing firewall policy

下一步