Azure IoT 中心通过新的设备和服务终结点支持 TLS 1.3。 作为这一变化的一部分,每个物联网枢纽除了默认主机名外,都会暴露两个额外的主机名:
| 终结点 | Hostname |
|---|---|
| 默认 | <your-hub>.azure-devices.net |
| 服务 | <your-hub>.service.azure-devices.net |
| Device | <your-hub>.device.azure-devices.net |
如果你通过私有端点(Azure 专用链接)访问物联网中枢,这两个新主机名也必须解析到虚拟网络中的私有IP地址。 对于大多数配置,这种解析是自动完成的, 无需操作。 在两种特定情况下,你不能自动将新主机名添加到现有的私有端点。 您必须手动操作以解除通过TLS 1.3的私人连接屏蔽:
- 如果你的私有端点使用 静态 IP 分配,你可以通过重新配置现有的私有端点来添加这两个新端点,而无需删除和重新创建它。
- 如果 子网已满,你必须先释放地址空间,然后重新创建私有端点。
本文将解释谁受到影响,如何检查你的私有端点是否缺少新主机名,以及如何修复。
受影响的人
只有当以下 两个 条件都成立时,你才需要采取行动:
- 你通过 私有端点访问你的物联网中枢。
- 私有端点处于以下状态之一:
- 子网满了。 托管私有端点的子网中已无剩余的空闲私有IP地址,因此Azure无法为新服务和设备主机名分配所需的IP地址。
- 私有端点使用静态IP分配。 当你静态地为私有端点分配私有IP地址时,新添加的成员(服务和设备主机名)不会自动包含,也不会获得IP地址。
注释
公共(非专用链接)物联网枢纽不受影响。 新主机名可通过公共 DNS 自动解析。
Symptoms
当私有端点缺少新主机名时,虚拟网络内的客户端可能会经历:
- 连接到
<your-hub>.service.azure-devices.net或<your-hub>.device.azure-devices.net时出现连接失败或 DNS 解析失败。 - 当私有DNS配置为将流量保留在私有端点时,两个新主机名会解析为公 网 IP地址(或根本不解析),而不是预期的私有IP地址。
默认主机名(<your-hub>.azure-devices.net)依然有效。
步骤1:检查你的私有端点是否缺少新的主机名
在重建任何东西之前,先确认服务和设备主机名是否存在于你的私有终端上。
使用 Azure 门户
如果你使用 Azure 私有 DNS 区域作为 专用链接,请检查哪些主机名已注册:
- 在 Azure 门户中,打开 privatelink.azure-devices.net 与你的私人终端相关联的私有DNS区域。
- 确认以下每个名称都有一个A 记录:
-
<your-hub>—— 默认端点 -
<your-hub>.service——服务端点 -
<your-hub>.device——设备端点
-
如果 <your-hub>.service 缺少 OR <your-hub>.device 记录,则私有端点缺少 TLS 1.3 端点,需要更新或重建。
使用Azure CLI
注释
使用 --name 和 --resource-group 的命令会针对你的 活动订阅 运行。 如果你的集线器或私有终端属于不同的订阅,请先用 az account set --subscription <subscription-id>选择它。
首先,列出物联网中心现在专用链接所需的成员。 名单包括新的服务和设备成员:
az network private-link-resource list \
--id "/subscriptions/<subscription-id>/resourceGroups/<hub-rg>/providers/Microsoft.Devices/IotHubs/<your-hub>" \
--query "[].properties.requiredMembers" -o json
输出包括诸如 iotHub、iotHubService 和 iotHubDevice 等成员。
接下来,列出实际在私有端点上配置的成员。 这些成员位于终端的网络接口上,因此无论终端使用 静态 IP还是 动态 IP分配,这种检查都适用:
az network nic show \
--ids "$(az network private-endpoint show --name <private-endpoint-name> --resource-group <private-endpoint-rg> --query 'networkInterfaces[0].id' -o tsv)" \
--query "ipConfigurations[].privateLinkConnectionProperties.requiredMemberName" -o json
将结果与所需成员进行比较。 如果 不 包含 iotHubService 和 iotHubDevice,私有端点就缺少 TLS 1.3 端点,需要更新或重建。
注释
不要用私有端点 ipConfigurations 来做这个检查。 该列表仅包含 静态 IP 配置,对于使用动态 IP 分配的终端则是空白的。
第二步:选择如何修复
这两个修复方案都需要在私有端点的子网中有可用的私有 IP 地址——两个新端点各需要一个。 两种方式都行。 根据你能带来多大的破坏性来选择:
- 选项A——原地重新配置(仅限静态IP分配)。 如果你的私有端点使用静态 IP 分配,添加 新端点 但不删除。 这个选项干扰最小。
- 选项B——重建(适用于任何私有端点)。删除并重建 私有端点。 当终端使用动态IP分配、子网满员,或者你希望干净重建时,使用这个选项。 它也适用于静态IP端点。
Important
在私有端点(或其他资源)部署在子网中时 ,你无法调整 子网的地址范围大小。 为了腾出满子网空间,可以释放该子网中未使用的IP地址,或者在有空闲地址的其他子网中重建私有端点。
选项A:将新端点添加到你的私有端点
当你的私有端点使用 静态 IP 分配且子网至少有两个空闲 IP 地址时,可以使用这个选项。 无需删除。
首先,收集终端当前设置——其位置、子网、网络接口名称、连接名称以及现有的IP配置(成员及其静态IP):
az network private-endpoint show \
--name <private-endpoint-name> \
--resource-group <private-endpoint-rg> \
--query "{location:location, subnet:subnet.id, nic:networkInterfaces[0].id, connectionName:privateLinkServiceConnections[0].name, ipConfigs:ipConfigurations[].{name:name, groupId:groupId, memberName:memberName, ip:privateIPAddress}}" -o json
在下一个命令中,对 subnet 使用 --subnet 的值,对 nic 使用 --nic-name ID 的最后一段。
重新配置该端点,使其包含 all 成员——包含 ipConfigs 中的每个条目,并分别为 iotHubService 和 iotHubDevice 各添加一个条目,使用该子网中的两个空闲 IP 地址:
az network private-endpoint create \
--name <private-endpoint-name> \
--resource-group <private-endpoint-rg> \
--location <existing-location> \
--nic-name <existing-nic-name> \
--subnet <subnet-id> \
--private-connection-resource-id "/subscriptions/<subscription-id>/resourceGroups/<hub-rg>/providers/Microsoft.Devices/IotHubs/<your-hub>" \
--group-id iotHub \
--connection-name <existing-connection-name> \
--ip-configs "[{name:<iothub-config-name>,group-id:iotHub,member-name:iotHub,private-ip-address:<existing-iothub-ip>},{name:<eventhub-config-name>,group-id:iotHub,member-name:eventHub,private-ip-address:<existing-eventhub-ip>},{name:iotHubServiceMN,group-id:iotHub,member-name:iotHubService,private-ip-address:<free-ip-1>},{name:iotHubDeviceMN,group-id:iotHub,member-name:iotHubDevice,private-ip-address:<free-ip-2>}]"
为私有端点已有的每个成员(例如iotHubeventHub和)添加条目——省略一个则会移除。
<free-ip-1> 和 <free-ip-2> 的值必须是子网范围内未使用的地址。 私有端点重新配置后,私有DNS区域组会自动注册新的A记录。 继续 验证修复方法。
选项B:重建私有端点
该选项适用于 任何 私有端点,无论使用静态或动态 IP 分配。 当你的端点使用动态 IP 分配、子网已满(在腾出地址空间后),或者你希望进行一次全新重建时,请使用它。 当私有端点全新创建时,Azure会为所有当前成员(包括服务端点和设备端点)预留私有IP地址。
Important
删除并重建私有端点会导致受影响的物联网集线器短暂中断私有连接。 在计划性维护窗口内完成这些步骤。
使用 Azure 门户
- 打开你现有的物联网中枢私有端点,记录其配置:资源组、虚拟网络、子网、目标子资源()
iotHub以及私有DNS区域组(和privatelink.azure-devices.netprivatelink.servicebus.chinacloudapi.cn区域)。 - 删除 现有的私有端点。
- 创建一个新的私有端点:
- 搜索 私有端点 并选择 创建。
- 在 资源中,选择你的物联网枢纽和
iotHub目标子资源。 - 在虚拟网络中,选择拥有空闲地址的子网。 使用 动态 IP 分配,除非你有特定理由分配静态 IP(如果有,请包含服务成员和设备成员的地址)。
- 在DNS上,与私有DNS区域集成
privatelink.azure-devices.netprivatelink.servicebus.chinacloudapi.cn,确保所有主机名自动注册。 - 查看和创建。
使用Azure CLI
# 1. Delete the existing private endpoint
az network private-endpoint delete \
--name <private-endpoint-name> \
--resource-group <private-endpoint-rg>
# 2. Recreate it against the IoT hub 'iotHub' subresource
az network private-endpoint create \
--name <private-endpoint-name> \
--resource-group <private-endpoint-rg> \
--location <region> \
--vnet-name <vnet-name> \
--subnet <subnet-with-free-addresses> \
--private-connection-resource-id "/subscriptions/<subscription-id>/resourceGroups/<hub-rg>/providers/Microsoft.Devices/IotHubs/<your-hub>" \
--group-id iotHub \
--connection-name <connection-name>
# 3. Re-link the private DNS zones so the hostnames register
az network private-endpoint dns-zone-group create \
--resource-group <private-endpoint-rg> \
--endpoint-name <private-endpoint-name> \
--name default \
--private-dns-zone <privatelink-azure-devices-net-zone-resource-id> \
--zone-name privatelink-azure-devices-net
az network private-endpoint dns-zone-group add \
--resource-group <private-endpoint-rg> \
--endpoint-name <private-endpoint-name> \
--name default \
--private-dns-zone <privatelink-servicebus-windows-net-zone-resource-id> \
--zone-name privatelink-servicebus-windows-net
注释
重建的端点采用 动态 IP分配。 要保持静态分配,请在--ip-configs命令中添加create,并为每个成员(包括iotHubService和iotHubDevice)添加一个条目,如选项 A所示。
验证修复
重复 第一步的检查。 私有端点现在应列出所有三个主机名,每个主机名都有私有IP地址:
<your-hub>.azure-devices.net<your-hub>.service.azure-devices.net<your-hub>.device.azure-devices.net
在虚拟网络内的客户端上,确认服务和设备的主机名是否解析为 私有 IP 地址,并且连接可通过 TLS 1.3 成功建立。