使用 Azure PowerShell 部署及設定 Azure 防火牆
控制輸出網路存取是整體網路安全性計畫的重要部分。 例如,您可能想要限制網站的存取權。 或者,您可能想要限制可存取的輸出 IP 位址和連接埠。
您可從 Azure 子網路控制輸出網路存取的方式之一是使用 Azure 防火牆。 您可以使用 Azure 防火牆來設定:
- 會定義可從子網路存取的完整網域名稱 (FQDN) 的應用程式規則。
- 網路規則,用以定義來源位址、通訊協定、目的地連接埠和目的地位址。
當您將網路流量路由傳送至防火牆作為子網路預設閘道時,網路流量會受限於已設定的防火牆規則。
在本文中,您會建立具有三個子網路的簡易單一 VNet,以便進行簡單部署。 對於生產環境部署,建議您使用中樞和支點模型,其中防火牆會位於自己的 VNet 中。 工作負載伺服器位於相同區域中的對等互連 VNet,其中包含一個或多個子網路。
- AzureFirewallSubnet - 防火牆位於此子網路。
- Workload-SN - 工作負載伺服器位於此子網路。 此子網路的網路流量會通過防火牆。
- AzureBastionSubnet - 適用於 Azure Bastion 的子網路,可用來連線到工作負載伺服器。
如需 Azure Bastion 的詳細資訊,請參閱什麼是 Azure Bastion?
重要
無論輸出資料使用量為何,每小時價格都是從部署 Bastion 的那一刻開始計費。 如需詳細資訊,請參閱價格和 SKU。 如果您要在教學課程或測試期間部署 Bastion,建議您在使用完畢後刪除此資源。
在本文中,您將學會如何:
- 設定測試網路環境
- 部署防火牆
- 建立預設路由
- 設定允許存取 www.google.com 的應用程式規則
- 設定允許存取外部 DNS 伺服器的網路規則
- 測試防火牆
如果您想要的話,可以使用 Azure 入口網站完成此程序。
如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
進行此程序時,您必須在本機執行 PowerShell。 您必須已安裝 Azure PowerShell 模組。 執行 Get-Module -ListAvailable Az
以尋找版本。 如果您需要升級,請參閱安裝 Azure PowerShell 模組。 驗證 PowerShell 版本之後,請執行 Connect-AzAccount
以建立與 Azure 的連線。
首先,請建立資源群組,以包含部署防火牆所需的資源。 接著建立 VNet、子網路,和測試伺服器。
此資源群組包含了部署需要的所有資源。
New-AzResourceGroup -Name Test-FW-RG -Location "East US"
此虛擬網路有三個子網路:
注意
AzureFirewallSubnet 子網路的大小是 /26。 如需有關子網路大小的詳細資訊,請參閱 Azure 防火牆的常見問題集。
$Bastionsub = New-AzVirtualNetworkSubnetConfig -Name AzureBastionSubnet -AddressPrefix 10.0.0.0/27
$FWsub = New-AzVirtualNetworkSubnetConfig -Name AzureFirewallSubnet -AddressPrefix 10.0.1.0/26
$Worksub = New-AzVirtualNetworkSubnetConfig -Name Workload-SN -AddressPrefix 10.0.2.0/24
現在,請建立虛擬網路:
$testVnet = New-AzVirtualNetwork -Name Test-FW-VN -ResourceGroupName Test-FW-RG `
-Location "East US" -AddressPrefix 10.0.0.0/16 -Subnet $Bastionsub, $FWsub, $Worksub
$publicip = New-AzPublicIpAddress -ResourceGroupName Test-FW-RG -Location "East US" `
-Name Bastion-pip -AllocationMethod static -Sku standard
New-AzBastion -ResourceGroupName Test-FW-RG -Name Bastion-01 -PublicIpAddress $publicip -VirtualNetwork $testVnet
現在,請建立工作負載虛擬機器並放在適當的子網路中。 出現提示時,請輸入虛擬機器的使用者名稱和密碼。
建立工作負載虛擬機器。 出現提示時,請輸入虛擬機器的使用者名稱和密碼。
#Create the NIC
$wsn = Get-AzVirtualNetworkSubnetConfig -Name Workload-SN -VirtualNetwork $testvnet
$NIC01 = New-AzNetworkInterface -Name Srv-Work -ResourceGroupName Test-FW-RG -Location "East us" -Subnet $wsn
#Define the virtual machine
$SecurePassword = ConvertTo-SecureString "<choose a password>" -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ("<choose a user name>", $SecurePassword);
$VirtualMachine = New-AzVMConfig -VMName Srv-Work -VMSize "Standard_DS2"
$VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName Srv-Work -ProvisionVMAgent -EnableAutoUpdate -Credential $Credential
$VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC01.Id
$VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName 'MicrosoftWindowsServer' -Offer 'WindowsServer' -Skus '2019-Datacenter' -Version latest
#Create the virtual machine
New-AzVM -ResourceGroupName Test-FW-RG -Location "East US" -VM $VirtualMachine -Verbose
注意
無論是未獲指派公用 IP 位址的 VM,或位於內部基本 Azure 負載平衡器後端集區的 VM,Azure 都會為其提供預設輸出存取 IP。 預設輸出存取 IP 機制能提供無法自行設定的輸出 IP 位址。
發生下列其中一個事件時,會停用預設輸出存取 IP:
- 公用 IP 位址會指派給 VM。
- 無論有沒有輸出規則,都會將 VM 放在標準負載平衡器的後端集區中。
- Azure NAT 閘道資源會指派給 VM 的子網。
您在彈性協調流程模式中使用虛擬機器擴展集建立的 VM 沒有預設輸出存取。
如需 Azure 中輸出連線的詳細資訊,請參閱 Azure 中的預設對外存取與針對輸出連線,使用來源網路位址轉譯 (SNAT)。
現在將防火牆部署到虛擬網路中。
# Get a Public IP for the firewall
$FWpip = New-AzPublicIpAddress -Name "fw-pip" -ResourceGroupName Test-FW-RG `
-Location "East US" -AllocationMethod Static -Sku Standard
# Create the firewall
$Azfw = New-AzFirewall -Name Test-FW01 -ResourceGroupName Test-FW-RG -Location "East US" -VirtualNetwork $testVnet -PublicIpAddress $FWpip
#Save the firewall private IP address for future use
$AzfwPrivateIP = $Azfw.IpConfigurations.privateipaddress
$AzfwPrivateIP
請記下私人 IP 位址。 稍後當您建立預設路由時將使用到它。
建立資料表並停用 BGP 路由傳播
$routeTableDG = New-AzRouteTable `
-Name Firewall-rt-table `
-ResourceGroupName Test-FW-RG `
-location "East US" `
-DisableBgpRoutePropagation
#Create a route
Add-AzRouteConfig `
-Name "DG-Route" `
-RouteTable $routeTableDG `
-AddressPrefix 0.0.0.0/0 `
-NextHopType "VirtualAppliance" `
-NextHopIpAddress $AzfwPrivateIP `
| Set-AzRouteTable
#Associate the route table to the subnet
Set-AzVirtualNetworkSubnetConfig `
-VirtualNetwork $testVnet `
-Name Workload-SN `
-AddressPrefix 10.0.2.0/24 `
-RouteTable $routeTableDG | Set-AzVirtualNetwork
此應用程式規則允許對 www.google.com 進行輸出存取。
$AppRule1 = New-AzFirewallApplicationRule -Name Allow-Google -SourceAddress 10.0.2.0/24 `
-Protocol http, https -TargetFqdn www.google.com
$AppRuleCollection = New-AzFirewallApplicationRuleCollection -Name App-Coll01 `
-Priority 200 -ActionType Allow -Rule $AppRule1
$Azfw.ApplicationRuleCollections.Add($AppRuleCollection)
Set-AzFirewall -AzureFirewall $Azfw
Azure 防火牆包含一組內建規則集合,適用於預設為允許的基礎結構 FQDN。 這些 FQDN 為平台所特有,無法用於其他用途。 如需詳細資訊,請參閱基礎結構 FQDN。
此網路規則允許透過連接埠 53 (DNS),對兩個 IP 位址進行輸出存取。
$NetRule1 = New-AzFirewallNetworkRule -Name "Allow-DNS" -Protocol UDP -SourceAddress 10.0.2.0/24 `
-DestinationAddress 209.244.0.3,209.244.0.4 -DestinationPort 53
$NetRuleCollection = New-AzFirewallNetworkRuleCollection -Name RCNet01 -Priority 200 `
-Rule $NetRule1 -ActionType "Allow"
$Azfw.NetworkRuleCollections.Add($NetRuleCollection)
Set-AzFirewall -AzureFirewall $Azfw
在此程序中,您可以就測試目的設定伺服器的主要和次要 DNS 位址。 這不是一般的 Azure 防火牆需求。
$NIC01.DnsSettings.DnsServers.Add("209.244.0.3")
$NIC01.DnsSettings.DnsServers.Add("209.244.0.4")
$NIC01 | Set-AzNetworkInterface
現在請測試防火牆,以確認其運作符合預期。
使用 Bastion 連線到 Srv-Work 虛擬機器,然後登入。
在 Srv-Work 上開啟 PowerShell 視窗並執行下列命令:
nslookup www.google.com nslookup www.microsoft.com
這兩個命令都應該傳回答案,顯示您的 DNS 查詢正在通過防火牆。
執行下列命令:
Invoke-WebRequest -Uri https://www.google.com Invoke-WebRequest -Uri https://www.google.com Invoke-WebRequest -Uri https://www.microsoft.com Invoke-WebRequest -Uri https://www.microsoft.com
www.google.com
要求應該會成功,而www.microsoft.com
要求應該會失敗。 這代表您的防火牆規則會如預期執行。
因此,現在您已確認防火牆規則正在運作:
- 您可以使用設定的外部 DNS 伺服器來解析 DNS 名稱。
- 您可以瀏覽至允許 FQDN 的防火牆規則,但不可瀏覽至任何其他的防火牆規則。
您可以保留防火牆資源供下一個教學課程使用,若不再需要,則可刪除 Test-FW-RG 資源群組以刪除所有防火牆相關資源:
Remove-AzResourceGroup -Name Test-FW-RG