Configurare una VPN da punto a sito (P2S) in Linux da usare con File di Azure
È possibile usare una connessione VPN (Virtual Private Network) 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 configurare una connessione VPN da punto a sito per ogni client che vuole connettersi. Se si hanno molti client che devono connettersi alle condivisioni file di Azure dalla rete locale, è possibile usare una connessione VPN da sito a sito anziché una connessione da punto a sito per ogni client. Per altre informazioni, vedere Configurare una VPN da sito a sito da usare con File di Azure.
È consigliabile leggere File di Azure panoramica della rete prima di continuare con questo articolo per una descrizione completa delle opzioni di rete disponibili per File di Azure.
L'articolo illustra in dettaglio 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 | ||
Condivisioni file Standard (GPv2), archiviazione con ridondanza geografica/archiviazione con ridondanza geografica della zona | ||
Condivisioni file Premium (FileStorage), archiviazione con ridondanza locale/archiviazione con ridondanza della zona |
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 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 dai computer Linux locali per accedere alla rete virtuale, è necessario creare due certificati:
- Un certificato radice, che verrà fornito al gateway della macchina virtuale
- 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 ai client ovunque si trovino nel mondo
- 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.
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.