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

Você pode usar uma conexão VPN Ponto a Site (P2S) para montar seus compartilhamentos de arquivos do Azure de fora do Azure, sem enviar dados pela 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 Arquivos do Azure, uma conexão VPN P2S precisará ser configurada para cada cliente que deseja se conectar. Se você tiver muitos clientes que precisam se conectar aos compartilhamentos de arquivos do Azure a partir de sua rede local, poderá usar uma conexão VPN Site a Site (S2S) em vez de uma conexão Ponto a Site para cada cliente. Para saber mais, consulte Configurar uma VPN Site a Site para uso com Arquivos do Azure.

É altamente recomendável que você leia a visão geral de rede dos Arquivos do Azure antes de continuar com este artigo sobre como obter uma discussão completa das opções de rede disponíveis para os Arquivos do Azure.

O artigo detalha as etapas para configurar uma VPN Ponto a Site no Linux para montar compartilhamentos de arquivos do Azure diretamente no local.

Aplica-se a

Tipo de partilhas de ficheiros SMB NFS
Partilhas de ficheiros Standard (GPv2), LRS/ZRS Yes No
Partilhas de ficheiros Standard (GPv2), GRS/GZRS Yes No
Partilhas de ficheiros 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, consulte Instalar a CLI do Azure PowerShell e selecione 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 localmente. Os compartilhamentos de arquivos do Azure são implantados em contas de armazenamento, que são construções de gerenciamento que representam um pool compartilhado de armazenamento no qual você pode implantar vários compartilhamentos de arquivos, bem como outros recursos de armazenamento, como contêineres de blob ou filas. Você pode saber mais sobre como implantar compartilhamentos de arquivos e contas de armazenamento do Azure em Criar um compartilhamento de arquivos do Azure.

  • Um ponto de extremidade privado para a conta de armazenamento que contém o compartilhamento de arquivos do Azure que você deseja montar localmente. Para saber como criar um ponto de extremidade privado, consulte Configurando pontos de extremidade de rede dos 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 fornecer o suporte no Linux.

Verificado com 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 não suportado, enviando EAP_NAK, talvez seja necessário instalar plug-ins extras:

sudo apt install -y libcharon-extra-plugins

Implantar uma rede virtual

Para acessar seu compartilhamento de arquivos do Azure e outros recursos do Azure no local por meio de uma VPN Ponto a Site, você deve criar uma rede virtual ou VNet. A conexão VPN P2S que você criará automaticamente é uma ponte entre sua máquina 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ço da sua conta de armazenamento, uma para o ponto de extremidade privado da sua conta de armazenamento, que é necessária para acessar a conta de armazenamento local sem criar roteamento personalizado para o IP público da conta de armazenamento que pode ser alterada, e um para seu gateway de rede virtual que fornece o serviço VPN.

Lembre-se de substituir <region>, <resource-group>e <desired-vnet-name> com os valores apropriados para o 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 VPN

Para que as conexões VPN de suas máquinas Linux locais sejam autenticadas para acessar sua rede virtual, você deve criar dois certificados: um certificado raiz, que será fornecido ao gateway da máquina virtual, e um certificado de 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 gateway de rede virtual

O gateway de rede virtual do Azure é o serviço ao qual suas máquinas Linux locais se conectarão. A implantação desse serviço requer dois componentes básicos: um IP público que identificará o gateway para seus clientes onde quer que eles estejam no mundo e um certificado raiz criado anteriormente que será usado para autenticar seus clientes.

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

Nota

A implantação do gateway de rede virtual do Azure pode levar até 45 minutos. Enquanto esse recurso estiver sendo implantado, esse script bash bloqueará para que a implantação seja concluída.

As conexões P2S IKEv2/OpenVPN não são suportadas com o Basic SKU. Este 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 para download com os arquivos de configuração necessários para inicializar a conexão VPN em sua máquina Linux local. O script a seguir colocará os certificados criados no local correto e configurará o ipsec.conf arquivo com os valores corretos do arquivo de configuração no pacote para download.

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 

Monte o compartilhamento de arquivos do Azure

Agora que você configurou sua VPN Ponto a Site, pode montar seu compartilhamento de arquivos do Azure. Consulte Montar compartilhamentos de arquivos SMB para Linux ou Montar compartilhamento de arquivos NFS para Linux.

Consulte também