你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

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

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

Azure Cloud Shell

Azure 托管 Azure Cloud Shell(一个可通过浏览器使用的交互式 shell 环境)。 可以将 Bash 或 PowerShell 与 Cloud Shell 配合使用来使用 Azure 服务。 可以使用 Cloud Shell 预安装的命令来运行本文中的代码,而不必在本地环境中安装任何内容。

若要启动 Azure Cloud Shell,请执行以下操作:

选项 示例/链接
选择代码或命令块右上角的“试用”。 选择“试用”不会自动将代码或命令复制到 Cloud Shell。 Screenshot that shows an example of Try It for Azure Cloud Shell.
转到 https://shell.azure.com 或选择启动 Cloud Shell 按钮可在浏览器中打开 Cloud Shell。 Button to launch Azure Cloud Shell.
选择 Azure 门户右上角菜单栏上的 Cloud Shell 按钮。 Screenshot that shows the Cloud Shell button in the Azure portal

若要使用 Azure Cloud Shell,请执行以下操作:

  1. 启动 Cloud Shell。

  2. 选择代码块(或命令块)上的“复制”按钮以复制代码或命令。

  3. 在 Windows 和 Linux 上选择 Ctrl+Shift+V,或在 macOS 上选择 Cmd+Shift+V 将代码或命令粘贴到 Cloud Shell 会话中。

  4. 选择“Enter”运行代码或命令。

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

创建网络安全组

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

创建应用程序安全组

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

New-AzResourceGroup -ResourceGroupName myResourceGroup -Location EastUS

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

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

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

创建安全规则

使用 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 eastus `
  -Name myNsg `
  -SecurityRules $webRule,$mgmtRule

创建虚拟网络

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

$virtualNetwork = New-AzVirtualNetwork `
  -ResourceGroupName myResourceGroup `
  -Location EastUS `
  -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 eastus `
  -Name myVmWeb

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

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

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

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

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