使用 Azure PowerShell 添加或修改多个 Azure 防火墙规则

本文介绍如何使用 Azure PowerShell 高效添加和修改多个 Azure 防火墙规则。 按照本文中的步骤作,可以缩短更新时间并避免配置冲突。

先决条件

在开始之前,请确保具备:

  • 一个包含现有 Azure 防火墙或 Azure 防火墙策略的 Azure 订阅
  • 安装和配置 Azure PowerShell
  • 修改防火墙策略的适当权限
  • 在应用于生产环境之前验证更改的测试环境

概述

将新规则添加到 Azure 防火墙或 Azure 防火墙策略时,请使用以下方法来减少总更新时间并避免潜在的冲突:

  1. 检索 Azure 防火墙或 Azure 防火墙策略对象。
  2. 添加所有新规则,并在本地对象中执行其他所需修改。 可以将它们添加到现有规则集合,或根据需要创建新规则集合。
  3. 仅当完成所有修改时,才推送防火墙或防火墙策略更新。

此方法可确保原子更新并降低配置冲突的风险。

以下部分介绍如何添加新的 DNAT 规则并在防火墙策略中更新现有规则。 在以下情况下,应遵循以下相同的原则:

  • 更新应用程序或网络规则
  • 使用经典规则更新托管的防火墙
  • 修改现有规则配置

重要

请首先在测试策略上测试这些过程,以确保它们符合特定要求的预期。

连接到 Azure 并设置上下文

连接到 Azure 帐户,并将上下文设置为目标订阅:

Connect-AzAccount -Environment AzureChinaCloud
Set-AzContext -Subscription "<Subscription ID>"

检索防火墙策略对象

为防火墙策略、规则收集组和要修改的特定规则集合创建本地对象:

$policy = Get-AzFirewallPolicy -Name "<Policy Name>" -ResourceGroupName "<Resource Group Name>"
$natrulecollectiongroup = Get-AzFirewallPolicyRuleCollectionGroup -Name "<Rule Collection Group Name>" -ResourceGroupName "<Resource Group Name>" -AzureFirewallPolicyName "<Firewall Policy Name>"
$existingrulecollection = $natrulecollectiongroup.Properties.RuleCollection | Where-Object {$_.Name -eq "<rule collection name>"}

添加新规则

定义新规则

定义要添加到规则集合的新 DNAT 规则:

$newrule1 = New-AzFirewallPolicyNatRule -Name "dnat-rule1" -Protocol "TCP" -SourceAddress "<Source Address>" -DestinationAddress "<Destination Address>" -DestinationPort "<Destination Port>" -TranslatedAddress "<Translated Address>" -TranslatedPort "<Translated Port>"
$newrule2 = New-AzFirewallPolicyNatRule -Name "dnat-rule2" -Protocol "TCP" -SourceAddress "<Source Address>" -DestinationAddress "<Destination Address>" -DestinationPort "<Destination Port>" -TranslatedAddress "<Translated Address>" -TranslatedPort "<Translated Port>"

将规则添加到规则集合

将新规则添加到本地规则集合对象:

$existingrulecollection.Rules.Add($newrule1)
$existingrulecollection.Rules.Add($newrule2)

注释

可以根据需要在此步骤中添加任意数量的规则。 在最后一步更新 Azure 之前,对本地对象进行了所有更改。

更新现有规则

修改规则集合中的现有规则:

查找和修改现有规则

按名称查找现有规则并修改其属性:

# Find the existing rule
$existingRule = $existingrulecollection.Rules | Where-Object {$_.Name -eq "existing-rule-name"}

# Modify rule properties
if ($existingRule) {
    $existingRule.SourceAddresses = @("10.0.0.0/8", "192.168.0.0/16")
    $existingRule.DestinationPorts = @("80", "443")
    $existingRule.TranslatedAddress = "10.1.1.100"
    $existingRule.TranslatedPort = "8080"
    Write-Host "Rule '$($existingRule.Name)' updated successfully."
} else {
    Write-Warning "Rule 'existing-rule-name' not found."
}

删除现有规则

若要从集合中删除规则,请执行以下作:

# Find and remove the rule
$ruleToRemove = $existingrulecollection.Rules | Where-Object {$_.Name -eq "rule-to-delete"}
if ($ruleToRemove) {
    $existingrulecollection.Rules.Remove($ruleToRemove)
    Write-Host "Rule '$($ruleToRemove.Name)' removed successfully."
} else {
    Write-Warning "Rule 'rule-to-delete' not found."
}

列出集合中的所有规则

若要查看集合中的所有当前规则,请执行以下作:

# Display all rules
$existingrulecollection.Rules | Select-Object Name, Protocol, SourceAddresses, DestinationAddresses, DestinationPorts, TranslatedAddress, TranslatedPort | Format-Table

将更改应用到 Azure

对本地对象进行所有更改后,更新 Azure 中的规则集合组:

try {
    Set-AzFirewallPolicyRuleCollectionGroup -Name "<Rule Collection Group Name>" -FirewallPolicyObject $policy -Priority 200 -RuleCollection $natrulecollectiongroup.Properties.RuleCollection
    Write-Host "Firewall policy updated successfully."
} catch {
    Write-Error "Failed to update firewall policy: $($_.Exception.Message)"
}

重要

此步骤将所有更改应用到 Azure。 在生产环境中运行此命令之前,请确保已彻底测试配置。

验证更改

更新策略后,请验证更改是否已正确应用:

# Refresh the policy object and verify changes
$updatedPolicy = Get-AzFirewallPolicy -Name "<Policy Name>" -ResourceGroupName "<Resource Group Name>"
$updatedRuleGroup = Get-AzFirewallPolicyRuleCollectionGroup -Name "<Rule Collection Group Name>" -ResourceGroupName "<Resource Group Name>" -AzureFirewallPolicyName "<Firewall Policy Name>"

# Display the updated rules
$updatedRuleCollection = $updatedRuleGroup.Properties.RuleCollection | Where-Object {$_.Name -eq "<rule collection name>"}
$updatedRuleCollection.Rules | Select-Object Name, Protocol, SourceAddresses, DestinationAddresses | Format-Table

清理资源

如果为本教程创建了测试资源,则可以将其删除,以避免产生费用。 删除资源组时,还会删除防火墙和所有相关资源。

Remove-AzResourceGroup -Name "<Resource Group Name>" -Force

注意

仅当想要删除资源组中的所有资源时,才运行此命令。 此操作不可撤消。

后续步骤

若要详细了解 Azure 防火墙策略和规则管理,请参阅以下文章: