本文将带你了解如何使用 Azure PowerShell 配置标准服务端点。 你创建一个公共IP地址作为网络标识符,将其关联到子网上的服务端点,配置网络安全边界,并验证连接性。
Important
标准服务端点目前处于公开预览阶段。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持,或者可能具有受限功能。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款。
Prerequisites
拥有有效订阅的 Azure 帐户。 如果没有,请创建一个试用版订阅。
在该订阅上具有网络参与者角色或更高权限。 具体来说,你需要获得
Microsoft.Network/publicIPAddresses/joinServiceEndpointNetworkIdentifier/action许可。 欲了解更多信息,请参见 基于角色的网络安全边界访问控制要求。AllowServiceEndpointNetworkIdentifier 功能必须在您的订阅中注册。 请使用以下命令注册该功能:
$featureParams = @{ FeatureName = "AllowServiceEndpointNetworkIdentifier" ProviderNamespace = "Microsoft.Network" } Register-AzProviderFeature @featureParams验证注册状态:
$featureParams = @{ FeatureName = "AllowServiceEndpointNetworkIdentifier" ProviderNamespace = "Microsoft.Network" } Get-AzProviderFeature @featureParams | Select-Object -Property RegistrationState等待状态显示为 已注册,然后刷新资源提供者注册:
Register-AzResourceProvider -ProviderNamespace "Microsoft.Network"在本地安装了 Azure PowerShell。 有关详细信息,请参阅安装 Azure PowerShell。
登录到 Azure
连接到 Azure 帐户。
Connect-AzAccount -Environment AzureChinaCloud
创建资源组
使用 New-AzResourceGroup 创建资源组。
$rgParams = @{
Name = 'test-rg'
Location = 'ChinaEast2'
}
New-AzResourceGroup @rgParams
创建虚拟网络
使用 New-AzVirtualNetwork 和 New-AzVirtualNetworkSubnetConfig 创建一个虚拟网络和子网。
$subnetParams = @{
Name = 'subnet-1'
AddressPrefix = '10.0.0.0/24'
}
$subnet = New-AzVirtualNetworkSubnetConfig @subnetParams
$vnetParams = @{
ResourceGroupName = 'test-rg'
Location = 'ChinaEast2'
Name = 'vnet-1'
AddressPrefix = '10.0.0.0/16'
Subnet = $subnet
}
New-AzVirtualNetwork @vnetParams
创建 NAT 网关
创建一个NAT网关,并将其与 子网1 关联,为虚拟机提供出站互联网连接。
使用 New-AzPublicIpAddress 为 NAT 网关创建公共 IP 地址。
$natPipParams = @{ ResourceGroupName = 'test-rg' Name = 'public-ip-nat' Location = 'ChinaEast2' AllocationMethod = 'Static' Sku = 'Standard' } $natPip = New-AzPublicIpAddress @natPipParams用 New-AzNatGateway 创建一个 NAT 网关。
$natParams = @{ ResourceGroupName = 'test-rg' Name = 'nat-gateway' Location = 'ChinaEast2' IdleTimeoutInMinutes = 4 Sku = 'Standard' PublicIpAddress = $natPip } $natGateway = New-AzNatGateway @natParams通过更新子网配置,将NAT网关与 子网1 关联。
$vnet = Get-AzVirtualNetwork -ResourceGroupName 'test-rg' -Name 'vnet-1' $subnetUpdateParams = @{ Name = 'subnet-1' VirtualNetwork = $vnet AddressPrefix = '10.0.0.0/24' NatGateway = $natGateway } Set-AzVirtualNetworkSubnetConfig @subnetUpdateParams $vnet | Set-AzVirtualNetwork
部署 Azure Bastion
Azure Bastion 使用浏览器通过其专用 IP 地址通过安全外壳(SSH)或远程桌面协议(RDP)连接到虚拟网络中的 VM。 虚拟机不需要公共 IP 地址、客户端软件或特殊配置。 有关 Azure Bastion 的详细信息,请参阅 Azure Bastion。
注释
无论出站数据使用情况如何,按小时定价都从部署 Bastion 的时间开始算起。 有关详细信息,请参阅 定价 和 SKU。 如果要将 Bastion 部署为教程或测试的一部分,建议在使用完此资源后将其删除。
向虚拟网络添加一个
AzureBastionSubnet。$vnet = Get-AzVirtualNetwork -ResourceGroupName 'test-rg' -Name 'vnet-1' $subnetParams = @{ Name = 'AzureBastionSubnet' VirtualNetwork = $vnet AddressPrefix = '10.0.1.0/26' } Add-AzVirtualNetworkSubnetConfig @subnetParams $vnet | Set-AzVirtualNetwork为Bastion主机创建一个使用 New-AzPublicIpAddress的公共IP地址。
$bastionPipParams = @{ ResourceGroupName = 'test-rg' Name = 'public-ip-bastion' Location = 'ChinaEast2' AllocationMethod = 'Static' Sku = 'Standard' } $bastionPip = New-AzPublicIpAddress @bastionPipParams使用 New-AzBastion 创建 Azure Bastion 主机。
$bastionParams = @{ ResourceGroupName = 'test-rg' Name = 'bastion' PublicIpAddress = $bastionPip VirtualNetworkId = (Get-AzVirtualNetwork -ResourceGroupName 'test-rg' -Name 'vnet-1').Id Sku = 'Basic' } New-AzBastion @bastionParams
创建虚拟机
在虚拟网络中创建一个名为 vm-1 的虚拟机。 虚拟机用于配置后的连接验证。
使用 New-AzVM 创建虚拟机。 在本地 ssh-keygen 生成一对SSH密钥,并将公钥附加到虚拟机配置中。
## Get credentials for virtual machine ##
$cred = Get-Credential
## Generate an SSH key pair locally ##
$sshKeyPath = Join-Path $HOME '.ssh/id_rsa_vm-1'
ssh-keygen -t rsa -b 4096 -f $sshKeyPath -N '""' -q
$sshPublicKey = Get-Content "$sshKeyPath.pub"
## Create network interface for virtual machine ##
$nic = @{
Name = "nic-1"
ResourceGroupName = 'test-rg'
Location = 'chinaeast2'
Subnet = $vnet.Subnets[0]
}
$nicVM = New-AzNetworkInterface @nic
## Create a virtual machine configuration ##
$vmsz = @{
VMName = 'vm-1'
VMSize = 'Standard_DS1_v2'
}
$vmos = @{
ComputerName = 'vm-1'
Credential = $cred
DisablePasswordAuthentication = $true
}
$vmimage = @{
PublisherName = 'Canonical'
Offer = '0001-com-ubuntu-server-jammy'
Skus = '22_04-lts-gen2'
Version = 'latest'
}
$vmConfig = New-AzVMConfig @vmsz |
Set-AzVMOperatingSystem @vmos -Linux |
Set-AzVMSourceImage @vmimage |
Add-AzVMNetworkInterface -Id $nicVM.Id
$vmConfig = Add-AzVMSshPublicKey -VM $vmConfig -KeyData $sshPublicKey -Path '/home/azureuser/.ssh/authorized_keys'
## Create the virtual machine ##
$vm = @{
ResourceGroupName = 'test-rg'
Location = 'chinaeast2'
VM = $vmConfig
}
New-AzVM @vm
请先等待虚拟机创建完成,然后再转到下一部分。
注释
具有 Azure Bastion 主机的虚拟网络中的虚拟机不需要公共 IP 地址。 Bastion 提供公共 IP,虚拟机使用专用 IP 在网络中进行通信。 可以从 Bastion 托管的虚拟网络的任何虚拟机中删除公共 IP。 有关详细信息,请参阅 将公共 IP 地址与 Azure VM 取消关联。
注释
Azure 会为未分配公共 IP 地址的 VM 或位于内部基本 Azure 负载均衡器的后端池中的 VM 提供默认出站访问 IP。 默认出站访问 IP 机制会提供不可配置的出站 IP 地址。
发生以下事件之一时,将禁用默认出站访问 IP:
- 将公共 IP 地址分配给 VM。
- 虚拟机被放置在标准负载均衡器的后端池中,可以有出站规则,也可以没有。
- 向 VM 的子网分配了 Azure NAT 网关资源。
在灵活协调模式下使用虚拟机规模集创建的 VM 没有默认的出站访问。
有关 Azure 中的出站连接的详细信息,请参阅 Azure 中的默认出站访问 ,并使用 源网络地址转换(SNAT)进行出站连接。
在虚拟机上安装工具
在虚拟机上安装cifs-utils和Azure CLI,通过运行带有Invoke-AzVMRunCommand的shell脚本。
将以下脚本保存到名为 install-tools.sh 的本地文件中:
#!/bin/bash
sudo apt-get update
sudo apt-get install -y cifs-utils
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
然后在虚拟机上运行脚本:
$runParams = @{
ResourceGroupName = 'test-rg'
VMName = 'vm-1'
CommandId = 'RunShellScript'
ScriptPath = './install-tools.sh'
}
Invoke-AzVMRunCommand @runParams
创建存储帐户
创建一个带有文件共享的 Azure 存储账户,作为测试服务端点连接性的 PaaS 资源。
用 New-AzStorageAccounts 创建一个存储账户。 用一个全球唯一的名称替换
<storage-account-name>。$storageParams = @{ ResourceGroupName = 'test-rg' Name = '<storage-account-name>' Location = 'ChinaEast2' SkuName = 'Standard_LRS' Kind = 'StorageV2' } $storageAccount = New-AzStorageAccount @storageParams使用 New-AzRmStorageShare 创建文件共享。
$shareParams = @{ ResourceGroupName = 'test-rg' StorageAccountName = '<storage-account-name>' Name = 'fileshare-1' } New-AzRmStorageShare @shareParams
创建公共 IP 前缀
创建公共 IP 前缀和公共 IP 地址实例以用作网络标识符。
使用 New-AzPublicIpPrefix 创建公共 IP 前缀。
$prefixParams = @{ ResourceGroupName = 'test-rg' Name = 'public-ip-prefix' Location = 'ChinaEast2' PrefixLength = 31 Sku = 'Standard' } $ipPrefix = New-AzPublicIpPrefix @prefixParams用 New-AzPublicIpAddress 从前缀创建一个公共 IP 地址。
$pipParams = @{ ResourceGroupName = 'test-rg' Name = 'public-ip-1' Location = 'ChinaEast2' AllocationMethod = 'Static' Sku = 'Standard' PublicIpPrefix = $ipPrefix } $publicIp = New-AzPublicIpAddress @pipParams
配置服务端点并使用网络标识符
这一步是标准服务端点的关键配置。 你将公共IP地址作为网络标识符与子网上的服务端点关联。
网络标识符是你分配给服务端点的公共IP地址。 公网IP不用于网络路由决策。 当你在订阅内创建公共IP地址时,它会自动从你服务指定的IP池分配。 网络安全边界内的服务使用该公网IP地址识别服务端点流量并配置相应的访问规则。
使用 Set-AzVirtualNetworkSubnetConfig更新子网配置,添加一个以公共IP地址为网络标识符的服务端点。
$vnet = Get-AzVirtualNetwork -ResourceGroupName 'test-rg' -Name 'vnet-1'
$networkIdentifier = New-Object Microsoft.Azure.Commands.Network.Models.PSResourceId -Property @{
Id = $publicIp.Id
}
$subnetUpdateParams = @{
Name = 'subnet-1'
VirtualNetwork = $vnet
AddressPrefix = '10.0.0.0/24'
ServiceEndpoint = @('Microsoft.Storage')
NetworkIdentifier = $networkIdentifier
}
Set-AzVirtualNetworkSubnetConfig @subnetUpdateParams
$vnet | Set-AzVirtualNetwork
注释
同一公共IP地址可以分配给订阅内同一区域内的所有子网。 在公共预览期间,网络标识符在各个订阅中均受支持。
创建网络安全外围
创建一个网络安全边界,并将你的PaaS资源与之关联。
使用 New-AzNetworkSecurityPerimeter 创建网络安全边界。
$nspParams = @{ ResourceGroupName = 'test-rg' Name = 'nsp-1' Location = 'ChinaEast2' } New-AzNetworkSecurityPerimeter @nspParams使用 New-AzNetworkSecurityPerimeterProfile 在网络安全边界中创建配置文件。
$profileParams = @{ ResourceGroupName = 'test-rg' SecurityPerimeterName = 'nsp-1' Name = 'profile-1' } New-AzNetworkSecurityPerimeterProfile @profileParams使用 New-AzNetworkSecurityPerimeterAssociation 将您的存储帐户与网络安全边界相关联。 将
<subscription-id>和<storage-account-name>替换为自定义值。$assocParams = @{ ResourceGroupName = 'test-rg' SecurityPerimeterName = 'nsp-1' AssociationName = 'assoc-storage' AccessMode = 'Learning' ProfileId = "/subscriptions/<subscription-id>/resourceGroups/test-rg/providers/Microsoft.Network/networkSecurityPerimeters/nsp-1/profiles/profile-1" PrivateLinkResourceId = "/subscriptions/<subscription-id>/resourceGroups/test-rg/providers/Microsoft.Storage/storageAccounts/<storage-account-name>" } New-AzNetworkSecurityPerimeterAssociation @assocParams
创建网络安全边界入站访问规则
在网络安全边界中添加基于 IP 的入站访问规则,以允许来自您的网络标识的流量。 该规则与公共 IP 地址匹配,以允许从您的服务终结点进行连接。
使用 New-AzNetworkSecurityPerimeterAccessRule 创建入站访问规则。 将 <public-ip-prefix-range> 替换为你的公共 IP 前缀的地址范围。
$ruleParams = @{
ResourceGroupName = 'test-rg'
SecurityPerimeterName = 'nsp-1'
ProfileName = 'profile-1'
Name = 'allow-se-standard'
Direction = 'Inbound'
AddressPrefix = '<public-ip-prefix-range>'
}
New-AzNetworkSecurityPerimeterAccessRule @ruleParams
注释
若要查找公共 IP 前缀的地址范围,请运行 (Get-AzPublicIpPrefix -ResourceGroupName 'test-rg' -Name 'public-ip-prefix').IpPrefix。
验证连接
用 Azure Bastion 连接到你的虚拟机,测试与存储账户的连接,以验证流量是否符合网络安全边界的入站访问规则授权。
连接到虚拟机
在 Azure 门户中,搜索并选择 虚拟机。
选择 vm-1。
选择 “连接”,然后选择“ 通过 Bastion 连接”。
在 堡垒 页面输入以下信息:
设置 价值 身份验证类型 从本地文件选择 SSH 私钥。 用户名 输入“azureuser”。 本地文件 选择你创建虚拟机时下载的 vm-1-key.pem 文件。 选择 连接。
测试与存储帐户的连接
在 vm-1 的 SSH 会话中,登录 Azure CLI:
az cloud set -n AzureChinaCloud az login # az cloud set -n AzureCloud //means return to Azure Public Cloud.挂载Azure文件共享,以验证通过服务端点与存储账户的连接。 将
<storage-account-name>替换为你的存储帐户名称:sudo mkdir -p /mnt/fileshare-1 STORAGE_KEY=$(az storage account keys list \ --resource-group test-rg \ --account-name <storage-account-name> \ --query "[0].value" -o tsv) sudo mount -t cifs //<storage-account-name>.file.core.chinacloudapi.cn/fileshare-1 /mnt/fileshare-1 \ -o username=<storage-account-name>,password=$STORAGE_KEY,serverino,nosharesock,actimeo=30,mfsymlinks验证文件共享是否成功挂载:
df -h /mnt/fileshare-1要确认入站访问规则是否有效,请查看网络安全边界的诊断日志。 有关网络安全边界诊断日志的更多信息,请参见 网络安全边界的诊断日志。
清理资源
当您不再需要本文中创建的资源时,请删除资源组:
Remove-AzResourceGroup -Name 'test-rg' -Force