使用 Azure CLI 以路由表路由網路流量
根據預設,Azure 會自動路由傳送虛擬網路內所有子網路之間的流量。 您可以建立您自己的路由,以覆寫 Azure 的預設路由。 舉例來說,如果您想要通過網路虛擬設備 (NVA) 路由傳送子網路之間的流量,則建立自訂路由的能力很有幫助。 在本文中,您將學會如何:
- 建立路由表
- 建立路由
- 建立有多個子網路的虛擬網路
- 建立路由表與子網路的關聯
- 建立從 Ubuntu VM 路由傳送流量的基本 NVA
- 將虛擬機器 (VM) 部署到不同子網路
- 透過 NVA 從一個子網路將流量路由傳送到另一個子網路
如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
必要條件
在 Azure Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
- 本文需要 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 資源的網路存取。