Compartir a través de


Configure una VPN de punto a sitio (P2S) en Linux para su uso con Azure Files

Puede usar una conexión de red privada virtual (P2S) de punto a sitio (VPN) para montar los recursos compartidos de archivos de Azure desde fuera de Azure, sin enviar datos a través de Internet abierto. Una conexión VPN de punto a sitio es una conexión VPN entre Azure y un cliente individual. Para usar una conexión VPN de punto a sitio con Azure Files, debe configurar una conexión VPN de punto a sitio para cada cliente que quiera conectarse. Si tiene muchos clientes que necesitan conectarse a sus recursos compartidos de archivos de Azure desde la red local, puede usar una conexión VPN de sitio a sitio (S2S) en lugar de una conexión de punto a sitio para cada cliente. Para obtener más información, consulte Configuración de una VPN de sitio a sitio para su uso con Azure Files.

Se recomienda encarecidamente que lea introducción a la conexión en red de Azure Files antes de continuar con este artículo para obtener una explicación completa de las opciones de red disponibles para Azure Files.

En el artículo se detallan los pasos para configurar una VPN de punto a sitio en Linux para montar recursos compartidos de archivos de Azure directamente en el entorno local.

Se aplica a

Tipo de recurso compartido de archivos SMB NFS
Recursos compartidos de archivos Estándar (GPv2), LRS/ZRS Sí No
Recursos compartidos de archivos Estándar (GPv2), GRS/GZRS Sí No
Recursos compartidos de archivos Premium (FileStorage), LRS/ZRS Sí Sí

Prerrequisitos

  • La versión más reciente de la CLI de Azure. Para más información sobre cómo instalar la CLI de Azure, consulte Instalación de la CLI de Azure PowerShell y seleccione el sistema operativo. Si prefiere usar el módulo de Azure PowerShell en Linux, puede hacerlo. Sin embargo, las instrucciones siguientes son para la CLI de Azure.

  • Un recurso compartido de archivos de Azure que le gustaría montar en el entorno local. Los recursos compartidos de archivos de Azure se implementan en cuentas de almacenamiento, que son construcciones que representan un grupo compartido de almacenamiento en el que puede implementar varios recursos compartidos de archivos u otros recursos de almacenamiento, como contenedores de blobs o colas. Puede encontrar más información sobre cómo implementar cuentas de almacenamiento y recursos compartidos de archivos de Azure en Creación de un recurso compartido de archivos de Azure.

  • Un punto de conexión privado para la cuenta de almacenamiento que contiene el recurso compartido de archivos de Azure que quiere montar localmente. Para más información sobre cómo crear un punto de conexión privado, consulte Configuración de puntos de conexión de red de Azure Files.

Instalación del software necesario

La puerta de enlace de red virtual de Azure puede ofrecer conexiones VPN mediante varios protocolos VPN, entre los que se incluyen IPsec y OpenVPN. En este artículo se muestra cómo usar IPsec y se usa el paquete strongSwan para proporcionar compatibilidad con Linux.

Comprobada con Ubuntu 18.10.

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

INSTALL_DIR="/etc/"

Si se produce un error en la instalación o se produce un error como EAP_IDENTITY no se admite, enviar EAP_NAK, es posible que tenga que instalar complementos adicionales:

sudo apt install -y libcharon-extra-plugins

Implementar una red virtual

Para acceder al recurso compartido de archivos de Azure y a otros recursos de Azure desde el entorno local a través de una VPN de punto a sitio, debe crear una red virtual o VNet. La conexión VPN P2S que creará automáticamente es un puente entre la máquina Linux local y esta red virtual de Azure.

El siguiente script creará una red virtual de Azure con tres subredes: una para el punto de conexión de servicio de la cuenta de almacenamiento, otra para el punto de conexión privado de la cuenta de almacenamiento (que es necesaria para acceder a la cuenta de almacenamiento local sin crear un enrutamiento personalizado para la dirección IP pública de la cuenta de almacenamiento que puede cambiar) y otra para la puerta de enlace de red virtual que proporciona el servicio VPN.

No olvide reemplazar <region>, <resource-group> y <desired-vnet-name> por los valores correctos para su entorno.

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 '"')

Creación de certificados para la autenticación de VPN

Para que las conexiones VPN desde las máquinas Linux locales se autentiquen para acceder a la red virtual, debe crear dos certificados:

  • Un certificado raíz, que se proporcionará a la puerta de enlace de máquina virtual
  • Un certificado de cliente, que se firmará con el certificado raíz

El siguiente script crea los certificados necesarios.

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"

Implementación de puerta de enlace de red virtual

La puerta de enlace de red virtual de Azure es el servicio al que se conectarán las máquinas Linux locales. La implementación de este servicio requiere dos componentes básicos:

  • Una IP pública que identificará la puerta de enlace a los clientes dondequiera que estén en el mundo
  • El certificado raíz que creó anteriormente que se usará para autenticar a los clientes.

No olvide reemplazar <desired-vpn-name-here> por el nombre que quiera para estos recursos.

Nota

La implementación de una puerta de enlace de red virtual de Azure puede tardar hasta 45 minutos. Mientras se implementa este recurso, este script bash impedirá que se complete la implementación.

Las conexiones IKEv2/OpenVPN de P2S no se admiten con la SKU de Básico. Este script usa la SKU VpnGw1 para la puerta de enlace de red virtual, según corresponda.

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

Configuración del cliente VPN

La puerta de enlace de red virtual de Azure creará un paquete descargable con los archivos de configuración necesarios para inicializar la conexión VPN en la máquina Linux local. El siguiente script colocará los certificados creados en el lugar correcto y configurará el archivo ipsec.conf con los valores correctos del archivo de configuración en el paquete descargable.

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 

Montaje de un recurso compartido de archivos de Azure

Ahora que ha configurado la VPN de punto a sitio, puede montar el recurso compartido de archivos de Azure. Consulte Montaje de un recurso compartido de archivos SMB en Linux o Montaje de un recurso compartido de archivos NFS en Linux.

Consulte también