Compartir a través de


Configuración de 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 P2S con Azure Files, debe configurar una conexión VPN P2S 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

Modelo de administración Modelo de facturación Nivel multimedia Redundancia Pequeñas y Medianas Empresas (PYME) NFS
Microsoft.Storage Aprovisionado v2 HDD (estándar) Local (LRS) Sí No
Microsoft.Storage Aprovisionado v2 HDD (estándar) Zona (ZRS) Sí No
Microsoft.Storage Aprovisionado v2 HDD (estándar) Geo (GRS) Sí No
Microsoft.Storage Aprovisionado v2 HDD (estándar) GeoZone (GZRS) Sí No
Microsoft.Storage Aprovisionado v1 SSD (Premium) Local (LRS) Sí Sí
Microsoft.Storage Aprovisionado v1 SSD (Premium) Zona (ZRS) Sí Sí
Microsoft.Storage Pago por uso HDD (estándar) Local (LRS) Sí No
Microsoft.Storage Pago por uso HDD (estándar) Zona (ZRS) Sí No
Microsoft.Storage Pago por uso HDD (estándar) Geo (GRS) Sí No
Microsoft.Storage Pago por uso HDD (estándar) GeoZone (GZRS) Sí No

Prerrequisitos

  • La versión más reciente de la CLI de Azure. Para obtener información sobre cómo instalar la CLI de Azure, consulte Instalación de la CLI de Azure PowerShell y selección del 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 de administración que representan un grupo compartido de almacenamiento en el que puede implementar varios recursos compartidos de archivos. 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 desea montar en el entorno local. Para más información acerca de 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 proporcionar conexiones VPN mediante varios protocolos VPN, incluidos IPsec y OpenVPN. En este artículo se muestra cómo usar IPsec y se usa el paquete strongSwan para proporcionar la compatibilidad con Linux.

Comprobado 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 compatible, enviar EAP_NAK, es posible que tenga que instalar complementos adicionales:

sudo apt install -y libcharon-extra-plugins

Implementación de una red virtual

Para acceder a su 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. Puede pensar en la creación de la conexión VPN P2S como un puente entre la máquina Linux local y esta red virtual de Azure.

El script siguiente crea 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 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.

Recuerde reemplazar <region>, <resource-group>y <desired-vnet-name> por los valores adecuados 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 proporciona al gateway de máquinas virtuales.
  • Un certificado de cliente, que está firmado 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 conecta el cliente Linux local. La implementación de este servicio requiere dos componentes básicos:

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

Recuerde reemplazar por <desired-vpn-name-here> el nombre que desea para estos recursos.

Nota:

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

Las conexiones IKEv2/OpenVPN de P2S no se admiten con la SKU básica . Este script usa la SKU vpnGw1 para la puerta de enlace de red virtual.

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 crea un paquete descargable con archivos de configuración necesarios para inicializar la conexión VPN en la máquina Linux local. El script siguiente coloca los certificados que creó en el lugar correcto y configura el ipsec.conf archivo 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

Después de configurar la VPN de punto a sitio, puede montar el recurso compartido de archivos de Azure. Consulte Montar recursos compartidos de archivos SMB en Linux o Montar recursos compartidos de archivos NFS en Linux.

Consulte también