Настройка VPN типа "точка — сеть" в Linux для использования с Файлы Azure

Вы можете использовать подключение виртуальной частной сети (VPN) типа "точка — сеть" (P2S) для подключения общих папок Azure за пределами Azure, не отправляя данные через открытый Интернет. VPN-подключение типа "точка — сеть" — это VPN-подключение между Azure и отдельным клиентом. Чтобы использовать VPN-подключение P2S к службе "Файлы Azure", необходимо настроить VPN-подключение P2S для каждого клиента, которому требуется подключиться. Если у вас есть множество клиентов, которые должны подключаться к общим папкам Azure из локальной сети, вы можете использовать VPN-подключение типа "сеть — сеть" (S2S) вместо подключения типа "точка — сеть" для каждого клиента. Дополнительные сведения см. в статье "Настройка VPN типа "сеть — сеть" для использования с Файлы Azure.

Мы настоятельно рекомендуем ознакомиться с общими сведениями о сети Файлы Azure перед продолжением работы с этой статьей для полного обсуждения параметров сети, доступных для Файлы Azure.

В статье описаны действия по настройке VPN типа "точка — сеть" в Linux для подключения общих папок Azure непосредственно в локальной среде.

Применяется к

Тип общей папки SMB NFS
Стандартные общие папки (GPv2), LRS/ZRS Да Нет
Стандартные общие папки (GPv2), GRS/GZRS Да Нет
Общие папки уровня "Премиум" (FileStorage), LRS/ZRS Да Да

Необходимые компоненты

  • Последняя версия 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. Vpn-подключение P2S, создаваемое автоматически, — это мост между локальным компьютером 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 "Базовый". Этот сценарий использует номер SKU VpnGw1 для шлюза виртуальной сети.

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 

Подключение файлового ресурса Azure

Теперь, когда вы настроили VPN типа "точка — сеть", вы можете подключить общую папку Azure. См. статью "Подключение файловых ресурсов S МБ к Linux или подключение ОБЩЕЙ папки NFS к Linux.

См. также