Configurar uma VPN P2S (Ponto a Site) no Linux para usar com os Arquivos do Azure

Você pode usar uma conexão de VPN P2S (ponto a site) para montar compartilhamentos de arquivo do Azure de fora do Azure, sem enviar dados sobre internet aberta. Uma conexão VPN Ponto a Site é uma conexão VPN entre o Azure e um cliente individual. Para usar uma conexão VPN P2S com os Arquivos do Azure, será preciso configurar uma conexão VPN P2S para cada cliente que desejar se conectar. Se muitos clientes precisarem se conectar aos seus compartilhamentos de arquivo do Azure de suas redes locais, você poderá usar uma VPN S2S (Site a Site) em vez de uma conexão ponto a site para cada um deles. Para saber mais, confira Configurar uma VPN Site a Site para usar com os Arquivos do Azure.

Recomendamos que você leia Visão geral da rede nos Arquivos do Azure antes de continuar este tutorial para ver uma discussão completa a respeito das opções de rede disponíveis para os Arquivos do Azure.

O artigo detalha as etapas de configuração de uma VPN Ponto a Site no Linux para montar compartilhamentos de arquivo do Azure diretamente no local.

Aplica-se a

Tipo de compartilhamento de arquivos SMB NFS
Compartilhamentos de arquivos padrão (GPv2), LRS/ZRS Yes No
Compartilhamentos de arquivos padrão (GPv2), GRS/GZRS Yes No
Compartilhamento de arquivos premium (FileStorage), LRS/ZRS Yes Yes

Pré-requisitos

  • A versão mais recente da CLI do Azure. Para obter informações sobre como instalar a CLI do Azure, confira Instalar a CLI do Azure PowerShell e escolha seu sistema operacional. Se preferir usar o módulo do Azure PowerShell no Linux, você pode. No entanto, as instruções abaixo são para a CLI do Azure.

  • Um compartilhamento de arquivos do Azure que você gostaria de montar no local. Os compartilhamentos de arquivo do Azure são implantados em contas de armazenamento, que são constructos de gerenciamento que representam um pool compartilhado de armazenamento no qual você pode implantar vários compartilhamentos de arquivo bem como outros recursos de armazenamento, como filas ou contêineres de blobs. Você pode aprender mais sobre como implantar compartilhamentos de arquivo do Azure e contas de armazenamento em Criar um compartilhamento de arquivo do Azure.

  • Um ponto de extremidade privado para a conta de armazenamento contendo o compartilhamento de arquivo do Azure que você deseja montar localmente. Para saber como criar um ponto de extremidade privado, confira Configuração de pontos de extremidades de rede do serviço Arquivos do Azure.

Instalar o software necessário

O gateway de rede virtual do Azure pode fornecer conexões VPN usando vários protocolos VPN, incluindo IPsec e OpenVPN. Este artigo mostra como usar o IPsec e usa o pacote strongSwan para dar suporte no Linux.

Verificado com o 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 a instalação falhar ou você receber um erro como EAP_IDENTITY sem suporte, enviando EAP_NAK, talvez seja necessário instalar plug-ins extras:

sudo apt install -y libcharon-extra-plugins

Implantar uma rede virtual

Para acessar o compartilhamento de arquivo do Azure e outros recursos do Azure do local por meio de uma VPN ponto a site, você precisa criar uma rede virtual ou VNet. A conexão VPN P2S que você criará automaticamente é uma ponte entre seu computador Linux local e essa rede virtual do Azure.

O script a seguir criará uma rede virtual do Azure com três sub-redes: uma para o ponto de extremidade de serviços de sua conta de armazenamento, uma para o ponto de extremidade privado de sua conta de armazenamento – que é necessária para acessar a conta de armazenamento local sem criar um roteamento personalizado para o IP público dessa conta de armazenamento que pode ser alterada – e outra para o gateway de rede virtual que fornece o serviço de VPN.

Lembre-se de substituir <region>, <resource-group>, e <desired-vnet-name> pelos valores adequados para seu 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 '"')

Criar certificados para autenticação da VPN

Para que as conexões VPN de seus computadores Linux locais sejam autenticadas e acessem sua rede virtual, você precisa criar dois certificados: um certificado raiz, que será fornecido para o gateway da máquina virtual, e um certificado do cliente, que será assinado com o certificado raiz. O script a seguir cria os certificados necessários.

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"

Implantar o gateway de rede virtual

O gateway de rede virtual do Azure é o serviço ao qual os computadores Linux locais serão conectados. Implantar esse serviço requer dois componentes básicos: um IP público que identificará o gateway para seus clientes em qualquer lugar do mundo e um certificado raiz criado previamente que será usado para autenticar seus clientes.

Lembre-se de substituir <desired-vpn-name-here> pelo nome que você deseja para esses recursos.

Observação

Implantar o gateway de rede virtual do Azure pode levar até 45 minutos. Para que a implantação seja concluída, este script de bash será bloqueado durante a implantação do recurso.

Não há suporte para conexões P2S IKEv2/OpenVPN com o SKU Básico. Esse script usa o SKU VpnGw1 para o gateway de rede virtual, de acordo.

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

Configurar o cliente VPN

O gateway de rede virtual do Azure criará um pacote que poderá ser baixado contendo os arquivos de configuração necessários para iniciar a conexão VPN em seu computador Linux local. O script a seguir coloca os certificados que você criou no local correto e configura o arquivo ipsec.conf com os valores corretos do arquivo de configuração no pacote baixável.

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 

Montar o compartilhamento de arquivo do Azure

Agora que configurou sua VPN Ponto a Site, você pode montar o compartilhamento de arquivo do Azure. Confira Montar compartilhamentos de arquivos SMB no Linux ou Montar compartilhamento de arquivos NFS no Linux.

Confira também