共用方式為


使用 Azure CLI 以路由表路由網路流量

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

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

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

必要條件

  • 本文需要 2.0.28 版或更新版本的 Azure CLI。 如果您是使用 Azure Cloud Shell,就已安裝最新版本。

建立路由表

您必須先使用 az group create 為本文中建立的所有資源建立資源群組,才能建立路由表。

# Create a resource group.
az group create \
  --name myResourceGroup \
  --location eastus

使用 az network route-table create 建立路由表。 下列範例會建立名為 myRouteTablePublic 的路由表。

# Create a route table
az network route-table create \
  --resource-group myResourceGroup \
  --name myRouteTablePublic

建立路由

使用 az network route-table route create 建立路由表中的路由。

az network route-table route create \
  --name ToPrivateSubnet \
  --resource-group myResourceGroup \
  --route-table-name myRouteTablePublic \
  --address-prefix 10.0.1.0/24 \
  --next-hop-type VirtualAppliance \
  --next-hop-ip-address 10.0.2.4

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

您必須先建立虛擬網路和子網路,才能讓路由表與子網路產生關聯。 使用 az network vnet create 建立具有一個子網路的虛擬網路。

az network vnet create \
  --name myVirtualNetwork \
  --resource-group myResourceGroup \
  --address-prefix 10.0.0.0/16 \
  --subnet-name Public \
  --subnet-prefix 10.0.0.0/24

使用 az network vnet subnet create 建立另外兩個子網路。

# Create a private subnet.
az network vnet subnet create \
  --vnet-name myVirtualNetwork \
  --resource-group myResourceGroup \
  --name Private \
  --address-prefix 10.0.1.0/24

# Create a DMZ subnet.
az network vnet subnet create \
  --vnet-name myVirtualNetwork \
  --resource-group myResourceGroup \
  --name DMZ \
  --address-prefix 10.0.2.0/24

使用 az network vnet subnet update 將 myRouteTablePublic 路由表關聯至公用子網路。

az network vnet subnet update \
  --vnet-name myVirtualNetwork \
  --name Public \
  --resource-group myResourceGroup \
  --route-table myRouteTablePublic

建立 NVA

NVA 是會執行網路功能的虛擬機器,例如路由、防火牆或 WAN 最佳化。 我們將從一般用途 Ubuntu VM 建立基本 NVA,以供示範之用。

使用 az vm create 建立要作為 DMZ 子網路 中 NVA 的VM。 在建立 VM 時,Azure 依預設並將網路介面 myVmNvaVMNic 和公用 IP 位址建立和指派給 VM。 --public-ip-address "" 參數會指示 Azure 不要建立公用 IP 位址並將其指派給虛擬機器,因為並不需要從網際網路連線至虛擬機器。 如果預設金鑰位置中還沒有 SSH 金鑰,此命令將會建立這些金鑰。 若要使用一組特定金鑰,請使用 --ssh-key-value 選項。

az vm create \
  --resource-group myResourceGroup \
  --name myVmNva \
  --image Ubuntu2204 \
  --public-ip-address "" \
  --subnet DMZ \
  --vnet-name myVirtualNetwork \
  --generate-ssh-keys

建立 VM 需要幾分鐘的時間。 在 Azure 建立虛擬機器並傳回虛擬機器的相關輸出之前,請勿繼續執行後續步驟。

若要讓網路介面 myVmNvaVMNic 能夠將傳送給自身網路流量轉送 (目的地並非自身 IP 位址),則必須對網路介面啟用 IP 轉送。 使用 az network nic update 啟用網路介面的 IP 轉送。

az network nic update \
  --name myVmNvaVMNic \
  --resource-group myResourceGroup \
  --ip-forwarding true

在虛擬機器內,作業系統或在虛擬機器內執行的應用程式也必須能夠轉送網路流量。 我們將使用 sysctl 命令讓 Linux 核心轉送封包。 若要在不登入 VM 的情況下執行此命令,我們將使用 自訂指令碼擴充功能az vm extension set

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVmNva \
  --name customScript \
  --publisher Microsoft.Azure.Extensions \
  --settings '{"commandToExecute":"sudo sysctl -w net.ipv4.ip_forward=1"}'

執行此命令可能需要一分鐘。 請注意,此變更不會在 VM 重新啟動之後保存,因此,如果 NVA VM 因任何原因重新啟動,則必須重複指令碼。

建立虛擬機器

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

使用 az vm create 在「公用」子網路中建立虛擬機器。 --no-wait 參數可以讓 Azure 在背景中執行命令,因此您可以繼續執行下一個命令。 為了簡化本文,我們會使用密碼。 金鑰通常用於生產環境部署中。 如果您使用金鑰,您還必須設定 SSH 代理程式轉送。 如需詳細資訊,請參閱 SSH 用戶端的文件。 在下列命令中,將 <replace-with-your-password> 取代為您選擇的密碼。

adminPassword="<replace-with-your-password>"

az vm create \
  --resource-group myResourceGroup \
  --name myVmPublic \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Public \
  --admin-username azureuser \
  --admin-password $adminPassword \
  --no-wait

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

az vm create \
  --resource-group myResourceGroup \
  --name myVmPrivate \
  --image Ubuntu2204 \
  --vnet-name myVirtualNetwork \
  --subnet Private \
  --admin-username azureuser \
  --admin-password $adminPassword

建立 VM 需要幾分鐘的時間。 建立虛擬機器之後,Azure CLI 會顯示類似下列範例的資訊:

{
  "fqdns": "",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVmPrivate",
  "location": "eastus",
  "macAddress": "00-0D-3A-23-9A-49",
  "powerState": "VM running",
  "privateIpAddress": "10.0.1.4",
  "publicIpAddress": "13.90.242.231",
  "resourceGroup": "myResourceGroup"
}

請記下 publicIpAddress。 在稍後的步驟中,這個位址可用來從網際網路存取虛擬機器。

透過 NVA 路由傳送流量

使用您選擇的 SSH 用戶端,連線到上面建立的 VM。 例如,下列命令可從命令行介面使用,例如 WSL,以使用 myVmPrivate VM 建立 SSH 工作階段。 以您 VM 的公用 IP 位址取代 <publicIpAddress>。 在上述範例中,IP 位址是 13.90.242.231

ssh azureuser@<publicIpAddress>

出現密碼的提示時,請輸入您在建立虛擬機器中選取的密碼。

使用下列命令安裝 myVmPrivate 虛擬機器的追蹤路由:

sudo apt update
sudo apt install traceroute

使用下列命令以測試從 myVmPrivate 虛擬機器到 myVmPublic 虛擬機器之網路流量的路由。

traceroute myVmPublic

回應如下列範例所示:

traceroute to myVmPublic (10.0.0.4), 30 hops max, 60 byte packets
1  10.0.0.4 (10.0.0.4)  1.404 ms  1.403 ms  1.398 ms

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

使用下列命令以從 myVmPrivate 虛擬機器透過 SSH 連線到 myVmPublic 虛擬機器:

ssh azureuser@myVmPublic

使用下列命令安裝 myVmPublic 虛擬機器的追蹤路由:

sudo apt-get install traceroute

使用下列命令以測試從 myVmPublic 虛擬機器到 myVmPrivate 虛擬機器之網路流量的路由。

traceroute myVmPrivate

回應如下列範例所示:

traceroute to myVmPrivate (10.0.1.4), 30 hops max, 60 byte packets
1  10.0.2.4 (10.0.2.4)  0.781 ms  0.780 ms  0.775 ms
2  10.0.1.4 (10.0.0.4)  1.404 ms  1.403 ms  1.398 ms

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

同時關閉與 myVmPublic 和 myVmPrivate 虛擬機器的 SSH 工作階段。

清除資源

請使用 az group delete 來移除不再需要的資源群組以及其所包含的所有資源。

az group delete --name myResourceGroup --yes

下一步

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

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