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

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

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

如果没有 Azure 订阅,请在开始前创建一个试用版订阅

如果选择在本地安装和使用 PowerShell,则本文需要 Azure PowerShell 模块 1.0.0 或更高版本。 运行 Get-Module -ListAvailable Az 查找已安装的版本。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。 如果在本地运行 PowerShell,则还需运行 Connect-AzAccount -Environment AzureChinaCloud 来创建与 Azure 的连接。

创建网络安全组

网络安全组包含安全规则。 安全规则指定源和目标。 源和目标可以是应用程序安全组。

创建应用程序安全组

首先使用 New-AzResourceGroup 针对本文中创建的所有资源创建一个资源组。 以下示例在“chinaeast”位置创建一个资源组:

Connect-AzAccount -Environment AzureChinaCloud
New-AzResourceGroup -ResourceGroupName myResourceGroup -Location ChinaEast

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

$webAsg = New-AzApplicationSecurityGroup `
  -ResourceGroupName myResourceGroup `
  -Name myAsgWebServers `
  -Location chinaeast

$mgmtAsg = New-AzApplicationSecurityGroup `
  -ResourceGroupName myResourceGroup `
  -Name myAsgMgmtServers `
  -Location chinaeast

创建安全规则

使用 New-AzNetworkSecurityRuleConfig 创建安全规则。 以下示例创建一个规则,该规则允许通过端口 80 和 443 将来自 Internet 的入站流量发往 myWebServers 应用程序安全组:

$webRule = New-AzNetworkSecurityRuleConfig `
  -Name "Allow-Web-All" `
  -Access Allow `
  -Protocol Tcp `
  -Direction Inbound `
  -Priority 100 `
  -SourceAddressPrefix Internet `
  -SourcePortRange * `
  -DestinationApplicationSecurityGroupId $webAsg.id `
  -DestinationPortRange 80,443

The following example creates a rule that allows traffic inbound from the internet to the *myMgmtServers* application security group over port 3389:

$mgmtRule = New-AzNetworkSecurityRuleConfig `
  -Name "Allow-RDP-All" `
  -Access Allow `
  -Protocol Tcp `
  -Direction Inbound `
  -Priority 110 `
  -SourceAddressPrefix Internet `
  -SourcePortRange * `
  -DestinationApplicationSecurityGroupId $mgmtAsg.id `
  -DestinationPortRange 3389

在本文中,将在 Internet 上为 myAsgMgmtServers VM 公开 RDP(端口 3389)。 在生产环境中,我们建议使用 VPN专用网络连接来连接到要管理的 Azure 资源,而不要向 Internet 公开端口 3389。

创建网络安全组

使用 New-AzNetworkSecurityGroup 创建网络安全组。 以下示例创建名为 myNsg 的网络安全组:

$nsg = New-AzNetworkSecurityGroup `
  -ResourceGroupName myResourceGroup `
  -Location chinaeast `
  -Name myNsg `
  -SecurityRules $webRule,$mgmtRule

创建虚拟网络

使用 New-AzVirtualNetwork 创建虚拟网络。 以下示例创建名为 myVirtualNetwork 的虚拟网络:

$virtualNetwork = New-AzVirtualNetwork `
  -ResourceGroupName myResourceGroup `
  -Location ChinaEast `
  -Name myVirtualNetwork `
  -AddressPrefix 10.0.0.0/16

使用 New-AzVirtualNetworkSubnetConfig 创建子网配置,然后使用 Set-AzVirtualNetwork 将子网配置写入虚拟网络。 以下示例将名为 mySubnet 的子网添加到虚拟网络,并将 myNsg 网络安全组关联到该虚拟网络:

Add-AzVirtualNetworkSubnetConfig `
  -Name mySubnet `
  -VirtualNetwork $virtualNetwork `
  -AddressPrefix "10.0.2.0/24" `
  -NetworkSecurityGroup $nsg
$virtualNetwork | Set-AzVirtualNetwork

创建虚拟机

在创建 VM 之前,使用 Get-AzVirtualNetwork 检索包含子网的虚拟网络对象:

$virtualNetwork = Get-AzVirtualNetwork `
 -Name myVirtualNetwork `
 -Resourcegroupname myResourceGroup

使用 New-AzPublicIpAddress 为每个 VM 创建一个公共 IP 地址:

$publicIpWeb = New-AzPublicIpAddress `
  -AllocationMethod Dynamic `
  -ResourceGroupName myResourceGroup `
  -Location chinaeast `
  -Name myVmWeb

$publicIpMgmt = New-AzPublicIpAddress `
  -AllocationMethod Dynamic `
  -ResourceGroupName myResourceGroup `
  -Location chinaeast `
  -Name myVmMgmt

使用 New-AzNetworkInterface 创建两个网络接口,并将公共 IP 地址分配给网络接口。 以下示例创建一个网络接口,将 myVmWeb 公共 IP 地址关联到该网络接口,并使其成为 myAsgWebServers 应用程序安全组的成员:

$webNic = New-AzNetworkInterface `
  -Location chinaeast `
  -Name myVmWeb `
  -ResourceGroupName myResourceGroup `
  -SubnetId $virtualNetwork.Subnets[0].Id `
  -ApplicationSecurityGroupId $webAsg.Id `
  -PublicIpAddressId $publicIpWeb.Id

以下示例创建一个网络接口,将 myVmMgmt 公共 IP 地址关联到该网络接口,并使其成为 myAsgMgmtServers 应用程序安全组的成员:

$mgmtNic = New-AzNetworkInterface `
  -Location chinaeast `
  -Name myVmMgmt `
  -ResourceGroupName myResourceGroup `
  -SubnetId $virtualNetwork.Subnets[0].Id `
  -ApplicationSecurityGroupId $mgmtAsg.Id `
  -PublicIpAddressId $publicIpMgmt.Id

在虚拟网络中创建两个 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."

$webVmConfig = New-AzVMConfig `
  -VMName myVmWeb `
  -VMSize Standard_DS1_V2 | `
Set-AzVMOperatingSystem -Windows `
  -ComputerName myVmWeb `
  -Credential $cred | `
Set-AzVMSourceImage `
  -PublisherName MicrosoftWindowsServer `
  -Offer WindowsServer `
  -Skus 2016-Datacenter `
  -Version latest | `
Add-AzVMNetworkInterface `
  -Id $webNic.Id
New-AzVM `
  -ResourceGroupName myResourceGroup `
  -Location chinaeast `
  -VM $webVmConfig `
  -AsJob

创建充当管理服务器的 VM:

# Create user object
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."

# Create the web server virtual machine configuration and virtual machine.
$mgmtVmConfig = New-AzVMConfig `
  -VMName myVmMgmt `
  -VMSize Standard_DS1_V2 | `
Set-AzVMOperatingSystem -Windows `
  -ComputerName myVmMgmt `
  -Credential $cred | `
Set-AzVMSourceImage `
  -PublisherName MicrosoftWindowsServer `
  -Offer WindowsServer `
  -Skus 2016-Datacenter `
  -Version latest | `
Add-AzVMNetworkInterface `
  -Id $mgmtNic.Id
New-AzVM `
  -ResourceGroupName myResourceGroup `
  -Location chinaeast `
  -VM $mgmtVmConfig

创建虚拟机需花费几分钟的时间。 请 Azure 创建完 VM 之前,请不要继续下一步。

测试流量筛选器

使用 Get-AzPublicIpAddress 返回 VM 的公共 IP 地址。 以下示例返回 myVmMgmt VM 的公共 IP 地址:

Get-AzPublicIpAddress `
  -Name myVmMgmt `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

从本地计算机使用以下命令创建与 myVmMgmt VM 的远程桌面会话。 将 <publicIpAddress> 替换为上一命令返回的 IP 地址。

mstsc /v:<publicIpAddress>

打开下载的 RDP 文件。 出现提示时,选择“连接”。

输入在创建 VM 时指定的用户名和密码(可能需要选择“更多选择”,然后选择“使用其他帐户”,以便指定在创建 VM 时输入的凭据),然后选择“确定”。 你可能会在登录过程中收到证书警告。 选择“是”以继续进行连接。

连接将会成功,因为允许通过端口 3389 将入站流量从 Internet 发往已附加到 myVmMgmt VM 的网络接口所在的 myAsgMgmtServers 应用程序安全组。

在 PowerShell 中使用以下命令,从 myVmMgmt VM 来与 myVmWeb VM 建立远程桌面连接:

mstsc /v:myvmWeb

连接将会成功,因为每个网络安全组中的默认安全规则允许通过虚拟网络中所有 IP 地址之间的所有端口发送流量。 无法从 Internet 来与 myVmWeb VM 建立远程桌面连接,因为 myAsgWebServers 的安全规则不允许通过端口 3389 发送来自 Internet 的入站流量。

在 PowerShell 中使用以下命令在 myVmWeb VM 上安装 Microsoft IIS:

Install-WindowsFeature -name Web-Server -IncludeManagementTools

完成 IIS 安装后,从 myVmWeb VM 断开连接,从而保留 myVmMgmt 远程桌面连接。 若要查看 IIS 欢迎屏幕上,请打开 Internet 浏览器并浏览到 http://myVmWeb.

myVmMgmt VM 断开连接。

在计算机上,在 PowerShell 中输入以下命令,以检索 myVmWeb 服务器的公共 IP 地址:

Get-AzPublicIpAddress `
  -Name myVmWeb `
  -ResourceGroupName myResourceGroup `
  | Select IpAddress

若要确认可以从 Azure 外部访问 myVmWeb Web 服务器,请在计算机上打开 Internet 浏览器并浏览到 http://<public-ip-address-from-previous-step>。 连接将会成功,因为允许通过端口 80 将入站流量从 Internet 发往已附加到 myVmWeb VM 的网络接口所在的 myAsgWebServers 应用程序安全组。

清理资源

如果不再需要资源组及其包含的所有资源,请使用 Remove-AzResourceGroup 将其删除:

Remove-AzResourceGroup -Name myResourceGroup -Force

后续步骤

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

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