在 Azure CLI 中使用网络安全组筛选网络流量

可以使用网络安全组来筛选虚拟网络子网的入站和出站网络流量。 网络安全组包含安全规则,这些规则可按 IP 地址、端口和协议筛选网络流量。 安全规则应用到子网中部署的资源。 在本文中,学习如何:

  • 创建网络安全组和安全规则
  • 创建虚拟网络并将网络安全组关联到子网
  • 将虚拟机 (VM) 部署到子网中
  • 测试流量筛选器

如果没有 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 针对本文中创建的所有资源创建一个资源组。 以下示例在“chinaeast”位置创建一个资源组:

az group create \
  --name test-rg \
  --location chinaeast

使用 az network asg create 创建应用程序安全组。 使用应用程序安全组可以分组具有类似端口筛选要求的服务器。 以下示例创建两个应用程序安全组。

az network asg create \
  --resource-group test-rg \
  --name asg-web-servers \
  --location chinaeast

az network asg create \
  --resource-group test-rg \
  --name asg-mgmt-servers \
  --location chinaeast

创建网络安全组

使用 az network nsg create 创建网络安全组。 以下示例创建了一个名为 nsg-1 的网络安全组:

# Create a network security group
az network nsg create \
  --resource-group test-rg \
  --name nsg-1

创建安全规则

使用 az network nsg rule create 创建安全规则。 以下示例创建了一个规则,该规则允许通过端口 80 和 443 将来自 Internet 的入站流量发往 asg-web-servers 应用程序安全组:

az network nsg rule create \
  --resource-group test-rg \
  --nsg-name nsg-1 \
  --name Allow-Web-All \
  --access Allow \
  --protocol Tcp \
  --direction Inbound \
  --priority 100 \
  --source-address-prefix Internet \
  --source-port-range "*" \
  --destination-asgs "asg-web-servers" \
  --destination-port-range 80 443

以下示例创建了一个规则,该规则允许通过端口 22 将来自 Internet 的入站流量发往 asg-mgmt-servers 应用程序安全组:

az network nsg rule create \
  --resource-group test-rg \
  --nsg-name nsg-1 \
  --name Allow-SSH-All \
  --access Allow \
  --protocol Tcp \
  --direction Inbound \
  --priority 110 \
  --source-address-prefix Internet \
  --source-port-range "*" \
  --destination-asgs "asg-mgmt-servers" \
  --destination-port-range 22

在本文中,asg-mgmt-servers asg 向 Internet 公开 SSH(端口 22)。 对于生产环境,请使用 VPN专用网络连接来管理 Azure 资源,而不是向 Internet 公开端口 22。

创建虚拟网络

使用 az network vnet create 创建虚拟网络。 以下示例创建了名为 vnet-1 的虚拟网络:

az network vnet create \
  --name vnet-1 \
  --resource-group test-rg \
  --address-prefixes 10.0.0.0/16

使用 az network vnet subnet create 将子网添加到虚拟网络。 以下示例将名为 subnet-1 的子网添加到虚拟网络,并将 nsg-1 网络安全组关联到该虚拟网络:

az network vnet subnet create \
  --vnet-name vnet-1 \
  --resource-group test-rg \
  --name subnet-1 \
  --address-prefix 10.0.0.0/24 \
  --network-security-group nsg-1

创建虚拟机

在虚拟网络中创建两个 VM,以便在后续步骤中可以验证流量筛选。

使用 az vm create 创建 VM。 以下示例创建了充当 Web 服务器的 VM。 --asgs asg-web-servers 选项导致 Azure 将它为 VM 创建的网络接口设置为 asg-web-servers 应用程序安全组的成员。 指定 --nsg "" 选项可防止 Azure 为创建 VM 时创建的网络接口创建默认的网络安全组。 该命令提示你为 VM 创建密码。 本例中不使用 SSH 密钥,以方便本文后面的步骤。 在生产环境中,请使用 SSH 密钥增强安全性。

az vm create \
  --resource-group test-rg \
  --name vm-web \
  --image Ubuntu2204 \
  --vnet-name vnet-1 \
  --subnet subnet-1 \
  --nsg "" \
  --asgs asg-web-servers \
  --admin-username azureuser \
  --authentication-type password \
  --assign-identity

创建 VM 需要几分钟时间。 创建 VM 后,将返回以下示例所示的输出:

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

使用 az vm create 创建 VM。 以下示例创建了一个用作管理服务器的 VM。 --asgs asg-mgmt-servers 选项导致 Azure 将它为 VM 创建的网络接口设置为 asg-mgmt-servers 应用程序安全组的成员。

以下示例将创建 VM 并添加用户帐户。 --generate-ssh-keys 参数会导致 CLI 在 ~/.ssh 中查找可用的 ssh 密钥。 如果找到一个,则使用此密钥。 否则,将会生成一个密钥并存储在 ~/.ssh 中。 最后,我们将部署最新的 Ubuntu 22.04 映像。

az vm create \
  --resource-group test-rg \
  --name vm-mgmt \
  --image Ubuntu2204 \
  --vnet-name vnet-1 \
  --subnet subnet-1 \
  --nsg "" \
  --asgs asg-mgmt-servers \
  --admin-username azureuser \
  --generate-ssh-keys \
  --assign-identity

创建 VM 需要几分钟时间。 请 Azure 创建完 VM 之前,请不要继续下一步。

为虚拟机启用 Microsoft Entra ID 登录

以下代码示例中该扩展用于为 Linux VM 启用 Microsoft Entra ID 登录。 VM 扩展是小型应用程序,可在 Azure 虚拟机上提供部署后配置和自动化任务。

az vm extension set \
    --publisher Microsoft.Azure.ActiveDirectory \
    --name AADSSHLoginForLinux \
    --resource-group test-rg \
    --vm-name vm-web

az vm extension set \
    --publisher Microsoft.Azure.ActiveDirectory \
    --name AADSSHLoginForLinux \
    --resource-group test-rg \
    --vm-name vm-mgmt

测试流量筛选器

使用所选的 SSH 客户端连接到之前创建的 VM。 例如,可从命令行接口(如 适用于 Linux 的 Windows 子系统)使用以下命令创建与 vm-mgmt VM 的 SSH 会话。 在前面的步骤中,我们为 VM 启用了 Microsoft Entra ID 登录。 可使用 Microsoft Entra ID 凭据登录到虚拟机,也可使用用于创建 VM 的 SSH 密钥。 在以下示例中,我们使用 SSH 密钥登录到管理 VM,然后使用密码从管理 VM 登录到 Web VM。

有关如何通过 SSH 连接到 Linux VM 并使用 Microsoft Entra ID 登录的详细信息,请参阅使用 Microsoft Entra ID 和 OpenSSH 登录到 Azure 中的 Linux 虚拟机

存储 VM 的 IP 地址,以通过 SSH 进行连接

运行以下命令以将 VM 的 IP 地址存储为环境变量:

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

连接成功,因为附加到 vm-mgmt VM 的网络接口位于 asg-mgmt-servers 应用程序安全组中,该安全组允许端口 22 从 Internet 入站。

使用以下命令通过 SSH 从 vm-mgmt VM 连接到 vm-web VM:

ssh -o StrictHostKeyChecking=no azureuser@vm-web

连接将会成功,因为每个网络安全组中的默认安全规则允许通过虚拟网络中所有 IP 地址之间的所有端口发送流量。 无法通过 SSH 从 Internet 连接到 vm-web VM,因为 asg-web-servers 的安全规则不允许通过端口 22 发送来自 Internet 的入站流量。

使用以下命令在 vm-web VM 上安装 nginx Web 服务器:

# Update package source
sudo apt-get -y update

# Install NGINX
sudo apt-get -y install nginx

允许 vm-web VM 向 Internet 发送出站流量以检索 nginx,因为默认安全规则允许发往 Internet 的所有出站流量。 退出 vm-web SSH 会话,这会使你留在 vm-mgmt VM 的 username@vm-mgmt:~$ 提示符处。 若要从 vm-web VM 检索 nginx 欢迎屏幕,请输入以下命令:

curl vm-web

退出登录 vm-mgmt VM。 若要确认是否可以从 Azure 外部访问 vm-web Web 服务器,请在自己的计算机上输入 curl <publicIpAddress>。 连接成功,因为附加到 vm-web VM 的网络接口所在的 asg-web-servers 应用程序安全组允许端口 80 从 Internet 入站。

清理资源

如果不再需要资源组及其包含的所有资源,可以使用 az group delete 将其删除。

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

后续步骤

在本文中,我们已创建一个网络安全组并将其关联到虚拟网络子网。 若要详细了解网络安全组,请参阅网络安全组概述管理网络安全组

默认情况下,Azure 在子网之间路由流量。 你也可以改为选择通过某个 VM(例如,充当防火墙的 VM)在子网之间路由流量。 若要了解操作方法,请参阅创建路由表