你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
教程:使用网络安全组筛选网络流量
本文内容
可以使用网络安全组来筛选进出 Azure 虚拟网络中 Azure 资源的入站和出站网络流量。
网络安全组包含安全规则,这些规则可按 IP 地址、端口和协议筛选网络流量。 当网络安全组与某个子网关联时,安全规则将应用于该子网中部署的资源。
本教程介绍如何执行下列操作:
创建网络安全组和安全规则
创建应用程序安全组
创建虚拟网络并将网络安全组关联到子网
部署虚拟机并将其网络接口关联到应用程序安全组
先决条件
Azure Cloud Shell
Azure 托管 Azure Cloud Shell(一个可通过浏览器使用的交互式 shell 环境)。 可以将 Bash 或 PowerShell 与 Cloud Shell 配合使用来使用 Azure 服务。 可以使用 Cloud Shell 预安装的命令来运行本文中的代码,而不必在本地环境中安装任何内容。
若要启动 Azure Cloud Shell,请执行以下操作:
选项
示例/链接
选择代码或命令块右上角的“试用”。 选择“试用”不会自动将代码或命令复制到 Cloud Shell。
转到 https://shell.azure.com 或选择“启动 Cloud Shell”按钮可在浏览器中打开 Cloud Shell。
选择 Azure 门户 右上角菜单栏上的 Cloud Shell 按钮。
若要使用 Azure Cloud Shell,请执行以下操作:
启动 Cloud Shell。
选择代码块(或命令块)上的“复制”按钮以复制代码或命令。
在 Windows 和 Linux 上选择 Ctrl+Shift+V,或在 macOS 上选择 Cmd+Shift+V 将代码或命令粘贴到 Cloud Shell 会话中。
选择“Enter”运行代码或命令。
如果选择在本地安装和使用 PowerShell,则本文需要 Azure PowerShell 模块 1.0.0 或更高版本。 运行 Get-Module -ListAvailable Az
查找已安装的版本。 如果需要进行升级,请参阅 Install Azure PowerShell module (安装 Azure PowerShell 模块)。 如果在本地运行 PowerShell,则还需运行 Connect-AzAccount
以创建与 Azure 的连接。
如果没有 Azure 订阅 ,请在开始之前创建一个 Azure 免费帐户 。
本文需要 Azure CLI 2.0.28 或更高版本。 如果使用 Azure Cloud Shell,则最新版本已安装。
下面的过程创建虚拟网络及资源子网。
在门户中,搜索并选择“虚拟网络 ”。
在“虚拟网络”页面上,选择“+ 创建”。
在创建虚拟网络 的基本信息 选项卡上输入或选择以下信息:
设置
值
项目详细信息
订阅
选择订阅。
资源组
选择“新建”。 在“名称 ”中输入 test-rg 。 选择“确定”。
实例详细信息
名称
输入“vnet-1”。
区域
选择“美国东部 2”。
选择下一步 ,转到安全性 选项卡。
选择“下一步”,转到“IP 地址”选项卡。
在“子网”下的地址空间框中,选择“默认”子网 。
在“编辑子网”窗格中,输入或选择以下信息 :
设置
值
子网详细信息
子网模板
将默认值保留为“默认” 。
名称
输入“subnet-1”。
开始地址
保留默认值“10.0.0.0 ”。
子网大小
保留默认值/24 (256 个地址) 。
选择“保存”。
在屏幕底部选择“查看 + 创建” 。 通过验证后,选择“创建”。
首先使用 New-AzResourceGroup 针对本文中创建的所有资源创建一个资源组。 以下示例在 westus2 位置创建了一个资源组:
$rg = @{
ResourceGroupName = "test-rg"
Location = "westus2"
}
New-AzResourceGroup @rg
使用 New-AzVirtualNetwork 创建虚拟网络。 以下示例创建了名为 vnet-1 的虚拟网络:
$vnet = @{
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "vnet-1"
AddressPrefix = "10.0.0.0/16"
}
$virtualNetwork = New-AzVirtualNetwork @vnet
使用 New-AzVirtualNetworkSubnetConfig 创建子网配置,然后使用 Set-AzVirtualNetwork 将子网配置写入虚拟网络。 以下示例将名为 subnet-1 的子网添加到虚拟网络,并将 nsg-1 网络安全组关联到该虚拟网络:
$subnet = @{
Name = "subnet-1"
VirtualNetwork = $virtualNetwork
AddressPrefix = "10.0.0.0/24"
}
Add-AzVirtualNetworkSubnetConfig @subnet
$virtualNetwork | Set-AzVirtualNetwork
首先使用 az group create 针对本文中创建的所有资源创建一个资源组。 以下示例在 westus2 位置创建了一个资源组:
az group create \
--name test-rg \
--location westus2
使用 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
创建应用程序安全组
使用应用程序安全组 (ASG) 可将功能类似的服务器(例如 Web 服务器)分组到一起。
在门户顶部的搜索框中,输入应用程序安全组 。 在搜索结果中选择“应用程序安全组”。
选择“+ 新建”。
在“创建应用程序安全组”的“基本信息”选项卡中,输入或选择以下信息 :
设置
值
项目详细信息
订阅
选择订阅。
资源组
选择“test-rg”。
实例详细信息
名称
输入“asg-web”。
区域
选择“美国东部 2”。
选择“查看 + 创建”。
选择“+ 新建”。
重复上述步骤并指定以下值:
设置
值
项目详细信息
订阅
选择订阅。
资源组
选择“test-rg”。
实例详细信息
名称
输入“asg-mgmt”。
区域
选择“美国东部 2”。
选择“查看 + 创建”。
选择“创建”。
使用 New-AzApplicationSecurityGroup 创建应用程序安全组。 使用应用程序安全组可以分组具有类似端口筛选要求的服务器。 以下示例创建两个应用程序安全组。
$web = @{
ResourceGroupName = "test-rg"
Name = "asg-web"
Location = "westus2"
}
$webAsg = New-AzApplicationSecurityGroup @web
$mgmt = @{
ResourceGroupName = "test-rg"
Name = "asg-mgmt"
Location = "westus2"
}
$mgmtAsg = New-AzApplicationSecurityGroup @mgmt
使用 az network asg create 创建应用程序安全组。 使用应用程序安全组可以分组具有类似端口筛选要求的服务器。 以下示例创建两个应用程序安全组。
az network asg create \
--resource-group test-rg \
--name asg-web \
--location westus2
az network asg create \
--resource-group test-rg \
--name asg-mgmt \
--location westus2
创建网络安全组
网络安全组 (NSG) 保护虚拟网络中的网络流量。
在门户顶部的搜索框中,输入“网络安全组”。 在搜索结果中选择“网络安全组”。
注意
在网络安全组的搜索结果中,你可能会看到网络安全组(经典)。 选择“网络安全组”。
选择+ 新建 。
在“创建网络安全组”的“基本信息”选项卡中,输入或选择以下信息 :
设置
值
项目详细信息
订阅
选择订阅。
资源组
选择“test-rg”。
实例详细信息
名称
输入“nsg-app1”。
位置
选择“美国东部 2”。
选择“查看 + 创建”。
选择“创建”。
使用 New-AzNetworkSecurityGroup 创建网络安全组。 以下示例创建了一个名为 nsg-1 的网络安全组:
$nsgParams = @{
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "nsg-1"
}
$nsg = New-AzNetworkSecurityGroup @nsgParams
使用 az network nsg create 创建网络安全组。 以下示例创建了一个名为 nsg-1 的网络安全组:
# Create a network security group
az network nsg create \
--resource-group test-rg \
--name nsg-1
将网络安全组关联到子网
在本部分,你要将网络安全组与前面创建的虚拟网络的子网相关联。
在门户顶部的搜索框中,输入“网络安全组”。 在搜索结果中选择网络安全组 。
选择nsg-1 。
在nsg-1 的设置 部分选择子网 。
在“子网”页中,选择“+ 关联”:
在“关联子网”下,为“虚拟网络”选择“vnet-1 (test-rg)”。
为“子网”选择“subnet-1”,然后选择“确定”。
使用 Get-AzVirtualNetwork 检索虚拟网络对象,然后使用 Set-AzVirtualNetworkSubnetConfig 将网络安全组与子网相关联。 以下示例检索虚拟网络对象并更新子网配置以关联网络安全组:
# Retrieve the virtual network
$vnet = Get-AzVirtualNetwork -Name "vnet-1" -ResourceGroupName "test-rg"
# Update the subnet configuration to associate the network security group
$subnetConfigParams = @{
VirtualNetwork = $vnet
Name = "subnet-1"
AddressPrefix = $vnet.Subnets[0].AddressPrefix
NetworkSecurityGroup = Get-AzNetworkSecurityGroup -Name "nsg-1" -ResourceGroupName "test-rg"
}
Set-AzVirtualNetworkSubnetConfig @subnetConfigParams
# Update the virtual network with the new subnet configuration
$vnet | Set-AzVirtualNetwork
使用 az network vnet subnet update 将网络安全组与子网相关联。 以下示例将 nsg-1 网络安全组与 subnet-1 子网相关联:
az network vnet subnet update \
--resource-group test-rg \
--vnet-name vnet-1 \
--name subnet-1 \
--network-security-group nsg-1
创建安全规则
在“nsg-1”的“设置”部分选择“入站安全规则”。
在“入站安全规则”页中,选择“+ 添加”。
创建一项允许端口 80 和 443 与 asg-web 应用程序安全组通信的安全规则。 在“添加入站安全规则”中,输入或选择以下信息:
设置
值
源
保留默认值“任意”。
源端口范围
保留默认值 (*)。
目标
选择“应用程序安全组”。
目标应用程序安全组
选择“asg-web”。
服务
保留默认值“自定义”。
目标端口范围
输入“80,443”。
协议
选择TCP 。
操作
保留默认值“允许”。
优先级
保留默认值“100”。
名称
输入“allow-web-all”。
选择 添加 。
使用以下信息完成前面的步骤:
设置
值
源
保留默认值“任意”。
源端口范围
保留默认值 (*)。
目标
选择“应用程序安全组”。
目标应用程序安全组
选择“asg-mgmt”。
服务
选择 RDP 。
操作
保留默认值“允许”。
优先级
保留默认值“110”。
名称
输入“allow-rdp-all”。
选择“添加” 。
注意
在本文中,将在 Internet 上为分配给“asg-mgmt”应用程序安全组的 VM 公开 RDP(端口 3389)。
在生产环境中,建议使用 VPN、专用网络连接或 Azure Bastion 来连接到要管理的 Azure 资源,而不要向 Internet 公开端口 3389。
有关 Azure Bastion 的详细信息,请参阅什么是 Azure Bastion? 。
使用 New-AzNetworkSecurityRuleConfig 创建安全规则。 以下示例创建了一个规则,该规则允许通过端口 80 和 443 将来自 Internet 的入站流量发往 asg-web 应用程序安全组:
$webAsgParams = @{
Name = "asg-web"
ResourceGroupName = "test-rg"
}
$webAsg = Get-AzApplicationSecurityGroup @webAsgParams
$webRuleParams = @{
Name = "Allow-Web-All"
Access = "Allow"
Protocol = "Tcp"
Direction = "Inbound"
Priority = 100
SourceAddressPrefix = "Internet"
SourcePortRange = "*"
DestinationApplicationSecurityGroupId = $webAsg.id
DestinationPortRange = 80,443
}
$webRule = New-AzNetworkSecurityRuleConfig @webRuleParams
以下示例创建了一个规则,该规则允许通过端口 3389 将来自 Internet 的入站流量发往 asg-mgmt 应用程序安全组:
$mgmtAsgParams = @{
Name = "asg-mgmt"
ResourceGroupName = "test-rg"
}
$mgmtAsg = Get-AzApplicationSecurityGroup @mgmtAsgParams
$mgmtRuleParams = @{
Name = "Allow-RDP-All"
Access = "Allow"
Protocol = "Tcp"
Direction = "Inbound"
Priority = 110
SourceAddressPrefix = "Internet"
SourcePortRange = "*"
DestinationApplicationSecurityGroupId = $mgmtAsg.id
DestinationPortRange = 3389
}
$mgmtRule = New-AzNetworkSecurityRuleConfig @mgmtRuleParams
使用 Get-AzNetworkSecurityGroup 检索现有网络安全组,然后使用 +=
运算符添加新规则。 最后,使用 Set-AzNetworkSecurityGroup 更新网络安全组:
# Retrieve the existing network security group
$nsg = Get-AzNetworkSecurityGroup -Name "nsg-1" -ResourceGroupName "test-rg"
# Add the new rules to the security group
$nsg.SecurityRules += $webRule
$nsg.SecurityRules += $mgmtRule
# Update the network security group with the new rules
Set-AzNetworkSecurityGroup -NetworkSecurityGroup $nsg
注意
在本文中,将在 Internet 上为分配给“asg-mgmt”应用程序安全组的 VM 公开 RDP(端口 3389)。
在生产环境中,建议使用 VPN、专用网络连接或 Azure Bastion 来连接到要管理的 Azure 资源,而不要向 Internet 公开端口 3389。
有关 Azure Bastion 的详细信息,请参阅什么是 Azure Bastion? 。
使用 az network nsg rule create 创建安全规则。 以下示例创建了一个规则,该规则允许通过端口 80 和 443 将来自 Internet 的入站流量发往 asg-web 应用程序安全组:
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" \
--destination-port-range 80 443
以下示例创建了一个规则,该规则允许通过端口 22 将来自 Internet 的入站流量发往 asg-mgmt 应用程序安全组:
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" \
--destination-port-range 22
注意
在本文中,分配给 asg-mgmt 应用程序安全组的 VM 的 SSH(端口 22)是向 Internet 公开的 。
在生产环境中,建议使用 VPN、专用网络连接或 Azure Bastion 来连接到要管理的 Azure 资源,而不要向 Internet 公开端口 22。
有关 Azure Bastion 的详细信息,请参阅什么是 Azure Bastion? 。
创建虚拟机
在虚拟网络中创建两个虚拟机 (VM)。
在门户中,搜索并选择虚拟机 。
在虚拟机 中,依次选择+ 创建 、Azure 虚拟机 。
在创建虚拟机 的基本信息 选项卡中,输入或选择以下信息 :
设置
值
项目详细信息
订阅
选择订阅。
资源组
选择“test-rg”。
实例详细信息
虚拟机名称
输入“vm-web”。
区域
选择“(US)美国东部 2”。
可用性选项
保留默认值不需要基础结构冗余 。
安全类型
选择“标准”。
映像
选择“Windows Server 2022 Datacenter - x64 Gen2”。
Azure Spot 实例
保留默认值“未选中”。
大小
选择一个大小。
管理员帐户
用户名
输入用户名。
Password
输入密码。
确认密码
重新输入密码。
入站端口规则
选择入站端口
选择“无”。
选择“下一步: 磁盘”,然后选择“下一步: 网络”。
在“网络”中,输入或选择以下信息:
设置
值
网络接口
虚拟网络
选择“vnet-1”。
子网
选择“subnet-1 (10.0.0.0/24)”。
公共 IP
保留默认值“新建公共 IP”。
NIC 网络安全组
选择“无”。
选择“查看 + 创建”选项卡,或选择页面底部的“查看 + 创建”按钮 。
选择创建 。 部署 VM 可能需要几分钟时间。
重复上述步骤以创建名为 vm-mgmt 的第二个虚拟机 。
在创建 VM 之前,使用 Get-AzVirtualNetwork 检索包含子网的虚拟网络对象:
$virtualNetworkParams = @{
Name = "vnet-1"
ResourceGroupName = "test-rg"
}
$virtualNetwork = Get-AzVirtualNetwork @virtualNetworkParams
使用 New-AzPublicIpAddress 为每个 VM 创建一个公共 IP 地址:
$publicIpWebParams = @{
AllocationMethod = "Static"
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "public-ip-vm-web"
}
$publicIpWeb = New-AzPublicIpAddress @publicIpWebParams
$publicIpMgmtParams = @{
AllocationMethod = "Static"
ResourceGroupName = "test-rg"
Location = "westus2"
Name = "public-ip-vm-mgmt"
}
$publicIpMgmt = New-AzPublicIpAddress @publicIpMgmtParams
使用 New-AzNetworkInterface 创建两个网络接口,并将公共 IP 地址分配给网络接口。 以下示例创建一个网络接口,将 public-ip-vm-web 公共 IP 地址关联到该网络接口。
$webNicParams = @{
Location = "westus2"
Name = "vm-web-nic"
ResourceGroupName = "test-rg"
SubnetId = $virtualNetwork.Subnets[0].Id
PublicIpAddressId = $publicIpWeb.Id
}
$webNic = New-AzNetworkInterface @webNicParams
以下示例创建一个网络接口,将 public-ip-vm-mgmt 公共 IP 地址关联到该网络接口。
$mgmtNicParams = @{
Location = "westus2"
Name = "vm-mgmt-nic"
ResourceGroupName = "test-rg"
SubnetId = $virtualNetwork.Subnets[0].Id
PublicIpAddressId = $publicIpMgmt.Id
}
$mgmtNic = New-AzNetworkInterface @mgmtNicParams
在虚拟网络中创建两个 VM,以便在后续步骤中可以验证流量筛选。
使用 New-AzVMConfig 创建 VM 配置,然后使用 New-AzVM 创建 VM。 以下示例创建了充当 Web 服务器的 VM。 -AsJob
选项会在后台创建 VM,因此可继续执行下一步:
# Create user object
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."
$webVmConfigParams = @{
VMName = "vm-web"
VMSize = "Standard_DS1_V2"
}
$vmOSParams = @{
ComputerName = "vm-web"
Credential = $cred
}
$vmImageParams = @{
PublisherName = "MicrosoftWindowsServer"
Offer = "WindowsServer"
Skus = "2022-Datacenter"
Version = "latest"
}
$webVmConfig = New-AzVMConfig @webVmConfigParams | Set-AzVMOperatingSystem -Windows @vmOSParams | Set-AzVMSourceImage @vmImageParams | Add-AzVMNetworkInterface -Id $webNic.Id
$webVmParams = @{
ResourceGroupName = "test-rg"
Location = "westus2"
VM = $webVmConfig
}
New-AzVM @webVmParams -AsJob
创建充当管理服务器的 VM:
# Create user object
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."
$webVmConfigParams = @{
VMName = "vm-mgmt"
VMSize = "Standard_DS1_V2"
}
$vmOSParams = @{
ComputerName = "vm-mgmt"
Credential = $cred
}
$vmImageParams = @{
PublisherName = "MicrosoftWindowsServer"
Offer = "WindowsServer"
Skus = "2022-Datacenter"
Version = "latest"
}
$mgmtVmConfig = New-AzVMConfig @webVmConfigParams | Set-AzVMOperatingSystem -Windows @vmOSParams | Set-AzVMSourceImage @vmImageParams | Add-AzVMNetworkInterface -Id $mgmtNic.Id
$mgmtVmParams = @{
ResourceGroupName = "test-rg"
Location = "westus2"
VM = $mgmtVmConfig
}
New-AzVM @mgmtVmParams
创建虚拟机需花费几分钟的时间。 请 Azure 创建完 VM 之前,请不要继续下一步。
在虚拟网络中创建两个 VM,以便在后续步骤中可以验证流量筛选。
使用 az vm create 创建 VM。 以下示例创建了充当 Web 服务器的 VM。 指定 --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 "" \
--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": "westus2",
"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。
以下示例将创建 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 "" \
--admin-username azureuser \
--generate-ssh-keys \
--assign-identity
创建 VM 需要几分钟时间。 请 Azure 创建完 VM 之前,请不要继续下一步。
将网络接口关联到 ASG
当你创建 VM 时,Azure 已经为每个 VM 创建了一个网络接口,并已将该接口附加到 VM。
请将每个 VM 的网络接口添加到前面创建的应用程序安全组:
在门户顶部的搜索框中,输入“虚拟机”。 在搜索结果中选择“虚拟机” ,然后选择“vm-web” 。
从 vm-web 的“网络”部分选择“应用程序安全组”。
选择“添加应用程序安全组”,然后在“添加应用程序安全组”选项卡中,选择 asg-web。 最后选择“添加” 。
对 vm-mgmt 重复前面的步骤,在“添加应用程序安全组”选项卡中选择“asg-mgmt”。
使用 Get-AzNetworkInterface 检索虚拟机的网络接口,然后使用 Get-AzApplicationSecurityGroup 检索应用程序安全组。 最后,使用 Set-AzNetworkInterface 将应用程序安全组与网络接口相关联。 以下示例将 asg-web 应用程序安全组与 vm-web-nic 网络接口相关联:
$params1 = @{
Name = "vm-web-nic"
ResourceGroupName = "test-rg"
}
$nic = Get-AzNetworkInterface @params1
$params2 = @{
Name = "asg-web"
ResourceGroupName = "test-rg"
}
$asg = Get-AzApplicationSecurityGroup @params2
$nic.IpConfigurations[0].ApplicationSecurityGroups = @($asg)
$params3 = @{
NetworkInterface = $nic
}
Set-AzNetworkInterface @params3
重复该命令,以将 asg-mgmt 应用程序安全组与 vm-mgmt-nic 网络接口相关联。
$params1 = @{
Name = "vm-mgmt-nic"
ResourceGroupName = "test-rg"
}
$nic = Get-AzNetworkInterface @params1
$params2 = @{
Name = "asg-mgmt"
ResourceGroupName = "test-rg"
}
$asg = Get-AzApplicationSecurityGroup @params2
$nic.IpConfigurations[0].ApplicationSecurityGroups = @($asg)
$params3 = @{
NetworkInterface = $nic
}
Set-AzNetworkInterface @params3
使用 az network nic update 将网络接口与应用程序安全组相关联。 以下示例将 asg-web 应用程序安全组与 vm-web-nic 网络接口相关联:
# Retrieve the network interface name associated with the virtual machine
nic_name=$(az vm show --resource-group test-rg --name vm-web --query 'networkProfile.networkInterfaces[0].id' -o tsv | xargs basename)
# Associate the application security group with the network interface
az network nic ip-config update \
--name ipconfigvm-web \
--nic-name $nic_name \
--resource-group test-rg \
--application-security-groups asg-web
重复该命令,以将 asg-mgmt 应用程序安全组与 vm-mgmt-nic 网络接口相关联。
# Retrieve the network interface name associated with the virtual machine
nic_name=$(az vm show --resource-group test-rg --name vm-mgmt --query 'networkProfile.networkInterfaces[0].id' -o tsv | xargs basename)
# Associate the application security group with the network interface
az network nic ip-config update \
--name ipconfigvm-mgmt \
--nic-name $nic_name \
--resource-group test-rg \
--application-security-groups asg-mgmt
测试流量筛选器
在门户顶部的搜索框中,输入“虚拟机”。 在搜索结果中,选择“虚拟机”。
选择“vm-mgmt” 。
在“概述”页上选择“连接”按钮,然后选择“本地 RDP”。
选择“下载 RDP 文件”。
打开下载的 rdp 文件,然后选择“连接”。 输入在创建 VM 时指定的用户名和密码。
选择“确定” 。
在连接过程中可能会收到证书警告。 如果收到警告,请选择“是”或“继续”以继续连接 。
连接会成功,因为允许通过端口 3389 将来自 Internet 的入站流量发送到 asg-mgmt 应用程序安全组。
vm-mgmt 的网络接口与 asg-mgmt 应用程序安全组相关联,并允许连接 。
在 vm-mgmt 上打开一个 PowerShell 会话。使用以下命令连接到 vm-web :
mstsc /v:vm-web
从 vm-mgmt 到 vm-web 的 RDP 连接会成功,因为同一网络中的虚拟机默认情况下可以通过任何端口相互通信 。
不能创建从 Internet 到 vm-web 虚拟机的 RDP 连接。 “asg-web”的安全规则阻止从 Internet 连接到端口 3389 入站。 默认情况下,拒绝来自 Internet 的入站流量到所有资源。
若要在 vm-web 虚拟机上安装 Microsoft IIS,请通过 PowerShell 会话在 vm-web 虚拟机上输入以下命令 :
Install-WindowsFeature -name Web-Server -IncludeManagementTools
完成 IIS 安装后,断开与 vm-web 虚拟机的连接,从而保留 vm-mgmt 虚拟机远程桌面连接 。
断开与 vm-mgmt VM 的连接 。
在门户搜索框中搜索“vm-web” 。
在“vm-web”的“概述”页上,记下 VM 的“公共 IP 地址” 。 以下示例中显示的地址为 203.0.113.103。 你的地址不同:
若要确认可以从 Internet 访问 vm-web Web 服务器,请在计算机上打开 Internet 浏览器并浏览到 http://<public-ip-address-from-previous-step>
。
你将看到 IIS 默认页,因为允许通过端口 80 将来自 Internet 的入站流量发送到 asg-web 应用程序安全组。
为 vm-web 附加的网络接口与 asg-web 应用程序安全组相关联,并允许连接 。
使用 Get-AzPublicIpAddress 返回 VM 的公共 IP 地址。 以下示例返回 vm-mgmt VM 的公共 IP 地址 :
$params = @{
Name = "public-ip-vm-mgmt"
ResourceGroupName = "test-rg"
}
$publicIP = Get-AzPublicIpAddress @params | Select IpAddress
从本地计算机使用以下命令创建与 vm-mgmt VM 的远程桌面会话。
mstsc /v:$publicIP
输入在创建 VM 时指定的用户名和密码(可能需要选择“更多选择”,然后选择“使用其他帐户”,以便指定在创建 VM 时输入的凭据),然后选择“确定”。 你可能会在登录过程中收到证书警告。 选择“是”以继续进行连接。
连接成功。 已允许通过端口 3389 发送从 Internet 到 asg-mgmt 应用程序安全组的入站流量。 附加到 vm-mgmt VM 的网络接口在此组中。
在 PowerShell 中使用以下命令,创建从 myVmMgmt VM 到 vm-web VM 的远程桌面连接:
mstsc /v:vm-web
连接将会成功,因为每个网络安全组中的默认安全规则允许通过虚拟网络中所有 IP 地址之间的所有端口发送流量。 无法创建从 Internet 到 vm-web VM 的远程桌面连接,因为 asg-web 的安全规则不允许通过端口 3389 发送来自 Internet 的入站流量。
在 PowerShell 中使用以下命令将 Microsoft IIS 安装到 vm-web VM 上 :
Install-WindowsFeature -name Web-Server -IncludeManagementTools
完成 IIS 安装后,断开与 vm-web VM 的连接,从而保留 vm-mgmt 远程桌面连接。 若要查看 IIS 欢迎屏幕上,请打开 Internet 浏览器并浏览到 http://vm-web.
断开与 vm-mgmt VM 的连接 。
在你的计算机上的 PowerShell 中输入以下命令,以检索 vm-web 服务器的公共 IP 地址:
$params = @{
Name = "public-ip-vm-web"
ResourceGroupName = "test-rg"
}
Get-AzPublicIpAddress @params | Select IpAddress
若要确认可以从 Azure 外部访问 vm-web Web 服务器,请在计算机上打开 Internet 浏览器并浏览到 http://<public-ip-address-from-previous-step>
。 连接成功。 已允许通过端口 80 发送从 Internet 到 asg-web 应用程序安全组的入站流量。 附加到 vm-web VM 的网络接口在此组中。
使用所选的 SSH 客户端连接到之前创建的 VM。 例如,可从命令行接口(如 适用于 Linux 的 Windows 子系统 )使用以下命令创建与 vm-mgmt VM 的 SSH 会话。 可使用 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 应用程序安全组中,该安全组允许通过端口 22 发送来自 Internet 的入站流量。
使用以下命令通过 SSH 从 vm-mgmt VM 连接到 vm-web VM:
ssh -o StrictHostKeyChecking=no azureuser@vm-web
连接将会成功,因为每个网络安全组中的默认安全规则允许通过虚拟网络中所有 IP 地址之间的所有端口发送流量。 无法通过 SSH 从 Internet 连接到 vm-web VM,因为 asg-web 的安全规则不允许通过端口 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 应用程序安全组允许通过端口 80 发送来自 Internet 的入站流量。
使用完创建的资源之后,可以删除资源组及其所有资源。
在 Azure 门户中,搜索并选择“资源组”。
在“资源组”页上,选择“test-rg”资源组。
在“test-rg”页上,选择“删除资源组”。
在“输入资源组名称以确认删除”中输入“test-rg”,然后选择“删除” 。
如果不再需要资源组及其包含的所有资源,请使用 Remove-AzResourceGroup 将其删除:
$params = @{
Name = "test-rg"
Force = $true
}
Remove-AzResourceGroup @params
如果不再需要资源组及其包含的所有资源,可以使用 az group delete 将其删除。
az group delete \
--name test-rg \
--yes \
--no-wait
后续步骤
在本教程中,你将了解:
已创建一个网络安全组并将其关联到虚拟网络子网。
已为 Web 和管理创建应用程序安全组。
已创建两个虚拟机并将其网络接口与应用程序安全组相关联。
已测试应用程序安全组网络筛选。
若要详细了解网络安全组,请参阅网络安全组概述 和管理网络安全组 。
默认情况下,Azure 在子网之间路由流量。 你也可以改为选择通过某个 VM(例如,充当防火墙的 VM)在子网之间路由流量。
若要了解如何创建路由表,请继续学习下一教程。