迁移到 Azure 防火墙高级版
可以将 Azure 防火墙标准版迁移到 Azure 防火墙高级版,以利用新的高级功能。 有关 Azure 防火墙高级版功能的详细信息,请参阅 Azure 防火墙高级版功能。
本文将介绍将标准版防火墙和策略手动迁移到高级版所需的步骤。
提示
在无故障时间的情况下更改 Azure 防火墙 SKU 的最简单方法是使用“更改 SKU”功能。 有关详细信息,请参阅 Azure 防火墙轻松升级/降级。
开始迁移前,请了解性能注意事项并提前计划所需的维护时段。 通常,预计停机时间为 20-30 分钟。
成功迁移需要以下常规步骤:
- 根据现有的标准版策略或经典规则新建高级版策略。 完成此步骤时,新的高级版策略将包括所有现有的规则和策略设置。
- 使用停止/启动将 Azure 防火墙从标准版迁移到高级版。
- 将新建的高级版策略附加到高级版防火墙。
性能注意事项
从标准 SKU 进行迁移时,需要考虑性能。 IDPS 和 TLS 检查是计算密集型操作。 高级 SKU 使用更强大的 VM SKU,相比于标准 SKU,高级 SKU 可以缩放至更高的吞吐量。 若要详细了解 Azure 防火墙性能,请参阅 Azure 防火墙性能
Azure 建议客户在其 Azure 部署中执行完全缩放测试,以确保防火墙服务的性能满足预期。
故障时间
在计划内维护时间内迁移防火墙,因为使用停止/启动将 Azure 防火墙从标准版迁移到高级版时会有一些故障时间。
将经典规则迁移到标准策略
在迁移过程中,可能需要将经典防火墙规则迁移到标准策略。 可以使用 Azure 门户来实现此目的:
还可以使用 Azure PowerShell 迁移 Azure 防火墙中的现有经典规则以创建策略。 有关详细信息,请参阅使用 PowerShell 将 Azure 防火墙配置迁移到 Azure 防火墙策略
使用 Azure PowerShell 迁移现有策略
Transform-Policy.ps1
是从现有标准策略创建新高级策略的 Azure PowerShell 脚本。
如果是标准防火墙策略 ID,该脚本会将其转换为高级 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
使用 stop/start 迁移 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 门户将高级版策略附加到新的高级版防火墙: