本文介绍如何使用 Azure PowerShell 高效添加和修改多个 Azure 防火墙规则。 按照本文中的步骤作,可以缩短更新时间并避免配置冲突。
先决条件
在开始之前,请确保具备:
- 一个包含现有 Azure 防火墙或 Azure 防火墙策略的 Azure 订阅
- 安装和配置 Azure PowerShell
- 修改防火墙策略的适当权限
- 在应用于生产环境之前验证更改的测试环境
概述
将新规则添加到 Azure 防火墙或 Azure 防火墙策略时,请使用以下方法来减少总更新时间并避免潜在的冲突:
- 检索 Azure 防火墙或 Azure 防火墙策略对象。
- 添加所有新规则,并在本地对象中执行其他所需修改。 可以将它们添加到现有规则集合,或根据需要创建新规则集合。
- 仅当完成所有修改时,才推送防火墙或防火墙策略更新。
此方法可确保原子更新并降低配置冲突的风险。
以下部分介绍如何添加新的 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 防火墙策略和规则管理,请参阅以下文章: