在 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 myResourceGroup \
--location chinaeast
使用 az network asg create 创建应用程序安全组。 使用应用程序安全组可以分组具有类似端口筛选要求的服务器。 以下示例创建两个应用程序安全组。
az network asg create \
--resource-group myResourceGroup \
--name myAsgWebServers \
--location chinaeast
az network asg create \
--resource-group myResourceGroup \
--name myAsgMgmtServers \
--location chinaeast
创建网络安全组
使用 az network nsg create 创建网络安全组。 以下示例创建名为 myNsg 的网络安全组:
# Create a network security group
az network nsg create \
--resource-group myResourceGroup \
--name myNsg
创建安全规则
使用 az network nsg rule create 创建安全规则。 以下示例创建一个规则,该规则允许通过端口 80 和 443 将来自 Internet 的入站流量发往 myWebServers 应用程序安全组:
az network nsg rule create \
--resource-group myResourceGroup \
--nsg-name myNsg \
--name Allow-Web-All \
--access Allow \
--protocol Tcp \
--direction Inbound \
--priority 100 \
--source-address-prefix Internet \
--source-port-range "*" \
--destination-asgs "myAsgWebServers" \
--destination-port-range 80 443
以下示例创建一个规则,该规则允许通过端口 22 将来自 Internet 的入站流量发往 myMgmtServers 应用程序安全组:
az network nsg rule create \
--resource-group myResourceGroup \
--nsg-name myNsg \
--name Allow-SSH-All \
--access Allow \
--protocol Tcp \
--direction Inbound \
--priority 110 \
--source-address-prefix Internet \
--source-port-range "*" \
--destination-asgs "myAsgMgmtServers" \
--destination-port-range 22
在本文中,将在 Internet 上为 myAsgMgmtServers VM 公开 SSH(端口 22)。 在生产环境中,我们建议使用 VPN 或专用网络连接来连接到要管理的 Azure 资源,而不要向 Internet 公开端口 22。
创建虚拟网络
使用 az network vnet create 创建虚拟网络。 以下示例创建名为 myVirtualNetwork 的虚拟网络:
az network vnet create \
--name myVirtualNetwork \
--resource-group myResourceGroup \
--address-prefixes 10.0.0.0/16
使用 az network vnet subnet create 将子网添加到虚拟网络。 以下示例将名为 mySubnet 的子网添加到虚拟网络,并将 myNsg 网络安全组关联到该虚拟网络:
az network vnet subnet create \
--vnet-name myVirtualNetwork \
--resource-group myResourceGroup \
--name mySubnet \
--address-prefix 10.0.0.0/24 \
--network-security-group myNsg
创建虚拟机
在虚拟网络中创建两个 VM,以便在后续步骤中可以验证流量筛选。
使用 az vm create 创建 VM。 以下示例创建充当 Web 服务器的 VM。 --asgs myAsgWebServers
选项导致 Azure 将它为 VM 创建的网络接口设置为 myAsgWebServers 应用程序安全组的成员。
指定 --nsg ""
选项可防止 Azure 为创建 VM 时创建的网络接口创建默认的网络安全组。 为了简化本文的内容,此处使用了密码。 在生产部署中通常使用密钥。 如果使用密钥,还必须配置 SSH 代理转发才能完成剩余步骤。 有关详细信息,请参阅 SSH 客户端的文档。 将以下命令中的 <replace-with-your-password>
替换为所选的密码。
adminPassword="<replace-with-your-password>"
az vm create \
--resource-group myResourceGroup \
--name myVmWeb \
--image UbuntuLTS \
--vnet-name myVirtualNetwork \
--subnet mySubnet \
--nsg "" \
--asgs myAsgWebServers \
--admin-username azureuser \
--admin-password $adminPassword
创建 VM 需要几分钟时间。 创建 VM 后,将返回以下示例所示的输出:
{
"fqdns": "",
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVmWeb",
"location": "chinaeast",
"macAddress": "00-0D-3A-23-9A-49",
"powerState": "VM running",
"privateIpAddress": "10.0.0.4",
"publicIpAddress": "13.90.242.231",
"resourceGroup": "myResourceGroup"
}
记下 publicIpAddress。 在后面的步骤中会使用此地址通过 Internet 访问 VM。 创建充当管理服务器的 VM:
az vm create \
--resource-group myResourceGroup \
--name myVmMgmt \
--image UbuntuLTS \
--vnet-name myVirtualNetwork \
--subnet mySubnet \
--nsg "" \
--asgs myAsgMgmtServers \
--admin-username azureuser \
--admin-password $adminPassword
创建 VM 需要几分钟时间。 创建 VM 后,记下返回的输出中的 publicIpAddress。 在后续步骤中,将使用此地址访问 VM。 请 Azure 创建完 VM 之前,请不要继续下一步。
测试流量筛选器
使用以下命令来与 myVmMgmt VM 建立 SSH 会话。 将 <publicIpAddress> 替换为 VM 的公共 IP 地址。 在上面的示例中,IP 地址为 13.90.242.231。
ssh azureuser@<publicIpAddress>
当系统提示输入密码时,输入在创建 VM 中输入的密码。
连接将会成功,因为允许通过端口 22 将入站流量从 Internet 发往已附加到 myVmMgmt VM 的网络接口所在的 myAsgMgmtServers 应用程序安全组。
使用以下命令通过 SSH 从 myVmMgmt VM 连接到 myVmWeb VM:
ssh azureuser@myVmWeb
连接将会成功,因为每个网络安全组中的默认安全规则允许通过虚拟网络中所有 IP 地址之间的所有端口发送流量。 无法通过 SSH 从 Internet 连接到 myVmWeb VM,因为 myAsgWebServers 的安全规则不允许通过端口 22 发送来自 Internet 的入站流量。
使用以下命令在 myVmWeb VM 上安装 nginx Web 服务器:
# Update package source
sudo apt-get -y update
# Install NGINX
sudo apt-get -y install nginx
允许 myVmWeb VM 向 Internet 发送出站流量以检索 nginx,因为默认安全规则允许发往 Internet 的所有出站流量。 退出 myVmWeb SSH 会话。随即会在 myVmMgmt VM 的 username@myVmMgmt:~$
提示符下退出。 若要从 myVmWeb VM 检索 nginx 欢迎屏幕,请输入以下命令:
curl myVmWeb
从 myVmMgmt VM 注销。 若要确认是否可以从 Azure 外部访问 myVmWeb Web 服务器,请在自己的计算机上输入 curl <publicIpAddress>
。 连接将会成功,因为允许通过端口 80 将入站流量从 Internet 发往已附加到 myVmWeb VM 的网络接口所在的 myAsgWebServers 应用程序安全组。
清理资源
如果不再需要资源组及其包含的所有资源,可以使用 az group delete 将其删除。
az group delete --name myResourceGroup --yes
后续步骤
在本文中,我们已创建一个网络安全组并将其关联到虚拟网络子网。 若要详细了解网络安全组,请参阅网络安全组概述和管理网络安全组。
默认情况下,Azure 在子网之间路由流量。 你也可以选择通过某个 VM(例如,充当防火墙的 VM)在子网之间路由流量。 若要了解操作方法,请参阅创建路由表。