在 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)在子网之间路由流量。 若要了解操作方法,请参阅创建路由表。