你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Linux 上配置点到站点 (P2S) VPN 以与 Azure 文件存储一起使用

可以使用点到站点 (P2S) 虚拟专用网络 (VPN) 连接从 Azure 外部装载 Azure 文件共享,而无需通过开放式 Internet 发送数据。 点到站点 VPN 连接是 Azure 与单个客户端之间的 VPN 连接。 若要将 P2S VPN 连接与 Azure 文件存储结合使用,需要为每个要连接的客户端配置 P2S VPN 连接。 如果有多个客户端需要从本地网络连接到 Azure 文件共享,则可以为每个客户端使用站点到站点 (S2S) VPN 连接,而不使用点到站点连接。 若要了解详细信息,请参阅配置站点到站点 VPN 以与 Azure 文件存储一起使用

我们强烈建议先阅读 Azure 文件存储网络概述,然后再继续阅读本文,以全面探讨可用于 Azure 文件存储的网络选项。

本文详细介绍了在 Linux 上配置点到站点 VPN 以直接在本地装载 Azure 文件共享的步骤。

适用于

文件共享类型 SMB NFS
标准文件共享 (GPv2)、LRS/ZRS 是 否
标准文件共享 (GPv2)、GRS/GZRS 是 否
高级文件共享 (FileStorage)、LRS/ZRS 是 是

先决条件

  • 最新版本的 Azure CLI。 若要了解如何安装 Azure CLI,请参阅安装 Azure PowerShell CLI 并选择操作系统。 如果更想在 Linux 上使用 Azure PowerShell 模块,也是可以的。 但是,以下说明适用于 Azure CLI。

  • 要在本地装载的 Azure 文件共享。 Azure 文件共享部署在存储帐户中,是代表共享存储池的管理结构,可以在其中部署多个文件共享以及其他存储资源(例如 Blob 容器或队列)。 可以在创建 Azure 文件共享中详细了解如何部署 Azure 文件共享和存储帐户。

  • 包含要在本地装载的 Azure 文件共享的存储帐户的专用终结点。 若要了解如何创建专用终结点,请参阅配置 Azure 文件存储网络终结点

安装必需软件

Azure 虚拟网络网关可以使用多种 VPN 协议(包括 IPsec 和 OpenVPN)提供 VPN 连接。 本文介绍如何使用 IPsec 以及使用 strongSwan 包在 Linux 上提供支持。

已通过 Ubuntu 18.10 验证。

sudo apt update
sudo apt install strongswan strongswan-pki libstrongswan-extra-plugins curl libxml2-utils cifs-utils unzip

INSTALL_DIR="/etc/"

如果安装失败或收到错误(例如“不支持 EAP_IDENTITY,正在发送EAP_NAK”),则可能需要安装额外的插件:

sudo apt install -y libcharon-extra-plugins

部署虚拟网络

若要通过点到站点 VPN 从本地访问 Azure 文件共享和其他 Azure 资源,必须创建虚拟网络或 VNet。 将自动创建的 P2S VPN 连接是本地 Linux 计算机与此 Azure 虚拟网络之间的桥梁。

以下脚本将创建包含三个子网的 Azure 虚拟网络:一个用于存储帐户的服务终结点,一个用于存储帐户的专用终结点(用于访问本地存储帐户,而无需为可能更改的存储帐户的公共 IP 创建自定义传递),以及一个用于提供 VPN 服务的虚拟网络网关。

请记得将 <region><resource-group><desired-vnet-name> 替换为适合你的环境的值。

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

为 VPN 身份验证创建证书

若要对来自本地 Windows 计算机的 VPN 连接进行身份验证以访问虚拟网络,必须创建两个证书:

  • 一个提供给虚拟机网关的根证书
  • 一个使用根证书签名的客户端证书

以下脚本将创建所需的证书。

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"

部署虚拟网络网关

Azure 虚拟网络网关是本地 Linux 计算机将连接到的服务。 部署此服务需要两个基本组件:

  • 一个公共 IP 地址,可识别位于任何位置的客户端的网关
  • 之前创建的根证书,用于对客户端进行身份验证

请记得将 <desired-vpn-name-here> 替换为要为这些资源使用的名称。

注意

部署 Azure 虚拟网络网关最多需要 45 分钟。 部署此资源时,此 bash 脚本将阻止部署完成。

基本 SKU 不支持 P2S IKEv2/OpenVPN 连接。 此脚本将 VpnGw1 SKU 用于虚拟网络网关。

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

配置 VPN 客户端

Azure 虚拟网络网关将创建一个可下载的包,其中包含在本地 Linux 计算机上初始化 VPN 连接所需的配置文件。 下面的脚本会将你创建的证书放在正确的位置,并用可下载包中的配置文件中的正确值配置 ipsec.conf 文件。

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 

装载 Azure 文件共享

设置点到站点 VPN 后,现在就可以装载 Azure 文件共享。 请参阅将 SMB 文件共享装载到 Linux将 NFS 文件共享装载到 Linux

另请参阅