Configurare una VPN da punto a sito in Linux per l'uso con File di Azure

È possibile usare una connessione VPN da punto a sito (P2S) per montare le condivisioni file di Azure dall'esterno di Azure, senza inviare dati tramite Internet aperto. Una connessione VPN da punto a sito è una connessione VPN tra Azure e un singolo client. Per usare una connessione VPN da punto a sito con File di Azure, è necessario configurarla per ogni client da connettere. Se è necessario connettere molti client alle condivisioni file di Azure dalla rete locale, è possibile usare una connessione VPN da sito a sito invece di una da punto a sito per ogni client. Per altre informazioni, vedere Configurare una VPN da sito a sito per l'uso con File di Azure.

Per una descrizione completa delle opzioni di rete disponibili per File di Azure, è consigliabile leggere l'articolo Panoramica della rete per File di Azure prima di procedere con questo articolo.

Questo articolo illustra i passaggi per configurare una VPN da punto a sito in Linux per montare le condivisioni file di Azure direttamente in locale.

Si applica a

Tipo di condivisione file SMB NFS
Condivisioni file Standard (GPv2), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Yes No
Condivisioni file Standard (GPv2), archiviazione con ridondanza geografica/archiviazione con ridondanza geografica della zona Yes No
Condivisioni file Premium (FileStorage), archiviazione con ridondanza locale/archiviazione con ridondanza della zona Yes Yes

Prerequisiti

  • La versione più recente dell'interfaccia della riga di comando di Azure. Per informazioni su come installare l'interfaccia della riga di comando di Azure, vedere Installare l'interfaccia della riga di comando di Azure PowerShell e selezionare il sistema operativo. Se si preferisce usare il modulo Azure PowerShell in Linux, è possibile. Tuttavia, le istruzioni seguenti sono per l'interfaccia della riga di comando di Azure.

  • Una condivisione file di Azure che si vuole montare in locale. Le condivisioni file di Azure vengono distribuite all'interno degli account di archiviazione, ovvero costrutti di gestione che rappresentano un pool di archiviazione condiviso in cui è possibile distribuire più condivisione file, oltra ad altre risorse come contenitori BLOB o code. Per altre informazioni su come distribuire condivisioni file di Azure e account di archiviazione, vedere Creare una condivisione file di Azure.

  • Un endpoint privato per l'account di archiviazione contenente l'archiviazione file di Azure da montare in locale. Per informazioni su come creare un endpoint privato, vedere Configurazione di endpoint di rete File di Azure.

Installare il software necessario

Il gateway di rete virtuale di Azure può fornire connessioni VPN con diversi protocolli VPN, tra cui IPsec e OpenVPN. Questo articolo illustra come usare IPsec e usa il pacchetto strongSwan per fornire il supporto in Linux.

La procedura è verificata 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/"

Se l'installazione non riesce o viene visualizzato un errore, ad esempio EAP_IDENTITY non supportato, l'invio di EAP_NAK potrebbe essere necessario installare plug-in aggiuntivi:

sudo apt install -y libcharon-extra-plugins

Distribuire una rete virtuale

Per accedere alla condivisione file di Azure e ad altre risorse di Azure dall'ambiente locale tramite una VPN da punto a sito, è necessario creare una rete virtuale. La connessione VPN da punto a sito che verrà creata automaticamente è un bridge tra il computer Linux locale e questa rete virtuale di Azure.

Lo script seguente creerà una rete virtuale di Azure con tre subnet: una per l'endpoint di servizio dell'account di archiviazione, una per l'endpoint privato dell'account di archiviazione (necessario per accedere all'account di archiviazione in locale senza creare un routing personalizzato per l'IP pubblico dell'account di archiviazione, che potrebbe cambiare), e una per il gateway di rete virtuale che fornisce il servizio VPN.

Ricordarsi di sostituire <region>, <resource-group> e <desired-vnet-name> con i valori appropriati per l'ambiente.

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

Creare i certificati per l'autenticazione della VPN

Per consentire l'autenticazione delle connessioni VPN da computer Linux locali per l'accesso alla rete virtuale, è necessario creare due certificati: un certificato radice, che verrà fornito al gateway della macchina virtuale, e un certificato client, che verrà firmato con il certificato radice. Lo script seguente crea i certificati richiesti.

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"

Distribuire il gateway di rete virtuale

Il gateway di rete virtuale di Azure è il servizio a cui si connetteranno i computer Linux locali. La distribuzione di questo servizio richiede due componenti di base: un indirizzo IP pubblico che identificherà il gateway per i client ovunque si trovino nel mondo e un certificato radice creato in precedenza, che verrà usato per autenticare i client.

Ricordarsi di sostituire <desired-vpn-name-here> con il nome che si vuole usare per queste risorse.

Nota

La distribuzione del gateway di rete virtuale di Azure può richiedere fino a 45 minuti. Durante la distribuzione di questa risorsa, questo script bash bloccherà il completamento della distribuzione.

Le connessioni IKEv2/OpenVPN da punto a sito non sono supportate con lo SKU Basic . Questo script usa lo SKU VpnGw1 per il gateway di rete virtuale, di conseguenza.

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

Configurare il client VPN

Il gateway di rete virtuale di Azure creerà un pacchetto scaricabile con i file di configurazione necessari per inizializzare la connessione VPN nel computer Linux locale. Lo script seguente inserirà i certificati creati nel punto corretto e configurerà il file ipsec.conf con i valori corretti del file di configurazione nel pacchetto scaricabile.

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 

Montare la condivisione file di Azure

Dopo aver configurato la VPN da punto a sito, è possibile montare la condivisione file di Azure. Vedere Montare condivisioni file SMB in Linux o montare una condivisione file NFS in Linux.

Vedi anche