控制輸出網路存取是整體網路安全性計畫的重要部分。 例如,您可以限制對網站的存取。 或者,限制可存取的輸出 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"
    

    建立虛擬網路和 Azure Bastion 主機

    此虛擬網路有三個子網路:

    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
    

    建立 Azure Bastion 主機的公用 IP 位址

    $publicip = New-AzPublicIpAddress -ResourceGroupName Test-FW-RG -Location "East US" `
       -Name Bastion-pip -AllocationMethod static -Sku standard
    

    建立 Azure Bastion 主機

    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
    $VirtualMachine = New-AzVMConfig -VMName Srv-Work -VMSize "Standard_DS2"
    $VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName Srv-Work -ProvisionVMAgent -EnableAutoUpdate
    $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
    

    建立防火牆原則

    $fwpol = New-AzFirewallPolicy -Name fw-pol -ResourceGroupName Test-FW-RG -Location eastus
    

    設定防火牆原則應用程式規則

    此應用程式規則允許對 www.google.com 進行輸出存取。

    $RCGroup = New-AzFirewallPolicyRuleCollectionGroup -Name AppRCGroup -Priority 100 -FirewallPolicyObject $fwpol
    $apprule1 = New-AzFirewallPolicyApplicationRule -Name Allow-google -SourceAddress "10.0.2.0/24" -Protocol "http:80","https:443" -TargetFqdn www.google.com
    $appcoll1 = New-AzFirewallPolicyFilterRuleCollection -Name App-coll01 -Priority 100 -Rule $appRule1 -ActionType "Allow"
    Set-AzFirewallPolicyRuleCollectionGroup -Name $RCGroup.Name -Priority 100 -RuleCollection $appcoll1 -FirewallPolicyObject $fwPol
    

    Azure 防火牆包含內建的規則集合,適用於依預設允許的基礎結構 FQDN。 這些 FQDN 是平台特定的,且無法用於其他用途。 如需詳細資訊,請參閱基礎結構 FQDN

    設定防火牆原則網路規則

    此網路規則允許透過連接埠 53 (DNS),對兩個 IP 位址進行輸出存取。

    $RCGroup = New-AzFirewallPolicyRuleCollectionGroup -Name NetRCGroup -Priority 200 -FirewallPolicyObject $fwpol
    $netrule1 = New-AzFirewallPolicyNetworkRule -name Allow-DNS -protocol UDP -sourceaddress 10.0.2.0/24 -destinationaddress 209.244.0.3,209.244.0.4 -destinationport 53
    $netcoll1 = New-AzFirewallPolicyFilterRuleCollection -Name Net-coll01 -Priority 200 -Rule $netrule1 -ActionType "Allow"
    Set-AzFirewallPolicyRuleCollectionGroup -Name $RCGroup.Name -Priority 200 -RuleCollection $netcoll1 -FirewallPolicyObject $fwPol
    

    部署防火牆

    現在將防火牆部署到虛擬網路中。

    # 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 -FirewallPolicyId $fwpol.Id
    #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
    

    變更 Srv-Work 網路介面的主要和次要 DNS 位址

    在此程序中,您可以就測試目的設定伺服器的主要和次要 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
    
  • 教學課程:監視 Azure 防火牆記錄
  •