使用 Azure CLI 通过路由表路由网络流量
默认情况下,Azure 自动在虚拟网络中的所有子网之间路由流量。 可以创建自己的路由来覆盖 Azure 的默认路由。 创建自定义路由的功能非常有用,例如,可以通过网络虚拟设备 (NVA) 在子网之间路由流量。 在本文中,学习如何:
- 创建路由表
- 创建路由
- 创建包含多个子网的虚拟网络
- 将路由表关联到子网
- 创建从 Ubuntu VM 路由流量的基本 NVA
- 将虚拟机 (VM) 部署到不同子网
- 通过 NVA 将从一个子网的流量路由到另一个子网
如果没有 Azure 试用版订阅,请在开始前创建一个试用版订阅。
先决条件
如需在本地运行 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。
本文需要 Azure CLI 2.0.28 或更高版本。
注意
在可以在由世纪互联运营的 Microsoft Azure 中使用 Azure CLI 之前,请先运行 az cloud set -n AzureChinaCloud
来更改云环境。 若要切换回 Azure 公有云,请再次运行 az cloud set -n AzureCloud
。
创建路由表
在创建路由表之前,请使用 az group create 针对本文中创建的所有资源创建一个资源组。
# Create a resource group.
az group create \
--name myResourceGroup \
--location chinaeast
使用 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 优化)的 VM。 我们将从常规用途 Ubuntu VM 创建一个基本的 NVA,以用于演示目的。
使用 az vm create 在 DMZ 子网中创建要用作 NVA 的 VM。 创建 VM 时,Azure 默认会创建网络接口 myVmNvaVMNic 和公共 IP 地址并将其分配到该 VM。 --public-ip-address ""
参数指示 Azure 不要创建公共 IP 地址并将其分配到该 VM,因为不需要从 Internet 连接到该 VM。 如果默认密钥位置中尚不存在 SSH 密钥,该命令会创建它们。 若要使用特定的一组密钥,请使用 --ssh-key-value
选项。
az vm create \
--resource-group myResourceGroup \
--name myVmNva \
--image UbuntuLTS \
--public-ip-address "" \
--subnet DMZ \
--vnet-name myVirtualNetwork \
--generate-ssh-keys
创建 VM 需要几分钟时间。 在 Azure 完成创建 VM 并返回有关 VM 的输出之前,请不要继续下一步。
要使网络接口 myVmNvaVMNic 能够转发发送给它的而不是发往其自身 IP 地址的网络流量,必须为该网络接口启用 IP 转发。 使用 az network nic update 为网络接口启用 IP 转发。
az network nic update \
--name myVmNvaVMNic \
--resource-group myResourceGroup \
--ip-forwarding true
在 VM 中,VM 中运行的操作系统或应用程序也必须能够转发网络流量。 我们将使用 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 出于任何原因重新启动,则需要重复该脚本。
创建虚拟机
在虚拟网络中创建两个 VM,以便可以在后续步骤中验证来自公共子网的流量是否通过 NVA 路由到专用子网。
使用 az vm create 在公共子网中创建一个 VM。 --no-wait
参数支持 Azure 在后台中执行命令,因此可以继续执行下一个命令。 为了简化本文的内容,此处使用了密码。 在生产部署中通常使用密钥。 如果使用密钥,还必须配置 SSH 代理转发。 有关详细信息,请参阅 SSH 客户端的文档。 将以下命令中的 <replace-with-your-password>
替换为所选的密码。
adminPassword="<replace-with-your-password>"
az vm create \
--resource-group myResourceGroup \
--name myVmPublic \
--image UbuntuLTS \
--vnet-name myVirtualNetwork \
--subnet Public \
--admin-username azureuser \
--admin-password $adminPassword \
--no-wait
在专用子网中创建一个 VM。
az vm create \
--resource-group myResourceGroup \
--name myVmPrivate \
--image UbuntuLTS \
--vnet-name myVirtualNetwork \
--subnet Private \
--admin-username azureuser \
--admin-password $adminPassword
创建 VM 需要几分钟时间。 创建 VM 之后,Azure CLI 将显示类似于以下示例的信息:
{
"fqdns": "",
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVmPrivate",
"location": "chinaeast",
"macAddress": "00-0D-3A-23-9A-49",
"powerState": "VM running",
"privateIpAddress": "10.0.1.4",
"publicIpAddress": "13.90.242.231",
"resourceGroup": "myResourceGroup"
}
记下 publicIpAddress。 在后面的步骤中会使用此地址通过 Internet 访问 VM。
通过 NVA 路由流量
使用所选的 SSH 客户端连接到上面创建的 VM。 例如,可以从命令行接口(如 WSL)使用以下命令创建与 myVmPrivate VM 的 SSH 会话。 将 <publicIpAddress> 替换为 VM 的公共 IP 地址。 在上面的示例中,IP 地址为 13.90.242.231。
ssh azureuser@<publicIpAddress>
当系统提示输入密码时,请输入在创建虚拟机中选择的密码。
使用以下命令在 myVmPrivate VM 上安装跟踪路由:
sudo apt update
sudo apt install traceroute
使用以下命令测试从 myVmPrivate VM 发往 myVmPublic VM 的网络流量的路由。
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 VM 直接路由到 myVmPublic VM。 Azure 的默认路由,直接在子网之间路由流量。
使用以下命令从 myVmPrivate VM 通过 SSH 连接到 myVmPublic VM:
ssh azureuser@myVmPublic
使用以下命令在 myVmPublic VM 上安装跟踪路由:
sudo apt-get install traceroute
使用以下命令测试从 myVmPublic VM 发往 myVmPrivate VM 的网络流量的路由。
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 VM 的专用 IP 地址。 添加到 myRouteTablePublic 路由表并关联到公共子网的路由导致 Azure 通过 NVA 路由流量,而不是直接将流量路由到专用子网。
同时关闭与 myVmPublic VM 和 myVmPrivate VM 的 SSH 会话。
清理资源
如果不再需要资源组及其包含的所有资源,可以使用 az group delete 将其删除。
az group delete --name myResourceGroup --yes
后续步骤
在本文中,我们创建了一个路由表并将其关联到了某个子网。 还创建了一个简单 NVA,用于将流量从公共子网路由到专用子网。 从 Azure 市场部署各种执行网络功能(例如防火墙和 WAN 优化)的预配置 NVA。 若要了解有关路由的详细信息,请参阅路由概述和管理路由表。
尽管可以在一个虚拟网络中部署多个 Azure 资源,但无法将某些 Azure PaaS 服务的资源部署到虚拟网络。 不过,仍可以限制为只允许来自某个虚拟网络子网的流量访问某些 Azure PaaS 服务的资源。 若要了解如何操作,请参阅限制对 PaaS 资源的网络访问。