Поделиться через


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

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

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

В статье описаны действия по настройке 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 размещаются в учетных записях хранения данных, которые представляют собой общий пул хранения, в котором можно разместить несколько общих файловых ресурсов, а также другие ресурсы хранения, такие как контейнеры BLOB-объектов или очереди. Дополнительные сведения о развертывании общих папок Azure и учетных записей хранения см. в статье Создание общей папки Azure.

  • Частная конечная точка для учетной записи хранения, содержащей общую папку Azure, которую вы хотите подключить локально. Сведения о создании частной конечной точки см. в статье "Настройка сетевых конечных точек Azure Files".

Установка необходимого программного обеспечения

Шлюз виртуальной сети 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. См. раздел подключение общих папок SMB к Linux или подключение общих папок NFS к Linux.

См. также