使用 PowerShell 创建 NSG

可以在虚拟网络中使用 NSG 控制流向一个或多个虚拟机 (VM)、角色实例、网络适配器 (NIC) 或子网的流量。NSG 包含根据流量方向、协议、源地址和端口以及目标地址和端口允许或拒绝流量的访问控制规则。可以随时更改 NSG 的规则,所做的更改适用于所有关联的实例。

有关 NSG 的详细信息,请访问什么是 NSG

Azure 有两个部署模型:Azure Resource Manager 和经典模型。Azure 建议通过 Resource Manager 部署模型创建资源。若要深入了解这两个模型之间的差异,请阅读了解 Azure 部署模型一文。本文介绍 Resource Manager 部署模型。你还可以在经典部署模型中创建 NSG

方案

为了更好地说明如何创建 NSG,本文档将使用以下方案。

VNet 方案

在此方案中,你将为 TestVNet 虚拟网络中的每个子网创建 NSG,如下面所述:

  • NSG-FrontEnd。前端 NSG 将应用于 FrontEnd 子网,并且包含以下两个规则:
    • rdp-rule。此规则允许将 RDP 流量传输到 FrontEnd 子网。
    • web-rule。此规则允许将 HTTP 流量传输到 FrontEnd 子网。
  • NSG-BackEnd。后端 NSG 将应用于 BackEnd 子网,并且包含以下两个规则:
    • sql-rule。此规则只允许从 FrontEnd 子网传输的 SQL 流量。
    • web-rule。此规则将拒绝从 BackEnd 子网传输的所有 Internet 绑定流量。

将这些规则组合起来可创建一个与 DMZ 类似的方案,其中后端子网只能接收来自前端子网的 SQL 通信的传入流量且不能访问 Internet,而前端子网可以与 Internet 通信并只接收传入 HTTP 请求。

下面的示例 PowerShell 命令需要一个已经基于上述方案创建的简单环境。如果你想要运行本文档中所显示的命令,首先通过部署此模板构建测试环境,单击“部署至 Azure”,如有必要替换默认参数值,然后按照门户中的说明进行操作。

如何为前端子网创建 NSG

若要根据方案创建名为 NSG-FrontEnd 的 NSG,请完成以下步骤:

  1. 如果从未使用过 Azure PowerShell,请参阅如何安装和配置 Azure PowerShell,按照说明逐步完成操作,登录到 Azure 并选择订阅。
  2. 创建允许从 Internet 访问端口 3389 的安全规则。

    $rule1 = New-AzureRmNetworkSecurityRuleConfig -Name rdp-rule -Description "Allow RDP" `
    -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 `
    -SourceAddressPrefix Internet -SourcePortRange * `
    -DestinationAddressPrefix * -DestinationPortRange 3389
    
  3. 创建允许从 Internet 访问端口 80 的安全规则。

    $rule2 = New-AzureRmNetworkSecurityRuleConfig -Name web-rule -Description "Allow HTTP" `
    -Access Allow -Protocol Tcp -Direction Inbound -Priority 101 `
    -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * `
    -DestinationPortRange 80
    
  4. 将上面创建的规则添加到名为 NSG-FrontEnd 的新 NSG。

    $nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName TestRG -Location chinanorth `
    -Name "NSG-FrontEnd" -SecurityRules $rule1,$rule2
    
  5. 通过键入以下内容,查看在 NSG 中创建的规则:

    $nsg
    

    输出仅显示安全规则:

    SecurityRules        : [
                             {
                               "Name": "rdp-rule",
                               "Etag": "W/"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"",
                               "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/networkSecurityGroups/NSG-FrontEnd/securityRules/rdp-rule",
                               "Description": "Allow RDP",
                               "Protocol": "Tcp",
                               "SourcePortRange": "*",
                               "DestinationPortRange": "3389",
                               "SourceAddressPrefix": "Internet",
                               "DestinationAddressPrefix": "*",
                               "Access": "Allow",
                               "Priority": 100,
                               "Direction": "Inbound",
                               "ProvisioningState": "Succeeded"
                             },
                             {
                               "Name": "web-rule",
                               "Etag": "W/"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"",
                               "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/networkSecurityGroups/NSG-FrontEnd/securityRules/web-rule",
                               "Description": "Allow HTTP",
                               "Protocol": "Tcp",
                               "SourcePortRange": "*",
                               "DestinationPortRange": "80",
                               "SourceAddressPrefix": "Internet",
                               "DestinationAddressPrefix": "*",
                               "Access": "Allow",
                               "Priority": 101,
                               "Direction": "Inbound",
                               "ProvisioningState": "Succeeded"
                             }
                           ]
    
  6. 将上面创建的 NSG 与 FrontEnd 子网关联起来。

    $vnet = Get-AzureRmVirtualNetwork -ResourceGroupName TestRG -Name TestVNet
    Set-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name FrontEnd `
    -AddressPrefix 192.168.1.0/24 -NetworkSecurityGroup $nsg
    

    输出只显示 FrontEnd 子网设置,注意 NetworkSecurityGroup 属性值:

                Subnets           : [
                                      {
                                        "Name": "FrontEnd",
                                        "Etag": "W/"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"",
                                        "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/virtualNetworks/TestVNet/subnets/FrontEnd",
                                        "AddressPrefix": "192.168.1.0/24",
                                        "IpConfigurations": [
                                          {
                                            "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/networkInterfaces/TestNICWeb2/ipConfigurations/ipconfig1"
                                          },
                                          {
                                            "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/networkInterfaces/TestNICWeb1/ipConfigurations/ipconfig1"
                                          }
                                        ],
                                        "NetworkSecurityGroup": {
                                          "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/networkSecurityGroups/NSG-FrontEnd"
                                        },
                                        "RouteTable": null,
                                        "ProvisioningState": "Succeeded"
                                      }
    
    Warning

    上述命令的输出显示虚拟网络配置对象的内容,该对象仅存在于运行 PowerShell 的计算机上。若要将这些设置保存到 Azure,需要运行 Set-AzureRmVirtualNetwork cmdlet。

  7. 将新的 VNet 设置保存到 Azure。

    Set-AzureRmVirtualNetwork -VirtualNetwork $vnet
    

    输出仅显示 NSG 部分:

    "NetworkSecurityGroup": {
      "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/networkSecurityGroups/NSG-FrontEnd"
    }
    

如何为后端子网创建 NSG

若要根据以上方案创建名为 NSG-BackEnd 的 NSG,请完成以下步骤:

  1. 创建允许从前端子网访问端口 1433(SQL Server 使用的默认端口)的安全规则。

    $rule1 = New-AzureRmNetworkSecurityRuleConfig -Name frontend-rule `
    -Description "Allow FE subnet" `
    -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 `
    -SourceAddressPrefix 192.168.1.0/24 -SourcePortRange * `
    -DestinationAddressPrefix * -DestinationPortRange 1433
    
  2. 创建阻止访问 Internet 的安全规则。

    $rule2 = New-AzureRmNetworkSecurityRuleConfig -Name web-rule `
    -Description "Block Internet" `
    -Access Deny -Protocol * -Direction Outbound -Priority 200 `
    -SourceAddressPrefix * -SourcePortRange * `
    -DestinationAddressPrefix Internet -DestinationPortRange *
    
  3. 将上面创建的规则添加到名为 NSG-BackEnd 的新 NSG。

    $nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName TestRG `
    -Location chinanorth -Name "NSG-BackEnd" `
    -SecurityRules $rule1,$rule2
    
  4. 将上面创建的 NSG 与 BackEnd 子网关联起来。

    Set-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name BackEnd ` 
    -AddressPrefix 192.168.2.0/24 -NetworkSecurityGroup $nsg
    

    输出只显示 BackEnd 子网设置,注意 NetworkSecurityGroup 属性值:

    Subnets           : [
                  {
                    "Name": "BackEnd",
                    "Etag": "W/"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"",
                    "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/virtualNetworks/TestVNet/subnets/BackEnd",
                    "AddressPrefix": "192.168.2.0/24",
                    "IpConfigurations": [...],
                    "NetworkSecurityGroup": {
                      "Id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/TestRG/providers/Microsoft.Network/networkSecurityGroups/NSG-BackEnd"
                    },
                    "RouteTable": null,
                    "ProvisioningState": "Succeeded"
                  }
    
  5. 将新的 VNet 设置保存到 Azure。

    Set-AzureRmVirtualNetwork -VirtualNetwork $vnet
    

如何删除 NSG

若要删除现有的 NSG(在本例中名为 NSG-Frontend ),请执行以下步骤:

如下所示运行 Remove-AzureRmNetworkSecurityGroup,请务必包含 NSG 所在的资源组。

Remove-AzureRmNetworkSecurityGroup -Name "NSG-FrontEnd" -ResourceGroupName "TestRG"