在 Windows 上配置点到站点 (P2S) VPN 以与 Azure 文件存储一起使用

你可以使用点到站点 (P2S) VPN 连接从 Azure 外部通过 SMB 装载 Azure 文件共享,而无需打开端口 445。 点到站点 VPN 连接是 Azure 与单个客户端之间的 VPN 连接。 若要将 P2S VPN 连接与 Azure 文件存储结合使用,必须为每个要连接的客户端配置 VPN 连接。 如果有多个客户端需要从本地网络连接到 Azure 文件共享,则可以为每个客户端使用站点到站点 (S2S) VPN 连接,而不使用点到站点连接。 若要了解详细信息,请参阅配置站点到站点 VPN 以与 Azure 文件存储一起使用

我们强烈建议先阅读关于直接访问 Azure 文件共享的网络注意事项,然后再继续阅读本方法指南文章,以全面讨论 Azure 文件存储可用的网络选项。

本文详细介绍了在 Windows(Windows 客户端和 Windows Server)上配置点到站点 VPN 以直接在本地装载 Azure 文件共享的相关步骤。 如果想要通过 VPN 路由 Azure 文件同步流量,请参阅配置 Azure 文件同步代理和防火墙设置

适用于

文件共享类型 SMB NFS
标准文件共享 (GPv2)、LRS/ZRS Yes No
标准文件共享 (GPv2)、GRS/GZRS Yes No
高级文件共享 (FileStorage)、LRS/ZRS Yes No

先决条件

  • 最新版本的 Azure PowerShell 模块。 请参阅安装 Azure PowerShell 模块

  • 要在本地装载的 Azure 文件共享。 Azure 文件共享部署在存储帐户中,是代表共享存储池的管理结构,可以在其中部署多个文件共享以及其他存储资源。 在创建 Azure 文件共享中详细了解如何部署 Azure 文件共享和存储帐户。

  • 带有存储帐户专用终结点的虚拟网络,此帐户中包含要在本地装载的 Azure 文件共享。 若要了解如何创建专用终结点,请参阅配置 Azure 文件存储网络终结点

  • 必须在虚拟网络上创建网关子网。 若要创建网关子网,请登录到 Azure 门户,导航到虚拟网络,选择 “设置 > 子网”,然后选择 “+ 网关子网”。 创建网关子网时,需指定子网包含的 IP 地址数。 所需的 IP 地址数目取决于要创建的 VPN 网关配置。 最好指定 /27 或以上(/26、/25等),以便为将来的更改提供足够的 IP 地址,例如添加一个 ExpressRoute 网关。

收集环境信息

在设置点到站点 VPN 之前,需要收集有关环境的一些信息。

若要使用 Azure 门户设置点到站点 VPN,则需要知道资源组名称、虚拟网络名称、网关子网名称和存储帐户名称。

为 VPN 身份验证创建根证书

若要对来自本地 Windows 计算机的 VPN 连接进行身份验证以访问虚拟网络,则必须创建两个证书:

  1. 一个提供给虚拟机网关的根证书
  2. 一个使用根证书签名的客户端证书

可以使用企业解决方案生成的根证书,也可以生成自签名证书。 如果使用企业解决方案,请从 IT 组织获取根证书的 .cer 文件。

如果不使用企业证书解决方案,则请使用本 PowerShell 脚本创建自签名根证书。 你将在部署虚拟网络网关后创建客户端证书。 如果可能,请让 PowerShell 会话保持打开状态,这样当后文要求创建客户端证书时就不需要重新定义变量了。

重要

从运行 Windows 10/Windows Server 2016 或更高版本的本地计算机上以管理员身份运行此 PowerShell 脚本。 请勿从 Azure 中的 VM 运行脚本。

$rootcertname                = 'CN=P2SRootCert'
$certLocation                = 'Cert:\CurrentUser\My'
$vpnTemp                     = 'C:\vpn-temp'
$exportedencodedrootcertpath = "$vpnTemp\P2SRootCertencoded.cer"
$exportedrootcertpath        = "$vpnTemp\P2SRootCert.cer"

if (-Not (Test-Path -Path $vpnTemp -PathType Container)) {
    New-Item -ItemType Directory -Force -Path $vpnTemp | Out-Null
}

if ($PSVersionTable.PSVersion.Major -ge 6) {
    Import-Module -Name PKI -UseWindowsPowerShell
}

$selfSignedCertParams = @{
    Type              = 'Custom'
    KeySpec           = 'Signature'
    Subject           = $rootcertname
    KeyExportPolicy   = 'Exportable'
    HashAlgorithm     = 'sha256'
    KeyLength         = '2048'
    CertStoreLocation = $certLocation
    KeyUsageProperty  = 'Sign'
    KeyUsage          = 'CertSign'
}
$rootcert = New-SelfSignedCertificate @selfSignedCertParams

Export-Certificate -Cert $rootcert -FilePath $exportedencodedrootcertpath -NoClobber | Out-Null

certutil -encode $exportedencodedrootcertpath $exportedrootcertpath | Out-Null

$rawRootCertificate = Get-Content -Path $exportedrootcertpath

$rootCertificate = ''

foreach ($line in $rawRootCertificate) { 
    if ($line -notlike '*Certificate*') { 
        $rootCertificate += $line 
    } 
}

部署虚拟网络网关

Azure 虚拟网络网关是本地 Windows 计算机将连接到的服务。 部署虚拟网络网关之前,必须在虚拟网络上创建一个网关子网

部署虚拟网络网关需要两个基本组件:

  1. 一个公共 IP 地址,可识别位于任何位置的客户端的网关
  2. 在上文步骤中创建的根证书,用于对客户端进行身份验证

可使用 Azure 门户或 Azure PowerShell 部署虚拟网络网关。 部署可能需要 45 分钟才能完成。

若要使用 Azure 门户部署虚拟网络网关,请按照以下说明操作。

  1. 登录 Azure 门户

  2. 在“搜索资源、服务和文档”中,输入“虚拟网络网关”。 在商城搜索结果中找到“虚拟网络网关”,并选中它。

  3. 选择“+创建”以创建新的虚拟网络网关。

  4. 在“基本信息”选项卡上,填写“项目详细信息”和“实例详细信息”的值 。

    Screenshot showing how to create a virtual network gateway using the Azure portal.

    • 订阅:从下拉列表中选择要使用的订阅。
    • 资源组:在此页上选择虚拟网络后,此设置将自动进行填充。
    • 名称:为网关命名。 为网关命名与为网关子网命名不同。 它是要创建的网关对象的名称。
    • 区域:选择要在其中创建此资源的区域。 网关的区域必须与虚拟网络相同。
    • 网关类型:选择“VPN”。 VPN 网关使用虚拟网络网关类型“VPN” 。
    • SKU:从下拉列表中选择支持你想要使用的功能的网关 SKU。 请参阅网关 SKU。 请勿使用基本 SKU,因为它不支持 IKEv2 身份验证。
    • 代系:选择想要使用的代系。 建议使用第 2 代 SKU。 有关详细信息,请参阅网关 SKU
    • 虚拟网络:从下拉列表中,选择要将此网关添加到其中的虚拟网络。 如果找不到要为其创建网关的虚拟网络,请确保选择了正确的订阅和区域。
    • “子网”:此字段应灰显,并列出创建的网关子网的名称及其 IP 地址范围。 如果看到“网关子网地址范围”字段,则表示尚未配置网关子网(请参阅 先决条件。)
  5. 请指定已分配给该虚拟网络网关的“公共 IP 地址”。 创建虚拟网络网关后,公共 IP 地址会被分配给此对象。 仅当删除并重新创建网关时,主公共 IP 地址才会发生更改。 该地址不会因为网关大小调整、重置或其他内部维护/升级而更改。

    Screenshot showing how to specify the public IP address for a virtual network gateway using the Azure portal.

    • 公共 IP 地址:让“新建” 保持选中状态。
    • 公共 IP 地址名称:在文本框中,键入公共 IP 地址实例的名称。
    • 公共 IP 地址 SKU:将自动选择设置。
    • 分配:分配通常是自动选择的,可以是动态的,也可以是静态的。
    • 启用主动-主动模式:选择“已禁用”。 仅当创建主动-主动网关配置时,才启用此设置。
    • 配置 BGP:除非你的配置特别需要此设置,否则请选择“已禁用”。 如果确实需要此设置,则默认 ASN 为 65515,但可以更改此值。
  6. 选择“查看 + 创建” ,运行验证。 验证通过后,选择“创建”以部署虚拟网络网关。 部署可能需要 45 分钟才能完成。

  7. 部署完成后,选择“转到资源”。

  8. 在左窗格中,选择“设置 > 点到站点配置” ,然后选择“立即配置” 。 现在应该能看见点到站点配置页面。

    Screenshot showing how to configure a point-to-site VPN using the Azure portal.

    • “地址池”:添加要使用的专用 IP 地址范围。 VPN 客户端动态接收指定范围内的 IP 地址。 主动/被动配置的最小子网掩码为 29 位,主动/主动配置的最小子网掩码为 28 位。
    • “隧道类型”:指定要使用的隧道类型。 通过本机 Windows VPN 客户端连接的计算机将首先尝试 IKEv2。 如果连接不成功,则会退回到 SSTP(如果在下拉列表中同时选择了 IKEv2 和 SSTP)。 如果选择了 OpenVPN 隧道类型,则可以使用 OpenVPN 客户端或 Azure VPN 客户端进行连接。
    • “身份验证类型”:指定要使用的身份验证类型(在本例中,选择 Azure 证书)。
    • “根证书名称”:根证书(.cer 文件)的文件名。
    • “公共证书数据”:使用记事本打开根证书,将公共证书数据复制/粘贴到此文本字段中。 如果使用本文中的 PowerShell 脚本生成自签名根证书,那么数据将位于 C:\vpn-temp中。 请确保只粘贴-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----之间的文本。 切勿包含任何其他空格或字符。

    注意

    如果此页上未显示“隧道类型”或“身份验证类型”,则表示网关使用的是基本 SKU。 基本 SKU 不支持 IKEv2 身份验证。 若要使用 IKEv2,则需要使用另一网关 SKU 删除并重新创建网关。

  9. 选择页面顶部的“保存” ,以保存所有配置设置并将根证书公钥信息上传至 Azure。

创建客户端证书

通过点到站点连接到虚拟网络的所有客户端计算机都必须安装客户端证书。 请在根证书生成客户端证书,并安装到每个客户端计算机上。 如果没有安装有效的客户端证书,则当客户端尝试连接时,身份验证会失败。 你可以从自签名根证书生成客户端证书,也可以从使用企业解决方案生成的根证书上来生成客户端证书。

使用企业解决方案创建客户端证书

如果使用的是企业证书解决方案,请使用通用名称值格式 name@yourdomain.com 生成客户端证书, 而不要使用“域名\用户名”格式。 请确保客户端证书基于“用户”证书模板,该模板将“客户端身份验证”列为用户列表中的第一项。 检查证书的方式是:双击证书,然后在“详细信息”选项卡中查看“增强型密钥用法” 。

使用自签名根证书创建客户端证书

如果不使用企业证书解决方案,则可以使用 PowerShell 以虚拟网络网关的 URI 创建客户端证书。 此证书使用之前创建的根证书进行签名。 从自签名根证书生成客户端证书时,该证书会自动安装在用于生成该证书的计算机上。

如果想要在另一台客户端计算机上安装客户端证书,请以 .pfx 文件格式导出该证书以及整个证书链。 这样做会创建一个 .pfx 文件,其中包含的根证书信息是客户端进行身份验证所必需的。 若要将自签名根证书导出为 .pfx,请选择该根证书,然后根据导出客户端证书中所述的步骤导出。

识别自签名根证书

如果你正在使用创建自签名根证书时所用的同一个 PowerShell 会话,则可以跳过直达创建客户端证书

否则,请根据以下步骤来识别安装在计算机上的自签名根证书。

  1. 获得计算机上安装的证书列表。

    Get-ChildItem -Path 'Cert:\CurrentUser\My'
    
  2. 从返回的列表中找到使用者名称,然后将该名称旁边的指纹复制到文本文件中。 以下示例显示了两个证书。 CN 名称是要从中生成子证书的自签名根证书的名称。 在本例中为 P2SRootCert

    Thumbprint                                Subject
    ----------                                -------
    AED812AD883826FF76B4D1D5A77B3C08EFA79F3F  CN=P2SChildCert4
    7181AA8C1B4D34EEDB2F3D3BEC5839F3FE52D655  CN=P2SRootCert
    
  3. 使用上一步骤中获取的指纹为根证书声明变量。 将 THUMBPRINT 替换为要从中生成客户端证书的根证书指纹。

    $rootcert = Get-ChildItem -Path 'Cert:\CurrentUser\My\<THUMBPRINT>'
    

    例如,使用上一步骤中 P2SRootCert 的指纹,命令如下所示:

    $rootcert = Get-ChildItem -Path 'Cert:\CurrentUser\My\7181AA8C1B4D34EEDB2F3D3BEC5839F3FE52D655'
    

生成客户端证书

使用 New-AzVpnClientConfiguration PowerShell cmdlet 生成客户端证书。 如果没有使用用于创建自签名根证书的同一 PowerShell 会话,则需要根据上一部分所述识别自签名根证书。 在运行脚本之前,请将 <resource-group-name> 替换为自己的资源组名称,将 <vpn-gateway-name> 替换为刚刚部署的虚拟网络网关的名称。

重要

在要连接到 Azure 文件共享的本地 Windows 计算机上以管理员身份运行此 PowerShell 脚本。 计算机必须运行 Windows 10/Windows Server 2016 或更高版本。 在运行脚本 (Connect-AzAccount -Environment AzureChinaCloud) 前,请确保登录到 Azure 帐户。

$clientcertpassword = '<enter-your-password>'
$resourceGroupName  = '<resource-group-name>'
$vpnName            = '<vpn-gateway-name>'
$vpnTemp            = 'C:\vpn-temp'
$certLocation       = 'Cert:\CurrentUser\My'

$vpnClientConfigParams = @{
    ResourceGroupName    = $resourceGroupName
    Name                 = $vpnName
    AuthenticationMethod = 'EAPTLS'
}
$vpnClientConfiguration = New-AzVpnClientConfiguration @vpnClientConfigParams

$webRequestParams = @{
    Uri = $vpnClientConfiguration.VpnProfileSASUrl
    OutFile = "$vpnTemp\vpnclientconfiguration.zip"
}
Invoke-WebRequest @webRequestParams

$expandArchiveParams = @{
    Path            = "$vpnTemp\vpnclientconfiguration.zip"
    DestinationPath = "$vpnTemp\vpnclientconfiguration"
}
Expand-Archive @expandArchiveParams

$vpnGeneric = "$vpnTemp\vpnclientconfiguration\Generic"
$vpnProfile = ([xml](Get-Content -Path "$vpnGeneric\VpnSettings.xml")).VpnProfile

$exportedclientcertpath = "$vpnTemp\P2SClientCert.pfx"
$clientcertname         = "CN=$($vpnProfile.VpnServer)"

$selfSignedCertParams = @{
    Type              = 'Custom'
    DnsName           = $vpnProfile.VpnServer
    KeySpec           = 'Signature'
    Subject           = $clientcertname
    KeyExportPolicy   = 'Exportable'
    HashAlgorithm     = 'sha256'
    KeyLength         = 2048
    CertStoreLocation = $certLocation
    Signer            = $rootcert
    TextExtension     = @('2.5.29.37={text}1.3.6.1.5.5.7.3.2')
}
$clientcert = New-SelfSignedCertificate @selfSignedCertParams

$mypwd = ConvertTo-SecureString -String $clientcertpassword -Force -AsPlainText

Export-PfxCertificate -FilePath $exportedclientcertpath -Password $mypwd -Cert $clientcert |
    Out-Null

配置 VPN 客户端

Azure 虚拟网络网关将创建一个可下载的包,其中包含在本地 Windows 计算机上初始化 VPN 连接所需的配置文件。 配置包中有特定于已创建的 VPN 网关的设置。 如果对网关进行更改(例如更改隧道类型、证书或身份验证类型),则需要另外生成一个 VPN 客户端配置文件配置包,并将其安装在每个客户端上。 否则,VPN 客户端可能无法连接。

你将使用 Windows 10/Windows Server 2016 中引入的 Always On VPN 功能配置 VPN 连接。 此包还包含根据需要配置旧版 Windows VPN 客户端的可执行文件。 本指南使用 Always On VPN 而不是旧版 Windows VPN 客户端,因为使用 Always On VPN 客户端即可连接 Azure VPN 或断开与其建立的连接,而无需拥有计算机的管理员权限。

安装客户端证书

在客户端计算机上进行以下步骤,以安装虚拟网络网关要求的身份验证用客户端证书。

  1. 导出客户端证书后,找到并复制 .pfx 文件,将其复制到客户端计算机。
  2. 在客户端计算机上,双击 .pfx 文件以进行安装。 将“存储位置”保留为“当前用户”,并选择“下一步” 。
  3. 在“要导入的文件”页上,不要进行任何更改。 选择“下一步”。
  4. 在“私钥保护”页上,输入证书的密码,或验证安全主体是否正确,并选择“下一步” 。
  5. 在“证书存储”页上,保留默认位置,并选择“下一步” 。
  6. 选择“完成”。 在证书安装的“安全警告”上,选择“是” 。 你可以放心地对此安全警告选择“是”,因为你生成了证书。
  7. 现已成功导入证书。

安装 VPN 客户端

本部分能帮助你配置本机 VPN 客户端(客户端为 Windows 操作系统的一部分)以连接到虚拟网络(IKEv2 和 SSTP)。 此配置不需要其他客户端软件。

查看配置文件

在客户端计算机上,导航到 C:\vpn-temp 并打开 vpnclientconfiguration 文件夹以查看以下子文件夹:

  • WindowsAmd64 和 WindowsX86:分别包含 Windows 64 位和 32 位安装程序包。 WindowsAmd64 安装程序包适用于所有受支持的 64 位 Windows 客户端,而不仅仅是 Amd。
  • Generic:包含用于创建自己的 VPN 客户端配置的常规信息。 如果网关上配置了 IKEv2 或 SSTP+IKEv2,会提供 Generic 文件夹。 如果仅配置了 SSTP,则不会提供 Generic 文件夹。

配置 VPN 客户端配置文件

只要版本与 Windows 客户端的体系结构匹配,就可以在每台客户端计算机上使用相同的 VPN 客户端配置包。

注意

必须拥有待连接 Windows 客户端计算机(以运行安装程序包)的管理员权限。

  1. 根据 Windows 计算机的体系结构选择 VPN 客户端配置文件。 对于 64 位处理器体系结构,请选择 VpnClientSetupAmd64 安装程序包。 对于 32 位处理器体系结构,请选择 VpnClientSetupX86 安装程序包。

  2. 双击所需的包进行安装。 如果看到弹出 SmartScreen,选择“详细信息”,然后选择“仍要运行” 。

  3. 连接到 VPN。 前往“VPN 设置”,找到创建的 VPN 连接。 其名称与虚拟网络的名称相同。 选择“连接” 。 可能会出现弹出消息。 选择“继续”,以便使用提升的权限。

  4. 在“连接”状态页上,选择“连接”以启动连接。 如果看到“选择证书”屏幕,请确保所显示的客户端证书是要用于连接的证书。 如果不是,请使用下拉箭头选择正确的证书,并选择“确定”。

装载 Azure 文件共享

设置点到站点 VPN 后,即可使用它将 Azure 文件共享装载到本地计算机上。

若要使用存储帐户密钥装载文件共享,请打开 Windows 命令提示符并运行以下命令。 将�<YourStorageAccountName><FileShareName><YourStorageAccountKey> 替换为你自己的值。 如果 Z: 已在使用中,请将其替换为可用的驱动器号。 在 Azure 门户中导航到存储帐户并选择“安全 + 网络”>“访问密钥”找到你的存储帐户密钥。

net use Z: \\<YourStorageAccountName>.file.core.chinacloudapi.cn\<FileShareName> /user:localhost\<YourStorageAccountName> <YourStorageAccountKey>

轮换 VPN 根证书

如果根证书因过期或新要求而需要轮换,可以将新的根证书添加到现有虚拟网络网关,而无需重新部署虚拟网络网关。 使用以下脚本添加根证书后,需要重新创建 VPN 客户端证书

<resource-group-name><desired-vpn-name-here><new-root-cert-name> 替换为自己的值,然后再运行脚本。

#Creating the new Root Certificate
$ResourceGroupName           = '<resource-group-name>'
$vpnName                     = '<desired-vpn-name-here>'
$NewRootCertName             = '<new-root-cert-name>'
$rootcertname                = "CN=$NewRootCertName"
$certLocation                = 'Cert:\CurrentUser\My'
$date                        = Get-Date -Format 'MM_yyyy'
$vpnTemp                     = "C:\vpn-temp_$date"
$exportedencodedrootcertpath = "$vpnTemp\P2SRootCertencoded.cer"
$exportedrootcertpath        = "$vpnTemp\P2SRootCert.cer"

if (-Not (Test-Path -Path $vpnTemp -PathType Container)) {
    New-Item -ItemType Directory -Force -Path $vpnTemp | Out-Null
}

$selfSignedCertParams = @{
    Type              = 'Custom'
    KeySpec           = 'Signature'
    Subject           = $rootcertname
    KeyExportPolicy   = 'Exportable'
    HashAlgorithm     = 'sha256'
    KeyLength         = 2048
    CertStoreLocation = $certLocation
    KeyUsageProperty  = 'Sign'
    KeyUsage          = 'CertSign'
}
$rootcert = New-SelfSignedCertificate @selfSignedCertParams

$exportCertParams = @{
    Cert      = $rootcert
    FilePath  = $exportedencodedrootcertpath
    NoClobber = $true
}
Export-Certificate @exportCertParams | Out-Null

certutil -encode $exportedencodedrootcertpath $exportedrootcertpath | Out-Null

$rawRootCertificate = Get-Content -Path $exportedrootcertpath

$rootCertificate = ''

foreach($line in $rawRootCertificate) { 
    if ($line -notlike '*Certificate*') { 
        $rootCertificate += $line 
    } 
}

#Fetching gateway details and adding the newly created Root Certificate.
$gateway = Get-AzVirtualNetworkGateway -Name $vpnName -ResourceGroupName $ResourceGroupName

$vpnClientRootCertParams = @{
    PublicCertData               = $rootCertificate
    ResourceGroupName            = $ResourceGroupName
    VirtualNetworkGatewayName    = $gateway
    VpnClientRootCertificateName = $NewRootCertName
}
Add-AzVpnClientRootCertificate @vpnClientRootCertParams

另请参阅