تكوين VPN من نقطة إلى موقع (P 2 S) على Windows لاستخدامه مع ملفات Azure

يمكنك استخدام اتصال VPN من نقطة إلى موقع (P 2 S) لتثبيت مشاركات ملف Azure عبر SMB من خارج Azure، دون فتح المنفذ 445. اتصال VPN من نقطة إلى موقع هو اتصال VPN بين Azure وعميل فردي. لاستخدام اتصال P2S VPN مع ملفات Azure، يجب تهيئة اتصال P2S VPN لكل عميل يريد الاتصال. إذا كان لديك العديد من العملاء الذين يحتاجون إلى الاتصال بمشاركات ملفات Azure خاصتك من شبكتك المحلية، فيمكنك استخدام اتصال VPN من موقع إلى موقع (S 2 S) بدلًا من اتصال نقطة إلى موقع لكل عميل. لمعرفة المزيد، راجع تكوين VPN من موقع إلى موقع لاستخدامه مع ملفات Azure .

نوصيك بشدة بقراءة اعتبارات التواصل للوصول المباشر إلى مشاركة ملفات Azure قبل متابعة هذه المقالة للحصول على مناقشة كاملة لخيارات التواصل المتاحة لملفات Azure.

تُبين المقالة تفاصيل خطوات تكوين VPN من نقطة إلى موقع على Windows (عميل Windows وWindows Server) لتثبيت مشاركات ملفات Azure المحلية مباشرةً. إذا كنت تبحث عن توجيه حركة مرور Azure File Sync عبر VPN، فيرجى الاطلاع على تهيئة إعدادات وكيل Azure File Sync وجدار الحماية.

ينطبق على

نوع مشاركة الملف SMB NFS
مشاركات الملفات القياسية (GPv2)، LRS/ZRS Yes No
مشاركات الملفات القياسية (GPv2)، GRS/GZRS Yes No
مشاركات الملفات المتميزة (FileStorage)، LRS/ZRS Yes No

المتطلبات الأساسية

  • أحدث إصدار من وحدة Azure PowerShell. لمزيد من المعلومات حول كيفية تثبيت وحدة Azure PowerShell، راجع تثبيت وحدة Azure PowerShell وحدد نظام التشغيل خاصتك. إذا كنت تفضل استخدام واجهة سطر الأوامر Azure على Windows، فيمكنك تقديم الإرشادات أدناه لـAzure PowerShell.

  • مشاركة ملف Azure ترغب في تركيبه محليًا. يتم نشر مشاركات ملفات Azure داخل حسابات التخزين، وهي عبارة عن بنيات إدارة تمثل مجموعة مشتركة من التخزين يمكنك من خلالها نشر مشاركات ملفات متعددة، بالإضافة إلى موارد تخزين أخرى، مثل حاويات كائن ثنائي كبير الحجم أو قوائم الانتظار. يمكنك معرفة المزيد حول كيفية نشر مشاركات ملفات Azure وحسابات التخزين في إنشاء مشاركة ملف Azure.

  • شبكة ظاهرية مع نقطة نهاية خاصة لحساب التخزين الذي يحتوي على مشاركة ملف Azure التي تريد تثبيتها محليًا. لمعرفة المزيد حول كيفية إنشاء نقطة نهاية خاصة، راجع تكوين نقاط نهاية شبكة Azure Files.

اجمع المعلومات البيئية

من أجل إعداد VPN من نقطة إلى موقع، نحتاج أولًا إلى جمع بعض المعلومات حول بيئتك لاستخدامها في جميع أنحاء الدليل. راجع قسم المتطلبات الأساسية إذا لم تكن قد أنشأت بالفعل حساب تخزين و/أو شبكة ظاهرية و/أو نقاط نهاية خاصة.

تذكر استبدال <resource-group>, <vnet-name>, <subnet-name>, و <storage-account-name> بالقيم المناسبة لبيئتك.

$resourceGroupName = "<resource-group-name>" 
$virtualNetworkName = "<vnet-name>"
$subnetName = "<subnet-name>"
$storageAccountName = "<storage-account-name>"

$virtualNetwork = Get-AzVirtualNetwork `
    -ResourceGroupName $resourceGroupName `
    -Name $virtualNetworkName

$subnetId = $virtualNetwork | `
    Select-Object -ExpandProperty Subnets | `
    Where-Object { $_.Name -eq "StorageAccountSubnet" } | `
    Select-Object -ExpandProperty Id

$storageAccount = Get-AzStorageAccount `
    -ResourceGroupName $resourceGroupName `
    -Name $storageAccountName

$privateEndpoint = Get-AzPrivateEndpoint | `
    Where-Object {
        $subnets = $_ | `
            Select-Object -ExpandProperty Subnet | `
            Where-Object { $_.Id -eq $subnetId }

        $connections = $_ | `
            Select-Object -ExpandProperty PrivateLinkServiceConnections | `
            Where-Object { $_.PrivateLinkServiceId -eq $storageAccount.Id }
        
        $null -ne $subnets -and $null -ne $connections
    } | `
    Select-Object -First 1

إنشاء شهادة جذرية لمصادقة VPN

من أجل مصادقة اتصالات VPN من أجهزة Windows الموجودة محلياً للوصول إلى شبكتك الظاهرية، يجب إنشاء شهادتين: شهادة جذر، والتي سيتم توفيرها لبوابة الجهاز الظاهرية، وشهادة عميل، والتي سيتم توقيعها مع شهادة الجذر. تقوم PowerShell التالية بإنشاء شهادة جذرية؛ سيتم إنشاء شهادة العميل بعد إنشاء بوابة الشبكة الظاهرية Azure بمعلومات من البوابة.

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

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

if ($PSVersionTable.PSVersion -ge [System.Version]::new(6, 0)) {
    Install-Module WindowsCompatibility
    Import-WinModule PKI
}

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

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

certutil -encode $exportedencodedrootcertpath $exportedrootcertpath | Out-Null

$rawRootCertificate = Get-Content -Path $exportedrootcertpath

[System.String]$rootCertificate = ""
foreach($line in $rawRootCertificate) { 
    if ($line -notlike "*Certificate*") { 
        $rootCertificate += $line 
    } 
}

نشر بوابة الشبكة الظاهرية

تعد بوابة الشبكة الظاهرية Azure هي الخدمة التي ستتصل بها أجهزة Windows الموجودة محليًا. يتطلب نشر هذه الخدمة مكونين أساسيين: عنوان IP عام يحدد البوابة لعملائك أينما كانوا في العالم وشهادة جذرية أنشأتها في وقت سابق والتي سيتم استخدامها لمصادقة عملائك.

تذكر استبدال <desired-vpn-name-here> بالاسم الذي تريده لهذه الموارد.

ملاحظة

قد يستغرق نشر بوابة شبكة Azure الظاهرية ما يصل إلى 45 دقيقة. أثناء نشر هذا المورد، سيحظر هذا البرنامج النصي PowerShell النشر المراد إكماله. هذا متوقع.

$vpnName = "<desired-vpn-name-here>" 
$publicIpAddressName = "$vpnName-PublicIP"

$publicIPAddress = New-AzPublicIpAddress `
    -ResourceGroupName $resourceGroupName `
    -Name $publicIpAddressName `
    -Location $region `
    -Sku Basic `
    -AllocationMethod Dynamic

$gatewayIpConfig = New-AzVirtualNetworkGatewayIpConfig `
    -Name "vnetGatewayConfig" `
    -SubnetId $gatewaySubnet.Id `
    -PublicIpAddressId $publicIPAddress.Id

$azRootCertificate = New-AzVpnClientRootCertificate `
    -Name "P2SRootCert" `
    -PublicCertData $rootCertificate

$vpn = New-AzVirtualNetworkGateway `
    -ResourceGroupName $resourceGroupName `
    -Name $vpnName `
    -Location $region `
    -GatewaySku VpnGw1 `
    -GatewayType Vpn `
    -VpnType RouteBased `
    -IpConfigurations $gatewayIpConfig `
    -VpnClientAddressPool "172.16.201.0/24" `
    -VpnClientProtocol IkeV2 `
    -VpnClientRootCertificates $azRootCertificate

إنشاء شهادة عميل

يتم إنشاء شهادة العميل باستخدام URI لبوابة الشبكة الظاهرية. تم توقيع هذه الشهادة مع الشهادة الجذرية التي أنشأتها في وقت سابق.

$clientcertpassword = "1234"

$vpnClientConfiguration = New-AzVpnClientConfiguration `
    -ResourceGroupName $resourceGroupName `
    -Name $vpnName `
    -AuthenticationMethod EAPTLS

Invoke-WebRequest `
    -Uri $vpnClientConfiguration.VpnProfileSASUrl `
    -OutFile "$vpnTemp\vpnclientconfiguration.zip"

Expand-Archive `
    -Path "$vpnTemp\vpnclientconfiguration.zip" `
    -DestinationPath "$vpnTemp\vpnclientconfiguration"

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

$exportedclientcertpath = $vpnTemp + "P2SClientCert.pfx"
$clientcertname = "CN=" + $vpnProfile.VpnServer

$clientcert = New-SelfSignedCertificate `
    -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")

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

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

تكوين عميل VPN

ستقوم بوابة الشبكة الظاهرية Azure بإنشاء حزمة قابلة للتنزيل مع ملفات التكوين المطلوبة لتهيئة اتصال VPN على جهاز Windows الموجود محليًا. سنقوم بتكوين اتصال VPN باستخدام ميزة دائمًا على VPN لنظام التشغيل Windows 10/ Windows Server 2016+. تحتوي هذه الحزمة أيضًا على حزم قابلة للتنفيذ والتي ستقوم بتكوين عميل Windows VPN القديم، إذا رغبت في ذلك. يستخدم هذا الدليل دائمًا على VPN بدلًا من عميل Windows VPN القديم حيث يسمح عميل Always On VPN للمستخدمين النهائيين بالاتصال/قطع الاتصال من شبكة Azure VPN دون الحصول على أذونات المسؤول إلى جهازهم.

سيقوم البرنامج النصي التالي بتثبيت شهادة العميل المطلوبة للمصادقة مقابل بوابة الشبكة الظاهرية وتنزيل حزمة VPN وتثبيتها. تذكر استبدال <computer1> و <computer2> بأجهزة الكمبيوتر المطلوبة. يمكنك تشغيل هذا البرنامج النصي على العديد من الأجهزة التي ترغب فيها عن طريق إضافة المزيد من جلسات PowerShell إلى $sessions المصفوفة. يجب أن يكون حساب الاستخدام الخاص بك مسؤولًا على كل من هذه الأجهزة. إذا كان أحد هذه الأجهزة هو الجهاز المحلي الذي تقوم بتشغيل البرنامج النصي منه، فيجب تشغيل البرنامج النصي من جلسة PowerShell مرتفعة.

$sessions = [System.Management.Automation.Runspaces.PSSession[]]@()
$sessions += New-PSSession -ComputerName "<computer1>"
$sessions += New-PSSession -ComputerName "<computer2>"

foreach ($session in $sessions) {
    Invoke-Command -Session $session -ArgumentList $vpnTemp -ScriptBlock { 
        $vpnTemp = $args[0]
        if (-Not (Test-Path $vpnTemp)) {
            New-Item `
                -ItemType Directory `
                -Force `
                -Path "C:\vpn-temp" | Out-Null
        }
    }

    Copy-Item `
        -Path $exportedclientcertpath, $exportedrootcertpath, "$vpnTemp\vpnclientconfiguration.zip" `
        -Destination $vpnTemp `
        -ToSession $session

    Invoke-Command `
        -Session $session `
        -ArgumentList `
            $mypwd, `
            $vpnTemp, `
            $virtualNetworkName `
        -ScriptBlock { 
            $mypwd = $args[0] 
            $vpnTemp = $args[1]
            $virtualNetworkName = $args[2]

            Import-PfxCertificate `
                -Exportable `
                -Password $mypwd `
                -CertStoreLocation "Cert:\LocalMachine\My" `
                -FilePath "$vpnTemp\P2SClientCert.pfx" | Out-Null

            Import-Certificate `
                -FilePath "$vpnTemp\P2SRootCert.cer" `
                -CertStoreLocation "Cert:\LocalMachine\Root" | Out-Null

            Expand-Archive `
                -Path "$vpnTemp\vpnclientconfiguration.zip" `
                -DestinationPath "$vpnTemp\vpnclientconfiguration"
            $vpnGeneric = "$vpnTemp\vpnclientconfiguration\Generic"

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

            Add-VpnConnection `
                -Name $virtualNetworkName `
                -ServerAddress $vpnProfile.VpnServer `
                -TunnelType Ikev2 `
                -EncryptionLevel Required `
                -AuthenticationMethod MachineCertificate `
                -SplitTunneling `
                -AllUserConnection

            Add-VpnConnectionRoute `
                -Name $virtualNetworkName `
                -DestinationPrefix $vpnProfile.Routes `
                -AllUserConnection

            Add-VpnConnectionRoute `
                -Name $virtualNetworkName `
                -DestinationPrefix $vpnProfile.VpnClientAddressPool `
                -AllUserConnection

            rasdial $virtualNetworkName
        }
}

Remove-Item -Path $vpnTemp -Recurse

مشاركة ملف Mount Azure

الآن بعد أن قمت بإعداد VPN من نقطة إلى موقع، يمكنك استخدامه لتثبيت مشاركة ملف Azure على أجهزة الكمبيوتر التي قمت بإعدادها عبر PowerShell. سيقوم المثال التالي بتحميل المشاركة، وسرد الدليل الجذري للحصة لإثبات أن المشاركة قد تم تحميلها بالفعل، وإلغاء تحميل المشاركة. لسوء الحظ، لا يمكن تثبيت الحصة باستمرار على PowerShell Remoteing. للتحميل باستمرار، راجع استخدام مشاركة ملف Azure مع Windows.

$myShareToMount = "<file-share>"

$storageAccountKeys = Get-AzStorageAccountKey `
    -ResourceGroupName $resourceGroupName `
    -Name $storageAccountName
$storageAccountKey = ConvertTo-SecureString `
    -String $storageAccountKeys[0].Value `
    -AsPlainText `
    -Force

$nic = Get-AzNetworkInterface -ResourceId $privateEndpoint.NetworkInterfaces[0].Id
$storageAccountPrivateIP = $nic.IpConfigurations[0].PrivateIpAddress

Invoke-Command `
    -Session $sessions `
    -ArgumentList  `
        $storageAccountName, `
        $storageAccountKey, `
        $storageAccountPrivateIP, `
        $myShareToMount `
    -ScriptBlock {
        $storageAccountName = $args[0]
        $storageAccountKey = $args[1]
        $storageAccountPrivateIP = $args[2]
        $myShareToMount = $args[3]

        $credential = [System.Management.Automation.PSCredential]::new(
            "AZURE\$storageAccountName", 
            $storageAccountKey)

        New-PSDrive `
            -Name Z `
            -PSProvider FileSystem `
            -Root "\\$storageAccountPrivateIP\$myShareToMount" `
            -Credential $credential `
            -Persist | Out-Null
        Get-ChildItem -Path Z:\
        Remove-PSDrive -Name Z
    }

تدوير شهادة 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 $vpnTemp)) {
    New-Item -ItemType Directory -Force -Path $vpnTemp | Out-Null
}

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

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

certutil -encode $exportedencodedrootcertpath $exportedrootcertpath | Out-Null

$rawRootCertificate = Get-Content -Path $exportedrootcertpath

[System.String]$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

Add-AzVpnClientRootCertificate `
    -PublicCertData $rootCertificate `
    -ResourceGroupName $ResourceGroupName `
    -VirtualNetworkGatewayName $gateway `
    -VpnClientRootCertificateName $NewRootCertName

راجع أيضًا