练习 - 通过 NVA 路由流量

已完成

在创建了网络虚拟设备 (NVA) 和虚拟机 (VM) 后,现在将通过 NVA 路由流量。

Visualization of virtual machines and IP addresses.

创建公共和专用虚拟机

接下来的步骤是将 VM 部署到公共子网和专用子网中。

  1. 打开 Cloud Shell 编辑器,创建名为“cloud-init.txt”的文件。

    code cloud-init.txt
    
  2. 在文件中添加以下配置信息。 通过此配置,在创建新 VM 时会安装 inetutils-traceroute 包。 该包中包含稍后将在此练习中使用的 traceroute 实用工具。

    #cloud-config
    package_upgrade: true
    packages:
       - inetutils-traceroute
    
  3. Ctrl+S 保存文件,然后按 Ctrl+Q 关闭编辑器。

  4. 在 Cloud Shell 中,运行以下命令以创建公共 VM。 将 <password> 替换为 azureuser 帐户的合适密码。

    az vm create \
        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
        --name public \
        --vnet-name vnet \
        --subnet publicsubnet \
        --image Ubuntu2204 \
        --admin-username azureuser \
        --no-wait \
        --custom-data cloud-init.txt \
        --admin-password <password>
    
  5. 运行以下命令以创建专用 VM。 将 <password> 替换为合适的密码。

    az vm create \
        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
        --name private \
        --vnet-name vnet \
        --subnet privatesubnet \
        --image Ubuntu2204 \
        --admin-username azureuser \
        --no-wait \
        --custom-data cloud-init.txt \
        --admin-password <password>
    
  6. 运行以下 Linux watch 命令以检查 VM 是否处于运行状态。 watch 命令会定期运行 az vm list 命令,使你可以监视 VM 进度。

    watch -d -n 5 "az vm list \
        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
        --show-details \
        --query '[*].{Name:name, ProvisioningState:provisioningState, PowerState:powerState}' \
        --output table"
    

    “ProvisioningState”值为“Succeeded”,且“PowerState”值为“VM running”表示部署成功。 在三个 VM 都运行后,即可进行下一步。 按 Ctrl-C 停止命令,然后继续练习。

  7. 运行以下命令,将公共 VM 的公共 IP 地址保存到名为 PUBLICIP 的变量。

    PUBLICIP="$(az vm list-ip-addresses \
        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
        --name public \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $PUBLICIP
    
  8. 运行以下命令,将专用 VM 的公共 IP 地址保存到名为 PRIVATEIP 的变量。

    PRIVATEIP="$(az vm list-ip-addresses \
        --resource-group "<rgn>[sandbox resource group name]</rgn>" \
        --name private \
        --query "[].virtualMachine.network.publicIpAddresses[*].ipAddress" \
        --output tsv)"
    
    echo $PRIVATEIP
    

通过网络虚拟设备测试流量路由

最后的步骤是使用 Linux traceroute 实用工具显示流量的路由方式。 使用 ssh 命令在每台 VM 上运行 traceroute 命令。 第一个测试将显示从公共 VM 发送到专用 VM 的 ICMP 数据包所采用的路由。 第二个测试将显示从专用 VM 发送到公共 VM 的 ICMP 数据包所采用的路由。

  1. 运行以下命令以跟踪从公共到专用的路由。 在出现提示时输入之前指定的 azureuser 帐户的密码。

    ssh -t -o StrictHostKeyChecking=no azureuser@$PUBLICIP 'traceroute private --type=icmp; exit'
    

    如果收到错误消息 bash: traceroute: command not found,请稍等片刻,然后重试该命令。 部署 VM 后,自动安装 traceroute 可能需要一到两分钟的时间。 命令执行成功后,输出应如下所示:

    traceroute to private.kzffavtrkpeulburui2lgywxwg.gx.internal.cloudapp.net (10.0.1.4), 64 hops max
    1   10.0.2.4  0.710ms  0.410ms  0.536ms
    2   10.0.1.4  0.966ms  0.981ms  1.268ms
    Connection to 52.165.151.216 closed.
    

    请注意,第一个跃点为路由到 10.0.2.4。 此地址是 nva 的专用 IP 地址。 第二个跃点为路由到专用地址 10.0.1.4。 在第一个练习中,已将此路由添加到路由表,并将该表链接到了 publicsubnet 子网。 因此,从公共到专用的所有流量目前都通过 NVA 进行路由。

    Diagram of route from public to private.

  2. 运行以下命令以跟踪从专用到公共的路由。 在出现提示时,输入 azureuser 帐户的密码。

    ssh -t -o StrictHostKeyChecking=no azureuser@$PRIVATEIP 'traceroute public --type=icmp; exit'
    

    应看到流量直接进入公共 (10.0.0.4) 而不是通过 NVA,如以下命令输出所示。

    traceroute to public.kzffavtrkpeulburui2lgywxwg.gx.internal.cloudapp.net (10.0.0.4), 64 hops max
    1   10.0.0.4  1.095ms  1.610ms  0.812ms
    Connection to 52.173.21.188 closed.
    

    专用 VM 使用默认路由,并且流量直接在子网之间路由。

    Diagram of route from private to public.

现在已配置了子网之间的路由,以便在流量到达专用子网之前通过 dmzsubnet 子网从公共 Internet 定向流量。 在 dmzsubnet 子网中,你已添加了充当 NVA 的 VM。 可以配置此 NVA 以检测潜在的恶意请求,并在它们到达预期目标之前进行阻止。