通过虚拟网络服务终结点,您可以将一些 Azure 服务资源的网络访问限制为虚拟网络子网。 您还可以删除资源的 Internet 访问。 服务终结点提供从您的虚拟网络到受支持的 Azure 服务的直接连接,使您能够使用虚拟网络的专用地址空间来访问 Azure 服务。 通过服务终结点发往Azure资源的流量始终保留在Azure主干网络上。
本教程介绍如何执行下列操作:
- 使用一个子网创建虚拟网络
- 添加子网并启用服务终结点
- 创建一个Azure资源,并仅允许从一个子网访问网络。
- 将虚拟机 (VM) 部署到每个子网
- 确认从子网访问资源
- 确认拒绝从子网和互联网访问资源
先决条件
如果没有Azure订阅,请在开始前创建 Trial。
如果选择在本地安装和使用 PowerShell,本文需要Azure PowerShell模块版本 1.0.0 或更高版本。 运行 Get-Module -ListAvailable Az 查找已安装的版本。 如果需要升级,请参阅 Install Azure PowerShell 模块。 如果在本地运行 PowerShell,则还需要运行 Connect-AzAccount -Environment AzureChinaCloud 来创建与Azure的连接。
如果您没有 Azure 试用订阅,请在开始之前创建 试用订阅。
可以使用本地Azure CLI。
- 本文需要 2.0.28 或更高版本的Azure CLI。
创建资源组
登录到 Azure 门户。
在门户顶部的搜索框中输入“资源组”。 在搜索结果中选择“资源组”。
选择“+ 新建”。
在“创建资源组”的“基本信息”选项卡中,输入或选择以下信息:
| 设置 |
值 |
|
项目详细信息 |
|
| 订阅 |
选择订阅。 |
| 资源组 |
输入 test-rg。 |
| 区域 |
选择“中国北部 3”。 |
选择“查看 + 创建”。
选择创建。
创建虚拟网络
在门户顶部的搜索框中,输入 Virtual network。 在搜索结果中,选择“虚拟网络”。
选择“+ 新建”。
在“创建虚拟网络”的“基本信息”选项卡上,输入或选择以下信息:
| 设置 |
值 |
|
项目详细信息 |
|
| 订阅 |
选择订阅。 |
| 资源组 |
选择“test-rg”。 |
|
实例详细信息 |
|
| 名称 |
输入“vnet-1”。 |
| 区域 |
选择“中国北部 3”。 |
选择“下一步”,转到“安全性”选项卡。
选择下一步,转到IP 地址选项卡。
在“子网”的地址空间框中,选择“默认”子网。
在 “编辑子网”中,输入或选择以下信息:
| 设置 |
值 |
|
子网详细信息 |
|
| 子网模板 |
保留默认值“默认”。 |
| 名称 |
输入“subnet-1”。 |
| 起始地址 |
保留默认值“10.0.0.0”。 |
| 子网大小 |
保留默认值“/24 (256 个地址)”。 |
选择“保存”。
选择屏幕底部的“查看 + 创建”,然后在验证通过时选择“创建”。
部署Azure Bastion
Azure Bastion 使用浏览器通过其专用 IP 地址通过安全外壳(SSH)或远程桌面协议(RDP)连接到虚拟网络中的 VM。 虚拟机不需要公共 IP 地址、客户端软件或特殊配置。 有关 Azure Bastion 的详细信息,请参阅 Azure Bastion。
注意事项
每小时定价从部署 Bastion 的时刻开始计算,无论出站数据的使用情况如何。 有关详细信息,请参阅 Pricing 和 SKUs。 如果要将 Bastion 部署为教程或测试的一部分,建议在使用完此资源后将其删除。
在门户顶部的搜索框中,输入“堡垒”。 在搜索结果中选择 Bastions 。
选择“+ 新建”。
在“创建 Bastion”的“基本”选项卡中,输入或选择以下信息:
| 设置 |
值 |
|
项目详细信息 |
|
| 订阅 |
选择订阅。 |
| 资源组 |
选择“test-rg”。 |
|
实例详细信息 |
|
| 名称 |
输入堡垒。 |
| 区域 |
选择“中国北部 3”。 |
| 层 |
选择 “开发人员”。 |
|
配置虚拟网络 |
|
| 虚拟网络 |
选择“vnet-1”。 |
选择“查看 + 创建”。
选择创建。
启用服务终结点
每个服务、每个子网均启用服务终结点。
在门户页面顶部的搜索框中,搜索 Virtual network。 在搜索结果中,选择“虚拟网络”。
在“虚拟网络”中,选择“vnet-1”。
在vnet-1的“设置”部分,选择“子网”。
选择“+ 子网”。
在“添加子网”页面上,输入或选择以下信息:
| 设置 |
值 |
| 名称 |
子网专用 |
| 子网地址范围 |
保留默认值10.0.2.0/24。 |
|
服务终结点 |
|
| 服务 |
选择 Microsoft.Storage |
选择“保存”。
注意
在为其中有资源的现有子网启用服务终结点之前,请参阅更改子网设置。
创建虚拟网络
在创建虚拟网络之前,您必须为其创建资源组,以及本文中所创建的所有其他资源。 使用 New-AzResourceGroup 创建资源组。 以下示例创建名为 test-rg 的资源组:
$rg = @{
ResourceGroupName = "test-rg"
Location = "chinanorth3"
}
New-AzResourceGroup @rg
使用 New-AzVirtualNetwork 创建virtual network。 以下示例创建一个名为 vnet-1 的virtual network,其地址前缀为 10.0.0.0/16。
$vnet = @{
ResourceGroupName = "test-rg"
Location = "chinanorth3"
Name = "vnet-1"
AddressPrefix = "10.0.0.0/16"
}
$virtualNetwork = New-AzVirtualNetwork @vnet
使用 New-AzVirtualNetworkSubnetConfig 创建子网配置。 以下示例为名为 subnet-public 的子网创建子网配置:
$subpub = @{
Name = "subnet-public"
AddressPrefix = "10.0.0.0/24"
VirtualNetwork = $virtualNetwork
}
$subnetConfigPublic = Add-AzVirtualNetworkSubnetConfig @subpub
通过使用 Set-AzVirtualNetwork 将子网配置写入虚拟网络,在虚拟网络中创建子网:
$virtualNetwork | Set-AzVirtualNetwork
在virtual network中创建另一个子网。 在此示例中,创建了一个名为 subnet-private 的子网,并设置了一个用于 Microsoft.Storage 的服务终结点。
$subpriv = @{
Name = "subnet-private"
AddressPrefix = "10.0.2.0/24"
VirtualNetwork = $virtualNetwork
ServiceEndpoint = "Microsoft.Storage"
}
$subnetConfigPrivate = Add-AzVirtualNetworkSubnetConfig @subpriv
$virtualNetwork | Set-AzVirtualNetwork
部署Azure Bastion
Azure Bastion 使用您的浏览器通过其专用 IP 地址,通过“安全外壳”(SSH)或“远程桌面协议”(RDP)连接到虚拟网络中的虚拟机(VM)。 虚拟机不需要公共 IP 地址、客户端软件或特殊配置。 有关 Bastion 的详细信息,请参阅 什么是 Azure Bastion?
每小时定价从部署 Bastion 的时刻开始计算,无论出站数据的使用情况如何。 有关详细信息,请参阅 Pricing 和 SKUs。 如果要将 Bastion 部署为教程或测试的一部分,建议在使用完此资源后将其删除。
为您的虚拟网络配置 Bastion 子网。 此子网专为 Bastion 资源保留,且必须命名为 AzureBastionSubnet。
$subnet = @{
Name = 'AzureBastionSubnet'
VirtualNetwork = $virtualNetwork
AddressPrefix = '10.0.1.0/26'
}
$subnetConfig = Add-AzVirtualNetworkSubnetConfig @subnet
设置配置:
$virtualNetwork | Set-AzVirtualNetwork
为 Bastion 创建一个公共 IP 地址。 Bastion 主机通过公共 IP 和 443 端口访问 SSH 和 RDP。
$ip = @{
ResourceGroupName = 'test-rg'
Name = 'public-ip'
Location = 'chinanorth3'
AllocationMethod = 'Static'
Sku = 'Standard'
Zone = 1,2,3
}
New-AzPublicIpAddress @ip
使用 New-AzBastion 命令在 AzureBastionSubnet 中创建新的基本 SKU Bastion 主机:
$bastion = @{
Name = 'bastion'
ResourceGroupName = 'test-rg'
PublicIpAddressRgName = 'test-rg'
PublicIpAddressName = 'public-ip'
VirtualNetworkRgName = 'test-rg'
VirtualNetworkName = 'vnet-1'
Sku = 'Basic'
}
New-AzBastion @bastion -AsJob
部署 Bastion 资源大约需要 10 分钟。 在 Bastion 部署到您的虚拟网络时,您可以在下一部分中创建 VM。
创建虚拟网络
在创建虚拟网络之前,您必须为其创建资源组,以及本文中所创建的所有其他资源。 使用 az group create 创建资源组。 以下示例在“chinanorth3”位置创建名为“test-rg”的资源组:
az group create \
--name test-rg \
--location chinanorth3
使用 az network vnet create 创建具有一个子网的virtual network。
az network vnet create \
--name vnet-1 \
--resource-group test-rg \
--address-prefix 10.0.0.0/16 \
--subnet-name subnet-public \
--subnet-prefix 10.0.0.0/24
只能为支持服务终结点的服务启用服务终结点。 使用 az network vnet list-endpoint-services 查看特定Azure区域内已启用终结点的服务。 以下示例返回 chinanorth3 区域中可用的启用了服务终端节点的服务列表。 随着越来越多的 Azure 服务启用服务终结点,返回的服务列表将随着时间推移而不断增长。
az network vnet list-endpoint-services \
--location chinanorth3 \
--out table
使用 az network vnet subnet create 在virtual network中创建另一个子网。 在此示例中,将为 Microsoft.Storage 创建子网的服务终结点:
az network vnet subnet create \
--vnet-name vnet-1 \
--resource-group test-rg \
--name subnet-private \
--address-prefix 10.0.1.0/24 \
--service-endpoints Microsoft.Storage
使用 az network vnet subnet create 创建 Bastion 子网。
az network vnet subnet create \
--vnet-name vnet-1 \
--resource-group test-rg \
--name AzureBastionSubnet \
--address-prefix 10.0.2.0/26
使用 az network public-ip create 为 Azure Bastion 主机创建公共 IP 地址。
az network public-ip create \
--resource-group test-rg \
--name public-ip-bastion \
--sku Standard \
--location chinanorth3
使用 az network bastion create 创建 Azure Bastion 主机。
az network bastion create \
--resource-group test-rg \
--name bastion \
--vnet-name vnet-1 \
--public-ip-address public-ip-bastion \
--location chinanorth3 \
--sku Basic \
--no-wait
限制子网的网络访问
默认情况下,子网中的所有虚拟机实例均可与任何资源通信。 可以通过创建网络安全组并将其关联到子网来限制与子网中所有资源的通信。
在门户页面顶部的搜索框中,搜索“网络安全组”。 在搜索结果中选择“网络安全组”。
在“网络安全组”中,选择“+ 创建”。
在“创建网络安全组”的“基本信息”选项卡中,输入或选择以下信息 :
| 设置 |
值 |
|
项目详细信息 |
|
| 订阅 |
选择订阅。 |
| 资源组 |
选择“test-rg”。 |
|
实例详细信息 |
|
| 名称 |
输入 nsg-storage。 |
| 区域 |
选择“中国北部 3”。 |
选择查看 + 创建,然后选择创建。
使用 New-AzNetworkSecurityGroup 创建网络安全组。 以下示例创建一个名为 nsg-private 的网络安全组。
$nsgpriv = @{
ResourceGroupName = 'test-rg'
Location = 'chinanorth3'
Name = 'nsg-private'
}
$nsg = New-AzNetworkSecurityGroup @nsgpriv
使用 az network nsg create 创建网络安全组。 以下示例创建一个名为 nsg-private 的网络安全组。
az network nsg create \
--resource-group test-rg \
--name nsg-private
创建出站网络安全组 (NSG) 规则
在门户页面顶部的搜索框中,搜索“网络安全组”。 在搜索结果中选择“网络安全组”。
选择 nsg-storage。
在“设置”中,选择“出站安全规则” 。
选择“+ 添加”。
创建允许与Azure Storage服务的出站通信的规则。 在“添加出站安全规则”中,输入或选择以下信息:
| 设置 |
值 |
| 源 |
选择“服务标记”。 |
| 源服务标记 |
选择“VirtualNetwork”。 |
| 源端口范围 |
保留默认值 *。 |
| 目标 |
选择“服务标记”。 |
| 目标服务标记 |
选择 Storage。 |
| 服务 |
保留默认值“自定义”。 |
| 目标端口范围 |
输入445。 |
| 协议 |
选择“任何”。 |
| 动作 |
选择“允许”。 |
| 优先级 |
保留默认值“100”。 |
| 名称 |
输入 allow-storage-all。 |
选择“+ 添加”。
创建另一条出站安全规则,拒绝到 Internet 的通信。 此规则将覆盖所有网络安全组中允许出站 Internet 通信的默认规则。 使用添加出站安全规则中的以下值完成上述步骤:
| 设置 |
值 |
| 源 |
选择“服务标记”。 |
| 源服务标记 |
选择“VirtualNetwork”。 |
| 源端口范围 |
保留默认值 *。 |
| 目标 |
选择“服务标记”。 |
| 目标服务标记 |
选择“Internet”。 |
| 服务 |
保留默认值“自定义”。 |
| 目标端口范围 |
输入 *。 |
| 协议 |
选择“任何”。 |
| 动作 |
选择“拒绝”。 |
| 优先级 |
保留默认值110。 |
| 名称 |
输入deny-internet-all。 |
选择 添加 。
在门户页面顶部的搜索框中,搜索“网络安全组”。 在搜索结果中选择“网络安全组”。
选择 nsg-storage。
在“设置”中选择“子网”。
选择“+ 关联”。
在 关联子网中,在 虚拟网络中选择 vnet-1。 在“子网”中选择“子网专用“。
选择“确定”。
使用 New-AzNetworkSecurityRuleConfig 创建网络安全组安全规则。 以下规则允许对分配给 Azure Storage 服务的公共 IP 地址进行出站访问。
$r1 = @{
Name = "Allow-Storage-All"
Access = "Allow"
DestinationAddressPrefix = "Storage"
DestinationPortRange = "*"
Direction = "Outbound"
Priority = 100
Protocol = "*"
SourceAddressPrefix = "VirtualNetwork"
SourcePortRange = "*"
}
$rule1 = New-AzNetworkSecurityRuleConfig @r1
以下规则拒绝对所有公共 IP 地址的访问。 上一个规则会替代此规则,因为它的优先级较高,因此允许access Azure Storage的公共 IP 地址。
$r2 = @{
Name = "Deny-Internet-All"
Access = "Deny"
DestinationAddressPrefix = "Internet"
DestinationPortRange = "*"
Direction = "Outbound"
Priority = 110
Protocol = "*"
SourceAddressPrefix = "VirtualNetwork"
SourcePortRange = "*"
}
$rule2 = New-AzNetworkSecurityRuleConfig @r2
使用 Get-AzNetworkSecurityGroup 将网络安全组对象检索到变量中。 使用 Set-AzNetworkSecurityRuleConfig 将规则添加到网络安全组。
# Retrieve the existing network security group
$nsgpriv = @{
ResourceGroupName = 'test-rg'
Name = 'nsg-private'
}
$nsg = Get-AzNetworkSecurityGroup @nsgpriv
# Add the new rules to the security group
$nsg.SecurityRules += $rule1
$nsg.SecurityRules += $rule2
# Update the network security group with the new rules
Set-AzNetworkSecurityGroup -NetworkSecurityGroup $nsg
将网络安全组关联到 subnet-private 子网,并使用 Set-AzVirtualNetworkSubnetConfig,然后将子网配置写入虚拟网络。 以下示例将 nsg-private 网络安全组关联到 subnet-private 子网:
$subnet = @{
VirtualNetwork = $VirtualNetwork
Name = "subnet-private"
AddressPrefix = "10.0.2.0/24"
ServiceEndpoint = "Microsoft.Storage"
NetworkSecurityGroup = $nsg
}
Set-AzVirtualNetworkSubnetConfig @subnet
$virtualNetwork | Set-AzVirtualNetwork
使用 az network nsg rule create 创建安全规则。 以下规则允许对分配给 Azure Storage 服务的公共 IP 地址进行出站访问。
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-private \
--name Allow-Storage-All \
--access Allow \
--protocol "*" \
--direction Outbound \
--priority 100 \
--source-address-prefix "VirtualNetwork" \
--source-port-range "*" \
--destination-address-prefix "Storage" \
--destination-port-range "*"
每个网络安全组包含多个默认安全规则。 下面的规则将覆盖允许出站访问所有公共 IP 地址的默认安全规则。
destination-address-prefix "Internet" 选项拒绝对所有公共 IP 地址的出站访问。 上一个规则会替代此规则,因为它的优先级较高,因此允许access Azure Storage的公共 IP 地址。
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-private \
--name Deny-Internet-All \
--access Deny \
--protocol "*" \
--direction Outbound \
--priority 110 \
--source-address-prefix "VirtualNetwork" \
--source-port-range "*" \
--destination-address-prefix "Internet" \
--destination-port-range "*"
以下规则允许 SSH 流量从任何位置进入子网。 该规则将替代拒绝来自 Internet 的所有入站流量的默认安全规则。 允许通过 SSH 访问子网,以便在稍后的步骤中测试连接。
az network nsg rule create \
--resource-group test-rg \
--nsg-name nsg-private \
--name Allow-SSH-All \
--access Allow \
--protocol Tcp \
--direction Inbound \
--priority 120 \
--source-address-prefix "*" \
--source-port-range "*" \
--destination-address-prefix "VirtualNetwork" \
--destination-port-range "22"
将网络安全组与 subnet-private 子网关联,并使用 az network vnet subnet update 命令。 以下示例将 nsg-private 网络安全组关联到 subnet-private 子网:
az network vnet subnet update \
--vnet-name vnet-1 \
--name subnet-private \
--resource-group test-rg \
--network-security-group nsg-private
将网络访问限制到资源
通过 Azure 服务创建的资源,限制对其网络访问所需的步骤因服务的不同而不同,这些步骤是为服务终结点启用的。 请参阅各个服务的文档来了解适用于每个服务的具体步骤。 本教程的其余部分包括限制 Azure 存储账户网络访问的步骤,作为一个示例。
创建存储账户
在门户顶部的搜索框中,输入 Storage 帐户。 在搜索结果中选择存储帐户。
选择“+ 新建”。
在“创建存储帐户”的“基本信息”选项卡中,输入或选择以下信息:
| 设置 |
值 |
|
项目详细信息 |
|
| 订阅 |
选择Azure订阅。 |
| 资源组 |
选择“test-rg”。 |
|
实例详细信息 |
|
| 存储帐户名称 |
输入唯一名称。 本教程使用 storage1。 如果该名称不可用,请输入一个唯一的名称。 |
| 位置 |
选择“(亚洲)中国北部 3”。 |
| 性能 |
保留默认值“标准”。 |
| 冗余 |
选择 本地冗余存储(LRS)。 |
选择“查看”。
选择创建。
使用 New-AzStorageAccount 创建Azure storage帐户。 将 <replace-with-your-unique-storage-account-name> 替换为所有Azure位置中唯一的名称,长度介于 3-24 个字符之间,仅使用数字和小写字母。
$storageAcctName = '<replace-with-your-unique-storage-account-name>'
$storage = @{
Location = 'chinanorth3'
Name = $storageAcctName
ResourceGroupName = 'test-rg'
SkuName = 'Standard_LRS'
Kind = 'StorageV2'
}
New-AzStorageAccount @storage
创建 storage 帐户后,使用 Get-AzStorageAccountKey 将 storage 帐户的密钥检索到变量中。
$storagekey = @{
ResourceGroupName = 'test-rg'
AccountName = $storageAcctName
}
$storageAcctKey = (Get-AzStorageAccountKey @storagekey).Value[0]
在后面的步骤中将使用此密钥来创建文件共享。 输入 $storageAcctKey 并记下该值。 在稍后的步骤中,当您将文件共享映射到虚拟机中的驱动器时,请手动输入该值。
限制网络访问到通过为服务终结点启用的Azure服务创建的资源所需的步骤因服务而异。 请参阅各个服务的文档来了解适用于每个服务的具体步骤。 本文余下部分作为示例,包括限制 Azure Storage 帐户网络访问的步骤。
创建存储账户
使用命令 az storage account create 创建一个 Azure 存储帐户。 将 <replace-with-your-unique-storage-account-name> 替换为所有Azure位置中唯一的名称,长度介于 3-24 个字符之间,仅使用数字和小写字母。
storageAcctName="<replace-with-your-unique-storage-account-name>"
az storage account create \
--name $storageAcctName \
--resource-group test-rg \
--sku Standard_LRS \
--kind StorageV2
创建存储帐户后,使用 az storage account show-connection-string 将存储帐户的连接字符串检索到变量中。 connection string用于在后面的步骤中创建文件共享。
saConnectionString=$(az storage account show-connection-string \
--name $storageAcctName \
--resource-group test-rg \
--query 'connectionString' \
--out tsv)
重要
Microsoft 建议使用最安全的可用身份验证流。 本程序中描述的身份验证流程需要对应用程序有非常高的信任度,并且存在其他流程中不存在的风险。 请仅在无法使用其他更安全的流(例如托管标识)时才使用此流。
有关使用托管标识连接到存储帐户的详细信息,请参阅 使用托管标识访问 Azure 存储。
在 storage 帐户中创建文件共享
在门户顶部的搜索框中,输入 Storage 帐户。 在搜索结果中选择存储帐户。
在 Storage 帐户中,选择在上一步中创建的storage帐户。
在 Data storage 中,选择 File 共享。
选择 + 文件共享。
在“新文件共享”中,输入或选择以下信息:
| 设置 |
值 |
| 名称 |
输入文件共享。 |
| 层 |
保留默认值“事务优化”。 |
选择“下一步:备份”。
取消选择“启用备份”。
选择查看 + 创建,然后选择创建。
使用 New-AzStorageContext 创建存储账户和密钥的上下文。 上下文封装了存储帐户名称和帐户密钥:
$storagecontext = @{
StorageAccountName = $storageAcctName
StorageAccountKey = $storageAcctKey
}
$storageContext = New-AzStorageContext @storagecontext
使用 New-AzStorageShare 创建文件共享:
$fs = @{
Name = "file-share"
Context = $storageContext
}
$share = New-AzStorageShare @fs
在存储帐户中使用 az storage share create 创建文件共享区。 在后续步骤中,装载此文件共享以确认网络访问。
az storage share create \
--name file-share \
--quota 2048 \
--connection-string $saConnectionString > /dev/null
将网络访问限制到一个子网
默认情况下,存储帐户接受来自任何网络的客户端(包括互联网)的网络连接。 可以限制来自 Internet 及所有虚拟网络中所有其他子网的网络访问(位于 vnet-1 虚拟网络中的 subnet-private 子网除外)。
要将网络访问限制到某个子网,
在门户顶部的搜索框中,输入 Storage 帐户。 在搜索结果中选择存储帐户。
选择存储帐户。
在“安全性 + 网络”中,选择“网络”。
在防火墙和虚拟网络选项卡中,选择公共网络访问中的启用所选虚拟网络和 IP 地址选项。
在 Virtual networks 中,选择 + 添加现有virtual network。
在“添加网络”中,输入或选择以下信息:
| 设置 |
值 |
| 订阅 |
选择订阅。 |
| 虚拟网络 |
选择“vnet-1”。 |
| 子网 |
选择“subnet-private”。 |
限制存储帐户仅限于以前创建的子网和虚拟网络的截图。
选择 添加 。
选择 保存 以保存虚拟网络配置。
默认情况下,存储帐户接受来自任何网络中的客户端的网络连接。 要限制对所选网络的访问,请使用Update-AzStorageAccountNetworkRuleSet将默认操作更改为Deny。 一旦拒绝网络访问,无法从任何网络访问存储帐户。
$storagerule = @{
ResourceGroupName = "test-rg"
Name = $storageAcctName
DefaultAction = "Deny"
}
Update-AzStorageAccountNetworkRuleSet @storagerule
使用 Get-AzVirtualNetwork0 检索创建的virtual network,然后使用 Get-AzVirtualNetworkSubnetConfig 将专用子网对象检索到变量中:
$subnetpriv = @{
ResourceGroupName = "test-rg"
Name = "vnet-1"
}
$privateSubnet = Get-AzVirtualNetwork @subnetpriv | Get-AzVirtualNetworkSubnetConfig -Name "subnet-private"
允许从subnet-private子网使用Add-AzStorageAccountNetworkRule访问存储帐户。
$storagenetrule = @{
ResourceGroupName = "test-rg"
Name = $storageAcctName
VirtualNetworkResourceId = $privateSubnet.Id
}
Add-AzStorageAccountNetworkRule @storagenetrule
默认情况下,存储帐户接受来自任何网络中的客户端的网络连接。 若要将访问限制为所选网络,请将默认操作更改为 Deny,使用 az storage account update。 一旦拒绝网络访问,无法从任何网络访问存储帐户。
az storage account update \
--name $storageAcctName \
--resource-group test-rg \
--default-action Deny
允许从 subnet-private 子网访问存储帐户,使用 az storage account network-rule add。
az storage account network-rule add \
--resource-group test-rg \
--account-name $storageAcctName \
--vnet-name vnet-1 \
--subnet subnet-private
将虚拟机部署到子网
若要测试存储帐户的网络访问权限,请在每个子网中部署一台虚拟机。
创建第一个虚拟机
在门户顶部的搜索框中,输入虚拟机。 在搜索结果中选择Virtual machines。
选择+ 创建,然后选择Azure虚拟机。
在 “创建虚拟机 ”中输入,或在“ 基本信息 ”选项卡中选择以下信息:
| 设置 |
值 |
|
项目详细信息 |
|
| 订阅 |
选择订阅。 |
| 资源组 |
选择“test-rg”。 |
|
实例详细信息 |
|
| 虚拟机名称 |
输入“vm-1”。 |
| 区域 |
选择“(亚洲)中国北部 3”。 |
| 可用性选项 |
选择“无需基础结构冗余”。 |
| 安全类型 |
选择“标准” 。 |
| 图像 |
选择“Ubuntu Server 24.04 LTS - x64 Gen2”。 |
| VM 架构 |
保留默认值“x64”。 |
| 大小 |
选择一个大小。 |
|
管理员帐户 |
|
| 身份验证类型 |
选择“SSH 公钥”。 |
| 用户名 |
输入用户名。 |
| SSH 公钥源 |
选择“生成新密钥对”。 |
| 密钥对名称 |
输入 vm-1-key。 |
|
入站端口规则 |
|
| 公共入站端口 |
选择“无”。 |
选择“下一步: 磁盘”,然后选择“下一步: 网络”。
在“网络”选项卡中,输入或选择以下信息:
| 设置 |
值 |
|
网络接口 |
|
| 虚拟网络 |
选择“vnet-1”。 |
| 子网 |
选择“subnet-1 (10.0.0.0/24)”。 |
| 公共 IP |
选择“无”。 |
| 网络接口 (NIC) 网络安全组 |
选择“高级”。 |
| 配置网络安全组 |
选择“新建”。
在 “名称” 中输入 nsg-1。
选择“确定”。 |
将其余选项保留为默认值,然后选择“查看 + 创建”。
选择创建。
注意事项
在具有堡垒主机的虚拟网络中,虚拟机不需要公共 IP 地址。 Bastion 提供公共 IP,虚拟机使用专用 IP 在网络中进行通信。 可以从堡垒托管的虚拟网络的任何虚拟机中删除公共 IP。 **
有关详细信息,请参阅 解除 Azure VM 的公共 IP 地址关联。
注意事项
Azure为未分配公共 IP 地址的虚拟机,或者位于内部基本 Azure 负载均衡器后端池中的虚拟机,提供默认的出站访问 IP。 默认出站访问 IP 机制提供一个无法配置的出站 IP 地址。
发生以下事件之一时,将禁用默认出站访问 IP:
- 将公共 IP 地址分配给 VM。
- 虚拟机被放置在标准负载均衡器的后端池中,可能包含或不包含出站规则。
- 向 VM 的子网分配了 Azure NAT 网关资源。
在灵活协调模式下使用虚拟机规模集创建的 VM 没有默认的出站访问。
有关 Azure 中的出站连接的详细信息,请参阅 Azure 默认出站访问 和 使用源网络地址转换(SNAT)进行出站连接。
创建第二个虚拟机
创建第二个虚拟机,重复上一部分中的步骤。 替换“创建虚拟机”中的以下值:
| 设置 |
值 |
| 虚拟机名称 |
输入vm-private。 |
| SSH 公钥源 |
选择“生成新密钥对”。 |
| 密钥对名称 |
输入 vm-private-key。 |
| 子网 |
选择“subnet-private”。 |
| 公共 IP |
选择“无”。 |
| 网络接口 (NIC) 网络安全组 |
选择“无”。 |
创建第一个虚拟机
使用 New-AzVM 在 subnet-public 子网中创建虚拟机。
$cred = New-Object System.Management.Automation.PSCredential("azureuser", (ConvertTo-SecureString " " -AsPlainText -Force))
$vm1 = @{
ResourceGroupName = "test-rg"
Location = "chinanorth3"
VirtualNetworkName = "vnet-1"
SubnetName = "subnet-public"
Name = "vm-public"
Image = "Ubuntu2204"
Credential = $cred
PublicIpAddressName = ""
GenerateSshKey = $true
SshKeyName = "vm-public-key"
}
New-AzVm @vm1
创建第二个虚拟机
在 subnet-private 子网中创建一台虚拟机:
$vm2 = @{
ResourceGroupName = "test-rg"
Location = "chinanorth3"
VirtualNetworkName = "vnet-1"
SubnetName = "subnet-private"
Name = "vm-private"
Image = "Ubuntu2204"
Credential = $cred
PublicIpAddressName = ""
GenerateSshKey = $true
SshKeyName = "vm-private-key"
}
New-AzVm @vm2
Azure创建 VM 需要几分钟时间。 在Azure完成创建 VM 并将输出返回到 PowerShell 之前,请不要继续执行下一步。
要测试存储帐户的网络访问,请将虚拟机部署到每个子网。
创建第一个虚拟机
在 subnet-public 子网中使用 az vm create 创建 VM。 如果默认密钥位置中尚不存在 SSH 密钥,该命令会创建它们。 若要使用特定的一组密钥,请使用 --ssh-key-value 选项。
az vm create \
--resource-group test-rg \
--name vm-public \
--image Ubuntu2204 \
--vnet-name vnet-1 \
--subnet subnet-public \
--admin-username azureuser \
--generate-ssh-keys
创建 VM 需要几分钟时间。 创建 VM 后,Azure CLI会显示类似于以下示例的信息:
{
"fqdns": "",
"id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg/providers/Microsoft.Compute/virtualMachines/vm-public",
"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 \
--resource-group test-rg \
--name vm-private \
--image Ubuntu2204 \
--vnet-name vnet-1 \
--subnet subnet-private \
--admin-username azureuser \
--generate-ssh-keys
创建 VM 需要几分钟时间。
确认访问存储帐户
之前创建的虚拟机已被分配到 subnet-private 子网,用于确认对存储帐户的访问。 在上一部分中创建的虚拟机已分配给 subnet-1 子网,用于确认对存储帐户的访问已被阻止。
获取存储帐户访问密钥
在门户顶部的搜索框中,输入 Storage 帐户。 在搜索结果中选择存储帐户。
在 存储帐户中,选择您的存储帐户。
在 安全与网络中,选择 访问密钥。
复制key1值。 可能需要选择“显示”按钮以显示密钥。
在门户顶部的搜索框中,输入虚拟机。 在搜索结果中选择Virtual machines。
选择“vm-private”。
在操作中选择Bastion。
从本地文件中为身份验证类型选择 SSH 私钥。
输入在创建虚拟机时指定的用户名。
选择下载的 vm-private-key 私钥文件。
选择“连接” 。
使用以下命令装载 Azure 文件共享。
sudo mkdir /mnt/file-share
sudo mount -t cifs //<storage-account-name>.file.core.chinacloudapi.cn/file-share /mnt/file-share -o vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
你收到$提示时没有出现错误。 Azure文件共享已成功装载到 /mnt/file-share。
运行以下命令确认装载:
df -h /mnt/file-share
应该会看到与下面类似的输出:
Filesystem Size Used Avail Use% Mounted on
//<storage-account-name>.file.core.chinacloudapi.cn/file-share 5.0G 0 5.0G 0% /mnt/file-share
关闭与vm-private的 Bastion 连接。
在门户顶部的搜索框中,输入虚拟机。 在搜索结果中选择Virtual machines。
选择“vm-private”。
在操作中选择Bastion。
从本地文件中为身份验证类型选择 SSH 私钥。
输入在创建虚拟机时指定的用户名。
从本地计算机中选择 SSH 私钥文件。
选择“连接” 。
使用以下命令装载 Azure 文件共享。
sudo mkdir /mnt/file-share
sudo mount -t cifs //<storage-account-name>.file.core.chinacloudapi.cn/file-share /mnt/file-share -o vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
你收到$提示时没有出现错误。 Azure文件共享已成功装载到 /mnt/file-share。
确认 VM 没有与其他任何公网 IP 地址的出站连接。
ping bing.com -c 4
不会收到任何答复,因为与 subnet-private 子网关联的网络安全组不允许对除 Azure 存储服务分配的地址以外的公共 IP 地址进行出站访问。
关闭与vm-private的 Bastion 连接。
在门户顶部的搜索框中,输入虚拟机。 在搜索结果中选择Virtual machines。
选择“vm-private”。
在操作中选择Bastion。
从本地文件中为身份验证类型选择 SSH 私钥。
输入在创建虚拟机时指定的用户名。
从本地计算机中选择 SSH 私钥文件。 由 --generate-ssh-keys 生成的默认密钥位于 ~/.ssh/id_rsa.
选择“连接” 。
为装入点创建一个文件夹:
sudo mkdir /mnt/file-share
将Azure文件共享装载到创建的目录。 在运行以下命令之前,请将 <storage-account-name> 替换为帐户名,并将 <storage-account-key> 替换为在创建存储帐户时检索到的密钥。
sudo mount -t cifs //<storage-account-name>.file.core.chinacloudapi.cn/my-file-share /mnt/file-share -o vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
你收到$提示时没有出现错误。 Azure文件共享已成功装载到 /mnt/file-share。
确认 VM 没有与其他任何公网 IP 地址的出站连接。
ping bing.com -c 4
不会收到任何答复,因为与 subnet-private 子网关联的网络安全组不允许对除 Azure 存储服务分配的地址以外的公共 IP 地址进行出站访问。
关闭与vm-private的 Bastion 连接。
确认存储帐户的访问被拒绝
从 vm-1
在门户顶部的搜索框中,输入虚拟机。 在搜索结果中选择Virtual machines。
选择 vm-1。
在操作中选择Bastion。
从本地文件中为身份验证类型选择 SSH 私钥。
输入在创建虚拟机时指定的用户名。
选择下载的 vm-1 密钥 私钥文件。
选择“连接” 。
重复上述命令,尝试在存储帐户中装载文件共享。 对于此过程,您可能需要再次复制存储帐户的访问密钥:
sudo mkdir /mnt/file-share
sudo mount -t cifs //<storage-account-name>.file.core.chinacloudapi.cn/file-share /mnt/file-share -o vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
访问被拒绝,你会收到错误 mount error(13): Permission denied 。 装载失败,因为 vm-1 位于 子网 1 中,该子网没有 Azure 存储的服务终结点。
关闭与vm-1的 Bastion 连接。
从本地计算机上
在门户顶部的搜索框中,输入 Storage 帐户。 在搜索结果中选择存储帐户。
在 存储帐户中,选择您的存储帐户。
在 Data storage 中,选择 File 共享。
选择“文件共享”。
在左侧菜单中,选择“浏览”。
会收到以下错误信息:
注意事项
访问被拒绝,因为您的计算机不在 subnet-private 子网的 vnet-1 虚拟网络中。
从 vm-public
在门户顶部的搜索框中,输入虚拟机。 在搜索结果中选择Virtual machines。
选择 vm-public。
在操作中选择Bastion。
从本地文件中为身份验证类型选择 SSH 私钥。
输入在创建虚拟机时指定的用户名。
从本地计算机中选择 SSH 私钥文件。
选择“连接” 。
尝试装载 Azure 文件共享。 将 <storage-account-name> 替换为帐户名称,并将 <storage-account-key> 替换为您在创建存储帐户中检索到的密钥。
sudo mkdir /mnt/file-share
sudo mount -t cifs //<storage-account-name>.file.core.chinacloudapi.cn/file-share /mnt/file-share -o vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
访问被拒绝,你会收到错误 mount error(13): Permission denied 。 装载失败,因为 vm-public 位于 子网公共中,该子网没有 Azure 存储的服务终结点。
关闭 vm-public 的 Bastion 连接。
在计算机中,尝试使用以下命令在 storage 帐户中查看文件共享:
$storage = @{
ShareName = "file-share"
Context = $storageContext
}
Get-AzStorageFile @storage
拒绝访问。 将会收到类似于以下示例的输出。
Get-AzStorageFile : The remote server returned an error: (403) Forbidden. HTTP Status Code: 403 - HTTP Error Message: This request isn't authorized to perform this operation
计算机不在 subnet-private 子网的 vnet-1 虚拟网络中。
在门户顶部的搜索框中,输入虚拟机。 在搜索结果中选择Virtual machines。
选择 vm-public。
在操作中选择Bastion。
从本地文件中为身份验证类型选择 SSH 私钥。
输入在创建虚拟机时指定的用户名。
从本地计算机中选择 SSH 私钥文件。 由 --generate-ssh-keys 生成的默认密钥位于 ~/.ssh/id_rsa.
选择“连接” 。
为装入点创建一个目录:
sudo mkdir /mnt/file-share
尝试将Azure文件共享装载到创建的目录。 在运行以下命令之前,请将 <storage-account-name> 替换为帐户名,将 <storage-account-key> 替换为您在 创建 storage 帐户 时检索的密钥:
sudo mount -t cifs //<storage-account-name>.file.core.chinacloudapi.cn/file-share /mnt/file-share -o vers=3.0,username=<storage-account-name>,password=<storage-account-key>,dir_mode=0777,file_mode=0777,serverino
拒绝访问,并收到 mount error(13): Permission denied 错误信息,因为 vm-public 虚拟机部署在 subnet-public 子网中。
subnet-public 子网没有为 Azure Storage 启用服务终结点,且存储帐户仅允许来自 subnet-private 子网的网络访问,而不允许来自 subnet-public 子网的网络访问。
关闭 vm-public 的 Bastion 连接。
尝试在计算机上使用 `az storage share list` 查看存储帐户中的共享。 将 <account-name> 和 <account-key> 替换为 创建 storage 帐户 中的存储帐户名称和密钥:
az storage share list \
--account-name <account-name> \
--account-key <account-key>
访问被拒绝,并且您收到此请求无权执行此操作错误,因为您的计算机不在vnet-1虚拟网络的subnet-private子网中。
清理资源
使用创建的资源之后,可以删除资源组及其所有资源:
在Azure portal中,搜索并选择资源组。
在“资源组”页上,选择“test-rg”资源组。
在“test-rg”页上,选择“删除资源组”。
在“输入资源组名称以确认删除”中输入“test-rg”,然后选择“删除”。
如果不再需要资源组及其包含的所有资源,请使用 Remove-AzResourceGroup 将其删除:
$cleanup = @{
Name = "test-rg"
}
Remove-AzResourceGroup @cleanup -Force
清理资源
不再需要时,请使用az group delete删除资源组及其包含的所有资源。
az group delete \
--name test-rg \
--yes \
--no-wait
后续步骤
本教程的内容:
若要详细了解服务终结点,请参阅服务终结点概述和管理子网。
如果你的帐户中有多个虚拟网络,你可能需要在这些虚拟网络之间建立连接,使资源能够相互通信。 若要了解如何连接虚拟网络,请继续学习下一教程。