共用方式為


使用 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 test-rg \
  --location westus2

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

# Create a route table
az network route-table create \
  --resource-group test-rg \
  --name route-table-public

建立路由

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

az network route-table route create \
  --name to-private-subnet \
  --resource-group test-rg \
  --route-table-name route-table-public \
  --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 vnet-1 \
  --resource-group test-rg \
  --address-prefix 10.0.0.0/16 \
  --subnet-name subnet-public \
  --subnet-prefix 10.0.0.0/24

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

# Create a private subnet.
az network vnet subnet create \
  --vnet-name vnet-1 \
  --resource-group test-rg \
  --name subnet-private \
  --address-prefix 10.0.1.0/24

# Create a DMZ subnet.
az network vnet subnet create \
  --vnet-name vnet-1 \
  --resource-group test-rg \
  --name subnet-dmz \
  --address-prefix 10.0.2.0/24

route-table-subnet-public 路由表與 az network vnet subnet update 建立子網-公用子網的關聯。

az network vnet subnet update \
  --vnet-name vnet-1 \
  --name subnet-public \
  --resource-group test-rg \
  --route-table route-table-public

建立 NVA

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

使用 az vm create 建立要當做 subnet-dmz 子網中的 NVA 使用的 VM。 當您建立 VM 時,Azure 預設會將網路介面 vm-nvaVMNic 和子網公用 IP 位址指派給 VM。 參數 --public-ip-address "" 會指示 Azure 不要建立子網公用 IP 位址並將其指派給 VM,因為 VM 不需要從因特網連線到。

下列範例會建立 VM 並新增使用者帳戶。 --generate-ssh-keys 參數會使 CLI 在 ~/.ssh 中尋找可用的 ssh 金鑰。 如果找到一個,則會使用該金鑰。 如果沒有找到,則會產生一個並儲存在 ~/.ssh 中。 最後,我們會部署最新的 Ubuntu 22.04 映像。

az vm create \
  --resource-group test-rg \
  --name vm-nva \
  --image Ubuntu2204 \
  --public-ip-address "" \
  --subnet subnet-dmz \
  --vnet-name vnet-1 \
  --generate-ssh-keys

建立 VM 需要幾分鐘的時間。 在 Azure 完成建立 VM 並傳回 VM 的相關輸出之前,請勿繼續進行下一個步驟。

若要讓網路介面 vm-nvaVMNic 能夠轉送傳送至它的網路流量,而該流量不是針對自己的 IP 位址,則必須為網路介面啟用 IP 轉送。 使用 az network nic update 啟用網路介面的 IP 轉送。

az network nic update \
  --name vm-nvaVMNic \
  --resource-group test-rg \
  --ip-forwarding true

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

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

此命令可能需要一分鐘的時間才能執行。 此變更不會在 VM 重新啟動之後持續發生,因此,如果 NVA VM 因任何原因重新啟動,則必須重複腳本。

建立虛擬機器

在虛擬網路中建立兩個 VM,以便您可以在稍後的步驟中驗證來自子網公用子網的流量是否透過 NVA 路由傳送至子網私人子網。

使用 az vm create 在 subnet-public 子網中建立 VM。 --no-wait 參數可以讓 Azure 在背景中執行命令,因此您可以繼續執行下一個命令。

下列範例會建立 VM 並新增使用者帳戶。 --generate-ssh-keys 參數會使 CLI 在 ~/.ssh 中尋找可用的 ssh 金鑰。 如果找到一個,則會使用該金鑰。 如果沒有找到,則會產生一個並儲存在 ~/.ssh 中。 最後,我們會部署最新的 Ubuntu 22.04 映像。

az vm create \
  --resource-group test-rg \
  --name vm-public \
  --image Ubuntu2204 \
  --vnet-name vnet-1 \
  --subnet subnet-public \
  --admin-username azureuser \
  --generate-ssh-keys \
  --no-wait

在子網私人子網中建立 VM。

az vm create \
  --resource-group test-rg \
  --name vm-private \
  --image Ubuntu2204 \
  --vnet-name vnet-1 \
  --subnet subnet-private \
  --admin-username azureuser \
  --generate-ssh-keys

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

{
  "fqdns": "",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm-private",
  "location": "westus2",
  "macAddress": "00-0D-3A-23-9A-49",
  "powerState": "VM running",
  "privateIpAddress": "10.0.1.4",
  "publicIpAddress": "203.0.113.24",
  "resourceGroup": "test-rg"
}

為虛擬機啟用Microsoft登入專案標識碼

下列程式代碼範例會安裝 擴充功能,以啟用Linux VM的 Microsoft Entra ID 登入。 VM 擴充功能是小型的應用程式,可在「Azure 虛擬機器」上提供部署後設定及自動化工作。

az vm extension set \
    --publisher Microsoft.Azure.ActiveDirectory \
    --name AADSSHsign-inForLinux \
    --resource-group test-rg \
    --vm-name vm-private
az vm extension set \
    --publisher Microsoft.Azure.ActiveDirectory \
    --name AADSSHsign-inForLinux \
    --resource-group test-rg \
    --vm-name vm-public

透過 NVA 路由傳送流量

使用您選擇的SSH用戶端,連線到先前建立的 VM。 例如,下列命令可從命令行介面使用,例如 Windows 子系統 Linux 版,以建立與 vm-private VM 的 SSH 會話。 在先前的步驟中,我們已為 VM 啟用Microsoft Entra ID 登入。 您可以使用Microsoft Entra ID 認證登入虛擬機,也可以使用您用來建立 VM 的 SSH 金鑰。 在下列範例中,我們使用 SSH 金鑰登入 VM。

如需如何透過 SSH 連線至 Linux VM 並使用 Microsoft Entra ID 登入的詳細資訊,請參閱 使用 Microsoft Entra ID 和 OpenSSH 登入 Azure 中的 Linux 虛擬機。


### Store IP address of VM in order to SSH

Run the following command to store the IP address of the VM as an environment variable:

```bash
export IP_ADDRESS=$(az vm show --show-details --resource-group test-rg --name vm-private --query publicIps --output tsv)
ssh -o StrictHostKeyChecking=no azureuser@$IP_ADDRESS

使用下列命令在 vm-private VM 上安裝追蹤路由:

sudo apt update
sudo apt install traceroute

使用下列命令測試從 vm-private VM 到 vm-public VM 的網路流量路由。

traceroute vm-public

回應如下列範例所示:

azureuser@vm-private:~$ traceroute vm-public
traceroute to vm-public (10.0.0.4), 30 hops max, 60 byte packets
 1  vm-public.internal.cloudapp.net (10.0.0.4)  2.613 ms  2.592 ms  2.553 ms

您可以看到流量會直接從 vm-private VM 路由傳送至 vm-public VM。 Azure 的預設路由會直接路由傳送子網路之間的流量。 關閉 VM 私人 VM 的 SSH 工作階段。

儲存 VM 的 IP 位址以便進行 SSH 連線

執行以下命令,將 VM 的 IP 位址儲存為環境變數:

export IP_ADDRESS=$(az vm show --show-details --resource-group test-rg --name vm-public --query publicIps --output tsv)
ssh -o StrictHostKeyChecking=no azureuser@$IP_ADDRESS

使用下列命令在 vm-public VM 上安裝追蹤路由:

sudo apt update
sudo apt install traceroute

使用下列命令測試從 vm-public VM 到 vm-private VM 的網路流量路由。

traceroute vm-private

回應如下列範例所示:

azureuser@vm-public:~$ traceroute vm-private
traceroute to vm-private (10.0.1.4), 30 hops max, 60 byte packets
 1  vm-nva.internal.cloudapp.net (10.0.2.4)  1.010 ms  1.686 ms  1.144 ms
 2  vm-private.internal.cloudapp.net (10.0.1.4)  1.925 ms  1.911 ms  1.898 ms

您可以看到第一個躍點是 10.0.2.4,也就是 NVA 的私人 IP 位址。 第二個躍點為 10.0.1.4,這是 vm-private VM 的私人 IP 位址。 新增至 route-table--public 路由表的路由,以及與子網公用子網相關聯的路由會導致 Azure 透過 NVA 路由傳送流量,而不是直接路由傳送至子網私人子網。

關閉 VM 公用 VM 的 SSH 工作階段。

清除資源

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

az group delete \
    --name test-rg \
    --yes \
    --no-wait

下一步

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

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