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


Настройка 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)
Microsoft.Storage Настроенная версия 2 HDD (стандартный) Локальное (LRS) Да Нет
Microsoft.Storage Настроенная версия 2 HDD (стандартный) Зона (ZRS) Да Нет
Microsoft.Storage Настроенная версия 2 HDD (стандартный) Гео (GRS) Да Нет
Microsoft.Storage Настроенная версия 2 HDD (стандартный) GeoZone (GZRS) Да Нет
Microsoft.Storage Настроенная версия v1 SSD (премиум) Локальное (LRS) Да Да
Microsoft.Storage Настроенная версия v1 SSD (премиум) Зона (ZRS) Да Да
Microsoft.Storage Оплата по мере использования HDD (стандартный) Локальное (LRS) Да Нет
Microsoft.Storage Оплата по мере использования HDD (стандартный) Зона (ZRS) Да Нет
Microsoft.Storage Оплата по мере использования HDD (стандартный) Гео (GRS) Да Нет
Microsoft.Storage Оплата по мере использования HDD (стандартный) GeoZone (GZRS) Да Нет

Предпосылки

  • Последняя версия Azure CLI. Сведения о том, как установить Azure CLI, см. в статье "Установка Azure PowerShell CLI " и выбор операционной системы. Если вы предпочитаете использовать модуль Azure PowerShell в Linux, вы можете использовать его. Однако приведенные ниже инструкции предназначены для Azure CLI.

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

См. также