تكوين VPN من نقطة إلى موقع (P2S) على Linux للاستخدام مع Azure Files

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

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

توضح المقالة بالتفصيل خطوات تكوين Point-to-Site VPN على Linux لتحميل مشاركات ملف Azure محليًا مباشرةً.

ينطبق على

نوع مشاركة الملف SMB NFS
مشاركات الملفات القياسية (GPv2)، حسابات التخزين المكررة محليًا (LRS) وحسابات التخزين المكررة في المنطقة (ZRS) Yes No
مشاركات الملفات القياسية (GPv2)، حساب تخزين مكرر جغرافي (GRS) أو حساب تخزين مكرر للمنطقة الجغرافية (GZRS) Yes No
مشاركات الملفات المدفوعة (FileStorage)، حسابات التخزين المكررة محليًا (LRS) وحسابات التخزين المكررة في المنطقة (ZRS) Yes Yes

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

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

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

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

تثبيت البرنامج المطلوب

يمكن أن توفر بوابة الشبكة الظاهرية لـ Azure اتصالات VPN باستخدام عدة بروتوكولات VPN، بما في ذلك IPsec و OpenVPN. توضح هذه المقالة كيفية استخدام IPsec وتستخدم حزمة strongSwan لتوفير الدعم على Linux.

تم التحقق منه باستعمال Ubuntu 18.10.

sudo apt update
sudo apt install strongswan strongswan-pki libstrongswan-extra-plugins curl libxml2-utils cifs-utils unzip

INSTALL_DIR="/etc/"

إذا فشل التثبيت أو تلقيت خطأ مثل EAP_IDENTITY غير مدعوم، أو إرسال EAP_NAK، فقد تحتاج إلى تثبيت مكونات إضافية:

sudo apt install -y libcharon-extra-plugins

توزيع شبكة ظاهرية

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

سينشئ البرنامج النصي التالي شبكة Azure الظاهرية بثلاث شبكات فرعية: واحدة لنقطة نهاية خدمة حساب التخزين الخاص بك، وواحدة لنقطة النهاية الخاصة لحساب التخزين الخاص بك، وهي مطلوبة للوصول إلى حساب التخزين المحلي دون إنشاء توجيه مخصص لـ IP العام لـ حساب التخزين الذي قد يتغير، وواحد لبوابة الشبكة الافتراضية التي توفر خدمة VPN.

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

REGION="<region>"
RESOURCE_GROUP_NAME="<resource-group>"
VIRTUAL_NETWORK_NAME="<desired-vnet-name>"

VIRTUAL_NETWORK=$(az network vnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VIRTUAL_NETWORK_NAME \
    --location $REGION \
    --address-prefixes "192.168.0.0/16" \
    --query "newVNet.id" | tr -d '"')

SERVICE_ENDPOINT_SUBNET=$(az network vnet subnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --name "ServiceEndpointSubnet" \
    --address-prefixes "192.168.0.0/24" \
    --service-endpoints "Microsoft.Storage" \
    --query "id" | tr -d '"')

PRIVATE_ENDPOINT_SUBNET=$(az network vnet subnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --name "PrivateEndpointSubnet" \
    --address-prefixes "192.168.1.0/24" \
    --query "id" | tr -d '"')

GATEWAY_SUBNET=$(az network vnet subnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --name "GatewaySubnet" \
    --address-prefixes "192.168.2.0/24" \
    --query "id" | tr -d '"')

ابتكار شهادات لمصادقة VPN

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

ROOT_CERT_NAME="P2SRootCert"
USERNAME="client"
PASSWORD="1234"

mkdir temp
cd temp

sudo ipsec pki --gen --outform pem > rootKey.pem
sudo ipsec pki --self --in rootKey.pem --dn "CN=$ROOT_CERT_NAME" --ca --outform pem > rootCert.pem

ROOT_CERTIFICATE=$(openssl x509 -in rootCert.pem -outform der | base64 -w0 ; echo)

sudo ipsec pki --gen --size 4096 --outform pem > "clientKey.pem"
sudo ipsec pki --pub --in "clientKey.pem" | \
    sudo ipsec pki \
        --issue \
        --cacert rootCert.pem \
        --cakey rootKey.pem \
        --dn "CN=$USERNAME" \
        --san $USERNAME \
        --flag clientAuth \
        --outform pem > "clientCert.pem"

openssl pkcs12 -in "clientCert.pem" -inkey "clientKey.pem" -certfile rootCert.pem -export -out "client.p12" -password "pass:$PASSWORD"

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

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

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

إشعار

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

اتصالات P2S IKEv2 / OpenVPN غير مدعومة مع SKU الأساسي . يستخدم هذا البرنامج النصي VpnGw1 SKU لبوابة الشبكة الظاهرية، وفقًا لذلك.

VPN_NAME="<desired-vpn-name-here>"
PUBLIC_IP_ADDR_NAME="$VPN_NAME-PublicIP"

PUBLIC_IP_ADDR=$(az network public-ip create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $PUBLIC_IP_ADDR_NAME \
    --location $REGION \
    --sku "Basic" \
    --allocation-method "Dynamic" \
    --query "publicIp.id" | tr -d '"')

az network vnet-gateway create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VPN_NAME \
    --vnet $VIRTUAL_NETWORK_NAME \
    --public-ip-addresses $PUBLIC_IP_ADDR \
    --location $REGION \
    --sku "VpnGw1" \
    --gateway-typ "Vpn" \
    --vpn-type "RouteBased" \
    --address-prefixes "172.16.201.0/24" \
    --client-protocol "IkeV2" > /dev/null

az network vnet-gateway root-cert create \
    --resource-group $RESOURCE_GROUP_NAME \
    --gateway-name $VPN_NAME \
    --name $ROOT_CERT_NAME \
    --public-cert-data $ROOT_CERTIFICATE \
    --output none

تكوين عميل VPN

ستنشئ بوابة شبكة Azure الظاهرية حزمة قابلة للتنزيل مع ملفات التكوين المطلوبة لتهيئة اتصال VPN على جهاز Linux الداخلي. سيضع البرنامج النصي التالي الشهادات التي أنشأتها في المكان الصحيح ويهيئ ملف ipsec.conf بالقيم الصحيحة من ملف التكوين في الحزمة القابلة للتنزيل.

VPN_CLIENT=$(az network vnet-gateway vpn-client generate \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VPN_NAME \
    --authentication-method EAPTLS | tr -d '"')

curl $VPN_CLIENT --output vpnClient.zip
unzip vpnClient.zip

VPN_SERVER=$(xmllint --xpath "string(/VpnProfile/VpnServer)" Generic/VpnSettings.xml)
VPN_TYPE=$(xmllint --xpath "string(/VpnProfile/VpnType)" Generic/VpnSettings.xml | tr '[:upper:]' '[:lower:]')
ROUTES=$(xmllint --xpath "string(/VpnProfile/Routes)" Generic/VpnSettings.xml)

sudo cp "${INSTALL_DIR}ipsec.conf" "${INSTALL_DIR}ipsec.conf.backup"
sudo cp "Generic/VpnServerRoot.cer_0" "${INSTALL_DIR}ipsec.d/cacerts"
sudo cp "${USERNAME}.p12" "${INSTALL_DIR}ipsec.d/private" 

sudo tee -a "${installDir}ipsec.conf" <<EOF
conn $VIRTUAL_NETWORK_NAME
    keyexchange=$VPN_TYPE
    type=tunnel
    leftfirewall=yes
    left=%any
    leftauth=eap-tls
    leftid=%client
    right=$vpnServer
    rightid=%$vpnServer
    rightsubnet=$routes
    leftsourceip=%config
    auto=add
EOF

echo ": P12 client.p12 '$PASSWORD'" | sudo tee -a "${INSTALL_DIR}ipsec.secrets" > /dev/null

sudo ipsec restart
sudo ipsec up $VIRTUAL_NETWORK_NAME 

مشاركة ملف Mount Azure

الآن بعد أن قمت بإعداد VPN من نقطة إلى موقع، يمكنك تحميل مشاركة ملف Azure. راجع تحميل مشاركات ملفات SMB إلى Linux أو تحميل مشاركة ملف NFS إلى Linux.

(راجع أيضًا )