Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
可以使用点到站点虚拟专用网络(VPN)连接从 Azure 外部装载 Azure 文件共享,而无需通过开放 Internet 发送数据。 点到站点 VPN 连接是 Azure 与单个客户端计算机之间的 VPN 连接。 若要对 Azure 文件存储使用点到站点 VPN 连接,需要为每个要连接的客户端计算机配置点到站点 VPN 连接。 如果有许多客户端计算机需要从本地网络连接到 Azure 文件共享,则可以使用站点到站点 VPN 连接,而不是每个客户端计算机的点到站点连接。 若要了解详细信息,请参阅配置站点到站点 VPN 以与 Azure 文件存储一起使用。
有关 Azure 文件存储可用的网络选项的完整讨论,请参阅 Azure 文件网络概述。
本文详细介绍了在 Linux 上配置点到站点 VPN 以直接在本地装载 Azure 文件共享的步骤。
适用于
| 管理模型 | 计费模式 | 媒体层 | 冗余 | SMB | NFS |
|---|---|---|---|---|---|
| Microsoft.Storage | 预配 v2 | HDD(标准) | 本地 (LRS) |
|
|
| Microsoft.Storage | 预配 v2 | HDD(标准) | 区域 (ZRS) |
|
|
| Microsoft.Storage | 预配 v2 | HDD(标准) | 异地 (GRS) |
|
|
| Microsoft.Storage | 预配 v2 | HDD(标准) | GeoZone (GZRS) |
|
|
| Microsoft.Storage | 预配版本 v1 | SSD(高级) | 本地 (LRS) |
|
|
| Microsoft.Storage | 预配版本 v1 | SSD(高级) | 区域 (ZRS) |
|
|
| Microsoft.Storage | 即用即付 | HDD(标准) | 本地 (LRS) |
|
|
| Microsoft.Storage | 即用即付 | HDD(标准) | 区域 (ZRS) |
|
|
| Microsoft.Storage | 即用即付 | HDD(标准) | 异地 (GRS) |
|
|
| Microsoft.Storage | 即用即付 | HDD(标准) | GeoZone (GZRS) |
|
|
先决条件
最新版本的 Azure CLI。 有关如何安装 Azure CLI 的信息,请参阅 安装 Azure CLI 并选择操作系统。 可以改用 Linux 上的 Azure PowerShell 模块,但本文中的说明适用于 Azure CLI。
要在本地装载的 Azure 文件共享。 Azure 文件共享部署在存储帐户中,这些存储帐户是管理构造,表示可在其中部署多个文件共享的共享存储池。 可以在创建 Azure 文件共享中详细了解如何部署 Azure 文件共享和存储帐户。
包含要在本地装载的 Azure 文件共享的存储帐户的专用终结点。 若要了解如何创建专用终结点,请参阅配置 Azure 文件存储网络终结点。
安装必需软件
Azure 虚拟网络网关可以使用多种 VPN 协议(包括 IPsec 和 OpenVPN)提供 VPN 连接。 本文介绍如何使用 IPsec 以及使用 strongSwan 包在 Linux 上提供支持。
注释
这些说明在 Ubuntu 18.10 上进行了测试,应在 Ubuntu 18.04 LTS 及更高版本以及 Debian 10+ 上运行。 支持 strongSwan(如 Fedora、CentOS 或 openSUSE)的其他分发版可能需要不同的包名称或安装命令。
# For Ubuntu/Debian-based distributions (Ubuntu 18.04+, Debian 10+)
sudo apt update
sudo apt install strongswan strongswan-pki libstrongswan-extra-plugins curl libxml2-utils cifs-utils unzip
如果安装失败或收到错误,例如 EAP_IDENTITY not supported, sending EAP_NAK,可能需要安装额外的插件:
sudo apt install -y libcharon-extra-plugins
部署虚拟网络
若要通过点到站点 VPN 从本地访问 Azure 文件共享和其他 Azure 资源,必须创建虚拟网络。 站点到点 VPN 连接在您的本地 Linux 客户端计算机和 Azure 虚拟网络之间建立一个安全的隧道。
以下脚本创建一个包含三个子网的 Azure 虚拟网络:一个用于存储帐户的服务终结点,一个用于存储帐户的专用终结点,这是访问本地存储帐户所需的,而无需为可能会更改的存储帐户的公共 IP 创建自定义路由,另一个用于提供 VPN 服务的虚拟网络网关。
# Variables - replace <region>, <resource-group>, and <desired-vnet-name> with your values
REGION="<region>"
RESOURCE_GROUP_NAME="<resource-group>"
VIRTUAL_NETWORK_NAME="<desired-vnet-name>"
创建虚拟网络:
# Requires: REGION, RESOURCE_GROUP_NAME, VIRTUAL_NETWORK_NAME defined above
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 '"')
为服务终结点、专用终结点和网关创建子网:
# Requires: RESOURCE_GROUP_NAME, VIRTUAL_NETWORK_NAME defined above
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 '"')
验证: 运行 az network vnet subnet list --resource-group $RESOURCE_GROUP_NAME --vnet-name $VIRTUAL_NETWORK_NAME --output table 并确认显示三个子网: ServiceEndpointSubnet、 PrivateEndpointSubnet和 GatewaySubnet。
为 VPN 身份验证创建证书
若要使来自本地 Linux 客户端计算机的 VPN 连接通过虚拟网络网关进行身份验证,必须创建两个证书:
- 提供给虚拟机网关的根证书
- 客户端证书,该证书使用根证书进行签名,并安装在每台客户端计算机上
设置证书变量并创建工作目录:
# Variables
ROOT_CERT_NAME="P2SRootCert"
USERNAME="client" # Client certificate identity (not a machine login)
PASSWORD="1234" # Password for the client certificate PKCS#12 file
mkdir temp
cd temp
生成根证书:
# Requires: ROOT_CERT_NAME defined above; run from temp directory
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)
生成由根证书签名的客户端证书:
# Requires: USERNAME, PASSWORD defined; rootCert.pem and rootKey.pem from previous step
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"
验证:运行ls -la *.pem client.p12并确认存在五个文件:rootKey.pem、、rootCert.pemclientKey.pem、clientCert.pem和client.p12。
部署虚拟网络网关
Azure 虚拟网络网关是本地 Linux 客户端计算机连接到的服务。 部署此服务需要两个组件:
- 用于标识客户端计算机网关的公共 IP 地址。
- 之前创建的根证书,该证书使用其客户端证书对客户端计算机进行身份验证。
注释
部署 Azure 虚拟网络网关最多需要 45 分钟。 部署此资源时,此脚本会阻止部署完成。
Basic 网关 SKU 不支持 IKEv2/OpenVPN 点到站点连接。 此脚本将 VpnGw1 SKU 用于虚拟网络网关,这是 IKEv2 连接所需的最低 SKU。 公共 IP 地址可以使用 基本 SKU 进行动态分配。
# Variables - replace <desired-vpn-name-here> with your value
VPN_NAME="<desired-vpn-name-here>"
PUBLIC_IP_ADDR_NAME="$VPN_NAME-PublicIP"
为网关创建公共 IP 地址:
# Requires: RESOURCE_GROUP_NAME, REGION from 'Deploy a virtual network'; VPN_NAME, PUBLIC_IP_ADDR_NAME defined above
# Note: Basic SKU with dynamic allocation is sufficient for the public IP; the gateway SKU (VpnGw1) is what matters for IKEv2 support
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 '"')
创建虚拟网络网关:
# Requires: RESOURCE_GROUP_NAME, REGION, VIRTUAL_NETWORK_NAME from 'Deploy a virtual network'; VPN_NAME, PUBLIC_IP_ADDR defined above
# Note: VpnGw1 is the minimum SKU required for IKEv2/OpenVPN; Basic SKU doesn't support point-to-site IKEv2
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-type "Vpn" \
--vpn-type "RouteBased" \
--address-prefixes "172.16.201.0/24" \
--client-protocol "IkeV2" > /dev/null
将根证书上传到网关:
# Requires: RESOURCE_GROUP_NAME from 'Deploy a virtual network'; VPN_NAME defined above; ROOT_CERT_NAME, ROOT_CERTIFICATE from 'Create certificates'
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
验证: 运行 az network vnet-gateway show --resource-group $RESOURCE_GROUP_NAME --name $VPN_NAME --query "provisioningState" 并确认输出为 "Succeeded"。
配置 VPN 客户端
Azure 虚拟网络网关创建一个可下载的包,其中包含初始化本地 Linux 客户端计算机上的 VPN 连接所需的配置文件。 以下脚本将客户端证书复制到 strongSwan 证书目录(/etc/ipsec.d/),并使用下载的配置包中的值配置 ipsec.conf 文件。
# Requires: RESOURCE_GROUP_NAME from 'Deploy a virtual network'; VPN_NAME from 'Deploy virtual network gateway'
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 配置值:
# Requires: vpnClient.zip extracted in current directory
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)
将证书复制到 strongSwan 目录:
# Requires: USERNAME from 'Create certificates'; client.p12 (client certificate) from temp directory
INSTALL_DIR="/etc/"
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"
配置 IPsec 连接:
# Requires: VIRTUAL_NETWORK_NAME from 'Deploy a virtual network'; VPN_SERVER, VPN_TYPE, ROUTES extracted above; INSTALL_DIR defined above
sudo tee -a "${INSTALL_DIR}ipsec.conf" <<EOF
conn $VIRTUAL_NETWORK_NAME
keyexchange=$VPN_TYPE
type=tunnel
leftfirewall=yes
left=%any
leftauth=eap-tls
leftid=%client
right=$VPN_SERVER
rightid=%$VPN_SERVER
rightsubnet=$ROUTES
leftsourceip=%config
auto=add
EOF
配置 IPsec 机密并启动 VPN 连接:
# Requires: PASSWORD from 'Create certificates'; INSTALL_DIR, VIRTUAL_NETWORK_NAME defined above
echo ": P12 client.p12 '$PASSWORD'" | sudo tee -a "${INSTALL_DIR}ipsec.secrets" > /dev/null
sudo ipsec restart
sudo ipsec up $VIRTUAL_NETWORK_NAME
验证: 运行 sudo ipsec status 并确认输出显示 ESTABLISHED 用于命名为虚拟网络的连接。
装载 Azure 文件共享
设置点到站点 VPN 后,可以装载 Azure 文件共享。 请参阅将 SMB 文件共享装载到 Linux 或将 NFS 文件共享装载到 Linux。
验证: 运行 df -h | grep <mount-point> (将 <mount-point> 替换为你的装载路径),并确认 Azure 文件共享显示为预期的大小。