使用 PowerShell 以路由表路由傳送網路流量

根據預設,Azure 會自動路由傳送虛擬網路內所有子網路之間的流量。 您可以建立您自己的路由,以覆寫 Azure 的預設路由。 舉例來說,如果您想要通過網路虛擬設備 (NVA) 路由傳送子網路之間的流量,則建立自訂路由的能力很有幫助。 在本文中,您將學會如何:

  • 建立路由表
  • 建立路由
  • 建立有多個子網路的虛擬網路
  • 建立路由表與子網路的關聯
  • 建立會路由傳送流量的 NVA
  • 將虛擬機器 (VM) 部署到不同子網路
  • 透過 NVA 從一個子網路將流量路由傳送到另一個子網路

如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

Azure Cloud Shell

Azure Cloud Shell 是裝載於 Azure 中的互動式殼層環境,可在瀏覽器中使用。 您可以使用 Bash 或 PowerShell 搭配 Cloud Shell,與 Azure 服務共同使用。 您可以使用 Cloud Shell 預先安裝的命令,執行本文提到的程式碼,而不必在本機環境上安裝任何工具。

要啟動 Azure Cloud Shell:

選項 範例/連結
選取程式碼或命令區塊右上角的 [試試看]。 選取 [試試看] 並不會自動將程式碼或命令複製到 Cloud Shell 中。 Screenshot that shows an example of Try It for Azure Cloud Shell.
請前往 https://shell.azure.com,或選取 [啟動 Cloud Shell] 按鈕,在瀏覽器中開啟 Cloud Shell。 Button to launch Azure Cloud Shell.
選取 Azure 入口網站右上方功能表列上的 [Cloud Shell] 按鈕。 Screenshot that shows the Cloud Shell button in the Azure portal

若要使用 Azure Cloud Shell:

  1. 啟動 Cloud Shell。

  2. 選取程式碼區塊 (或命令區塊) 上的 [複製] 按鈕以複製程式碼或命令。

  3. 透過在 Windows 和 Linux 上選取 Ctrl+Shift+V;或在 macOS 上選取 Cmd+Shift+V,將程式碼或命令貼到 Cloud Shell 工作階段中。

  4. 選取 Enter 鍵執行程式碼或命令。

如果您選擇在本機安裝和使用 PowerShell,本文會要求使用 Azure PowerShell 模組 1.0.0 版或更新版本。 執行 Get-Module -ListAvailable Az 以尋找安裝的版本。 如果您需要升級,請參閱安裝 Azure PowerShell 模組。 如果您在本機執行 PowerShell,則也需要執行 Connect-AzAccount 以建立與 Azure 的連線。

建立路由表

建立路由表之前,請先使用 New-AzResourceGroup 建立資源群組。 下列範例會針對在本文中建立的所有資源,建立名為 myResourceGroup 的資源群組。

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

使用 New-AzRouteTable 建立路由表。 下列範例會建立名為 myRouteTablePublic 的路由表。

$routeTablePublic = New-AzRouteTable `
  -Name 'myRouteTablePublic' `
  -ResourceGroupName myResourceGroup `
  -location EastUS

建立路由

使用 Get-AzRouteTable 擷取路由表物件來建立路由、使用 Add-AzRouteConfig 建立路由,然後使用 Set-AzRouteTable 來將路由設定寫入路由表。

Get-AzRouteTable `
  -ResourceGroupName "myResourceGroup" `
  -Name "myRouteTablePublic" `
  | Add-AzRouteConfig `
  -Name "ToPrivateSubnet" `
  -AddressPrefix 10.0.1.0/24 `
  -NextHopType "VirtualAppliance" `
  -NextHopIpAddress 10.0.2.4 `
 | Set-AzRouteTable

建立路由表與子網路的關聯

您必須先建立虛擬網路和子網路,才能讓路由表與子網路產生關聯。 使用 New-AzVirtualNetwork 建立虛擬網路。 下列範例會建立名為 myVirtualNetwork 的虛擬網路,位址首碼為 10.0.0.0/16

$virtualNetwork = New-AzVirtualNetwork `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name myVirtualNetwork `
  -AddressPrefix 10.0.0.0/16

使用 New-AzVirtualNetworkSubnetConfig 建立三個子網路設定,以建立三個子網路。 下列範例會針對「公用」、「私人」和「DMZ」子網路建立三個子網路組態:

$subnetConfigPublic = Add-AzVirtualNetworkSubnetConfig `
  -Name Public `
  -AddressPrefix 10.0.0.0/24 `
  -VirtualNetwork $virtualNetwork

$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig `
  -Name Private `
  -AddressPrefix 10.0.1.0/24 `
  -VirtualNetwork $virtualNetwork

$subnetConfigDmz = Add-AzVirtualNetworkSubnetConfig `
  -Name DMZ `
  -AddressPrefix 10.0.2.0/24 `
  -VirtualNetwork $virtualNetwork

使用 Set-AzVirtualNetwork 來將子網路設定寫入虛擬網路,這樣會在虛擬網路中建立子網路:

$virtualNetwork | Set-AzVirtualNetwork

使用 Set-AzVirtualNetworkSubnetConfig,讓 myRouteTablePublic 路由表與「公用」子網路產生關聯,然後使用 Set-AzVirtualNetwork 來將子網路設定寫入虛擬網路。

Set-AzVirtualNetworkSubnetConfig `
  -VirtualNetwork $virtualNetwork `
  -Name 'Public' `
  -AddressPrefix 10.0.0.0/24 `
  -RouteTable $myRouteTablePublic | `
Set-AzVirtualNetwork

建立 NVA

NVA 是會執行網路功能的虛擬機器,例如路由、防火牆或 WAN 最佳化。

建立虛擬機器之前,請建立網路介面。

建立網路介面

在建立網路介面之前,您必須使用 Get-AzVirtualNetwork 擷取虛擬網路識別碼,然後使用 Get-AzVirtualNetworkSubnetConfig 擷取子網路識別碼。 在已啟用 IP 轉送的 DMZ 子網路中,使用 New-AzNetworkInterface 建立網路介面:

# Retrieve the virtual network object into a variable.
$virtualNetwork=Get-AzVirtualNetwork `
  -Name myVirtualNetwork `
  -ResourceGroupName myResourceGroup

# Retrieve the subnet configuration into a variable.
$subnetConfigDmz = Get-AzVirtualNetworkSubnetConfig `
  -Name DMZ `
  -VirtualNetwork $virtualNetwork

# Create the network interface.
$nic = New-AzNetworkInterface `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -Name 'myVmNva' `
  -SubnetId $subnetConfigDmz.Id `
  -EnableIPForwarding

建立 VM

若要建立 VM 並連結現有的網路介面,您必須先使用 New-AzVMConfig 建立 VM 設定。 組態包含在先前步驟中建立的網路介面。 出現提供使用者名稱和密碼的提示時,選取您想要用來登入虛擬機器的使用者名稱和密碼。

# Create a credential object.
$cred = Get-Credential -Message "Enter a username and password for the VM."

# Create a VM configuration.
$vmConfig = New-AzVMConfig `
  -VMName 'myVmNva' `
  -VMSize Standard_DS2 | `
  Set-AzVMOperatingSystem -Windows `
    -ComputerName 'myVmNva' `
    -Credential $cred | `
  Set-AzVMSourceImage `
    -PublisherName MicrosoftWindowsServer `
    -Offer WindowsServer `
    -Skus 2016-Datacenter `
    -Version latest | `
  Add-AzVMNetworkInterface -Id $nic.Id

使用 New-AzVM,利用 VM 設定來建立 VM。 下列範例會建立名為 myVmNva 的虛擬機器。

$vmNva = New-AzVM `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -VM $vmConfig `
  -AsJob

-AsJob 選項會在背景建立虛擬機器,以便您繼續進行下一步。

建立虛擬機器

在虛擬網路中建立兩部虛擬機器,您就可以在後續步驟中驗證來自「公用」子網路的流量是否透過網路虛擬設備路由傳送至「私人」子網路。

使用 New-AzVM,在「公用」子網路中建立 VM。 下列範例會在 myVirtualNetwork 虛擬網路的「公用」子網路中建立名為 myVmPublic 的虛擬機器。

New-AzVm `
  -ResourceGroupName "myResourceGroup" `
  -Location "East US" `
  -VirtualNetworkName "myVirtualNetwork" `
  -SubnetName "Public" `
  -ImageName "Win2016Datacenter" `
  -Name "myVmPublic" `
  -AsJob

在「私人」子網路中建立虛擬機器。

New-AzVm `
  -ResourceGroupName "myResourceGroup" `
  -Location "East US" `
  -VirtualNetworkName "myVirtualNetwork" `
  -SubnetName "Private" `
  -ImageName "Win2016Datacenter" `
  -Name "myVmPrivate"

建立 VM 需要幾分鐘的時間。 在建立虛擬機器且 Azure 將輸出傳回 PowerShell 之前,請勿繼續進行下一個步驟。

透過 NVA 路由傳送流量

使用 Get-AzPublicIpAddress,傳回 myVmPrivate VM 的公用 IP 位址。 以下範例會傳回 myVmPrivate 虛擬機器的公用 IP 位址:

Get-AzPublicIpAddress `
  -Name myVmPrivate `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

請從您的本機電腦使用下列命令,來建立與 myVmPrivate 虛擬機器的遠端桌面工作階段。 以上一個命令傳回的 IP 位址取代 <publicIpAddress>

mstsc /v:<publicIpAddress>

開啟所下載的 RDP 檔案。 如果出現提示,請選取 [連接]

輸入您在建立虛擬機器時指定的使用者名稱和密碼 (您可能需要選取 [更多選擇],然後選取 [使用不同的帳戶] 以指定您在建立虛擬機器時輸入的認證),然後選取 [確定]。 您可能會在登入程序期間收到憑證警告。 選取 [是] 以繼續進行連線。

在稍後的步驟中,會使用 tracert.exe 命令來測試路由。 Tracert 會使用網際網路控制訊息通訊協定 (ICMP),它在通過 Windows 防火牆時會遭到拒絕。 從 myVmPrivate VM 上的 PowerShell 中輸入下列命令,讓 ICMP 通過 Windows 防火牆:

New-NetFirewallRule -DisplayName "Allow ICMPv4-In" -Protocol ICMPv4

雖然本文使用追蹤路由來測試路由,但不建議在生產環境部署中允許 ICMP 通過 Windows 防火牆。

您已在啟用 IP 轉送中針對虛擬機器的網路介面啟用在 Azure 內 IP 轉送。 在虛擬機器內,作業系統或在虛擬機器內執行的應用程式也必須能夠轉送網路流量。 在 myVmNva 的作業系統內啟用 IP 轉送。

從 myVmPrivate 虛擬機器的命令提示字元中,使用遠端桌面連線到 myVmNva

mstsc /v:myvmnva

若要在作業系統內啟用 IP 轉送,請從 myVmNva VM 上的 PowerShell 輸入下列命令:

Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -Name IpEnableRouter -Value 1

重新啟動 myVmNva VM,也會中斷與遠端桌面工作階段的連線。

在連線至 myVmPrivate VM 的狀態下,在 myVmNva VM 重新啟動後建立 myVmPublic VM 的遠端桌面工作階段:

mstsc /v:myVmPublic

從 myVmPublic VM 上的 PowerShell 中輸入下列命令,讓 ICMP 通過 Windows 防火牆:

New-NetFirewallRule –DisplayName "Allow ICMPv4-In" –Protocol ICMPv4

若要測試將網路流量從 myVmPublic VM 路由傳送到 myVmPrivate VM,請在 myVmPublic VM 上,從 PowerShell 輸入下列命令:

tracert myVmPrivate

回應如下列範例所示:

Tracing route to myVmPrivate.vpgub4nqnocezhjgurw44dnxrc.bx.internal.cloudapp.net [10.0.1.4]
over a maximum of 30 hops:

1    <1 ms     *        1 ms  10.0.2.4
2     1 ms     1 ms     1 ms  10.0.1.4

Trace complete.

您可以看到第一個躍點是 10.0.2.4,也就是 NVA 的私人 IP 位址。 第二躍點是 10.0.1.4,也就是 myVmPrivate 虛擬機器的私人 IP 位址。 新增至 myRouteTablePublic 路由表且與「公用」子網路產生關聯的路由,會導致 Azure 透過 NVA 路由傳送流量,而不是直接路由傳送到「私人」子網路。

關閉 myVmPublic 虛擬機器的遠端桌面工作階段,但您仍然與 myVmPrivate 虛擬機器連線。

若要測試從 myVmPrivate VM 到 myVmPublic VM 的網路流量路由,請在 myVmPrivate VM 上的命令提示字元中輸入下列命令:

tracert myVmPublic

回應如下列範例所示:

Tracing route to myVmPublic.vpgub4nqnocezhjgurw44dnxrc.bx.internal.cloudapp.net [10.0.0.4]
over a maximum of 30 hops:

1     1 ms     1 ms     1 ms  10.0.0.4

Trace complete.

您可以看到流量是直接從 myVmPrivate 虛擬機器直接路由傳送到 myVmPublic 虛擬機器。 根據預設,Azure 會直接路由傳送子網路之間的流量。

關閉 myVmPrivate 虛擬機器的遠端桌面工作階段。

清除資源

您可以使用 Remove-AzResourcegroup 來移除不再需要的資源群組及其包含的所有資源。

Remove-AzResourceGroup -Name myResourceGroup -Force

下一步

在本文中,您已建立路由表並將其與子網路產生關聯。 您已建立簡單的網路虛擬設備,它會將來自公用子網路的流量路由傳送至私人子網路。 從 Azure Marketplace 部署各種預先設定的網路虛擬設備,這些設備會執行例如防火牆和 WAN 最佳化的網路功能。 若要深入了解路由,請參閱路由概觀管理路由表

雖然您可以在虛擬網路內部署許多 Azure 資源,但是某些 Azure PaaS 服務的資源無法部署到虛擬網路中。 您仍可將某些 Azure PaaS 服務的資源存取,限制為僅來自虛擬網路子網路的流量。 若要深入了解,請參閱限制對 PaaS 資源的網路存取