使用 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 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 資源的網路存取。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應