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

如何在 DMZ 上配置 Azure IoT Edge for Linux on Windows

适用于:IoT Edge 1.4 复选标记IoT Edge 1.4

重要

Azure IoT Edge 1.5 LTS 和 IoT Edge 1.4 是受支持的版本。 IoT Edge 1.4 LTS 将于 2024 年 11 月 12 日终止服务。 如果你使用的是较低的版本,请参阅更新 IoT Edge

本文介绍如何配置 Azure IoT Edge for Linux (EFLOW) 虚拟机 (VM) 以支持多个网络接口卡 (NIC) 并连接到多个网络。 通过启用多个 NIC 支持,EFLOW VM 上运行的应用程序可以与连接到脱机网络的设备进行通信,同时使用 IoT Edge 将数据发送到云。

先决条件

工业方案

工业 IoT 正在跨越信息技术 (IT) 和运营技术 (OT) 融合的时代。 然而,利用 IT 技术使传统的 OT 资产更加智能也意味着更容易遭受网络攻击。 这种情形是使用外围网络(也称为 DMZ)设计多个环境的主要原因之一。

假设有一个工作流方案,其网络配置分为两个不同的网络或区域。 在第一个区域中,你可能将一个安全网络定义为脱机网络。 脱机网络没有 Internet 连接,仅限内部访问。 在第二个区域中,可能有一个外围安全区域 (DMZ),其中可能有几个 Internet 连接受限的设备。 当移动工作流以在 EFLOW VM 上运行时,可能无法访问不同的网络,因为默认情况下 EFLOW VM 仅附加一个 NIC。

在此方案中,你的环境中有一些设备(如可编程逻辑控制器 (PLC) 或开放平台通信统一体系结构 (OPC UA) 兼容设备)连接到脱机网络,并且你想要使用 EFLOW VM 上运行的 OPC 发布服务器模块将所有设备信息上传到 Azure。

由于 EFLOW 主机设备和 PLC 或 OPC UA 设备以物理方式连接到脱机网络,因此可以使用 Azure IoT Edge for Linux on Windows 虚拟多 NIC 配置将 EFLOW VM 连接到脱机网络。 通过使用外部虚拟交换机,可以将 EFLOW VM 连接到脱机网络并直接与其他脱机设备通信。

对于另一个网络,EFLOW 主机设备通过 Internet 和 Azure 连接以物理方式连接到 DMZ(联机网络)。 通过使用内部或外部交换机,可以使用 IoT Edge 模块将 EFLOW VM 连接到 Azure IoT 中心,并通过脱机 NIC 上传脱机设备发送的信息。

EFLOW 工业 IoT 方案的屏幕截图,其中显示了连接到脱机和联机网络的 EFLOW 虚拟机。

方案摘要

安全网络:

  • 不与 Internet 连接 - 且访问受限。
  • 已连接 PLC 或 UPC UA 兼容设备。
  • 使用外部虚拟交换机连接 EFLOW VM。

DMZ:

  • Internet 连接 - 允许 Azure 连接。
  • EFLOW VM 使用内部/外部虚拟交换机连接到 Azure IoT 中心。
  • OPC 发布服务器作为 EFLOW VM 中的模块运行,用于将数据发布到 Azure。

配置 VM 网络虚拟交换机

以下步骤特定于示例方案中描述的网络。 请确保所使用的虚拟交换机和配置与你的网络环境相符。

注意

本文中的步骤假设 EFLOW VM 部署了一个连接到安全网络(脱机)的外部虚拟交换机。 可以将以下步骤更改为想要实现的特定网络配置。 有关 EFLOW 多 NIC 支持的详细信息,请参阅 Azure IoT Edge for Linux on Windows 虚拟多 NIC 配置

为了完成 EFLOW VM 的预配并与 Azure 通信,你需要分配另一个连接到 DMZ 网络(联机)的 NIC。

对于此方案,你将分配连接到 DMZ 网络的外部虚拟交换机。 有关详细信息,请查看为 Hyper-V 虚拟机创建虚拟交换机

若要创建外部虚拟交换机,请执行以下步骤:

  1. 打开 Hyper-V 管理器。
  2. 在“操作”中,选择“虚拟交换机管理器”。
  3. 在“虚拟交换机”中,选择“新建虚拟网络交换机”。
  4. 选择类型“外部”,然后选择“创建虚拟交换机”。
  5. 输入一个表示安全网络的名称。 例如 OnlineOPCUA。
  6. 在“连接类型”下,选择“外部网络”,然后选择连接到 DMZ 网络的网络适配器。
  7. 选择“应用”。

创建外部虚拟交换机后,需要按以下步骤将其附加到 EFLOW VM。 如果需要附加多个 NIC,请参阅 EFLOW 多个 NIC

对于创建的自定义的新外部虚拟交换机,使用以下 PowerShell 命令:

  1. 将交换机附加到 EFLOW VM。

    Add-EflowNetwork -vswitchName "OnlineOPCUA" -vswitchType "External"
    

    屏幕截图显示了名为 OnlineOPCUA 的外部网络的成功创建。

  2. 设置静态 IP。

    Add-EflowVmEndpoint -vswitchName "OnlineOPCUA" -vEndpointName "OnlineEndpoint" -ip4Address 192.168.0.103 -ip4PrefixLength 24 -ip4GatewayAddress 192.168.0.1
    

    屏幕截图显示了 OnlineOPCUA 交换机的成功配置。

完成后,将 OnlineOPCUA 交换机分配给 EFLOW VM。 若要检查多个 NIC 连接,请执行以下步骤:

  1. 首先以管理员身份运行,打开提升的 PowerShell 会话。

  2. 连接到 EFLOW 虚拟机。

    Connect-EflowVm
    
  3. 进入 VM 后,列出分配给 EFLOW 虚拟机的所有网络接口。

    ifconfig
    
  4. 查看 IP 配置并确认是否显示 eth0 接口(连接到安全网络)和 eth1 接口(连接到 DMZ 网络)。

    屏幕截图显示了连接到两个不同网络的多个 NIC 的 IP 配置。

配置 VM 网络路由

使用 EFLOW 多 NIC 功能时,可能需要设置不同的路由优先级。 默认情况下,EFLOW 将为每个分配给 VM 的 ehtX 接口创建一个默认路由。 EFLOW 将为默认路由分配一个随机优先级。 如果所有接口都连接到 Internet,则随机优先级可能不是问题。 但是,如果其中一个 NIC 连接到脱机网络,则可能需要使联机 NIC 优先于脱机 NIC,以便将 EFLOW VM 连接到 Internet。

EFLOW 使用路由服务来管理网络路由替代项。 若要检查可用的 EFLOW VM 路由,请执行以下步骤:

  1. 首先以管理员身份运行,打开提升的 PowerShell 会话。

  2. 连接到 EFLOW 虚拟机。

    Connect-EflowVm
    
  3. 进入 VM 后,列出 EFLOW 虚拟机中配置的所有网络路由。

    sudo route
    

    屏幕截图显示了 EFLOW 虚拟机的路由表。

    提示

    上图显示了分配的两个 NIC(eth0 和 eth1)的路由命令输出。 虚拟机使用不同的指标创建两个不同的默认目标规则。 较低的指标值具有较高的优先级。 此路由表因前面步骤中配置的网络方案而异。

静态路由配置

每次启动 EFLOW VM 时,网络服务都会重新创建所有路由,先前分配的任何优先级都可能发生变化。 若要解决此问题,可以在每次启动 EFLOW VM 时为每个路由分配所需的优先级。 你可以创建一个服务,该服务在每次启动 VM 时执行,并使用 route 命令设置所需的路由优先级。

首先,创建一个 bash 脚本,该脚本将执行必要的命令来设置路由。 例如,按照前面提到的网络方案,EFLOW VM 有两个 NIC(脱机和联机网络)。 NIC eth0 使用网关 IP xxx.xxx.xxx.xxx 连接。 NIC eth1 使用网关 IP yyy.yyy.yyy.yyy 连接。

以下脚本将重置 eth0 和 *eth1 的默认路由,然后添加具有所需 <number> 指标的路由。 请记住,较低的指标值具有较高的优先级。

#!/bin/sh

# Wait 30s for the interfaces to be up
sleep 30

# Delete previous eth0 route and create a new one with desired metric
sudo ip route del default via xxx.xxx.xxx.xxx dev eth0
sudo route add -net default gw xxx.xxx.xxx.xxx netmask 0.0.0.0 dev eth0 metric <number>

# Delete previous eth1 route and create a new one with desired metric
sudo ip route del default via yyy.yyy.yyy.yyy dev eth1
sudo route add -net default gw yyy.yyy.yyy.yyy netmask 0.0.0.0 dev eth1 metric <number>

你可以使用前面的脚本来创建自己的特定于网络方案的自定义脚本。 定义脚本后,保存它并分配执行权限。 例如,如果脚本名称是 route-setup.sh,可以使用命令 sudo chmod +x route-setup.sh 分配执行权限。 可以通过使用命令 sudo sh ./route-setup.sh 手动执行脚本,然后使用 sudo route 命令检查路由表来测试脚本是否正常工作。

最后一步是创建 Linux 服务,该服务将在启动时运行并执行 bash 脚本来设置路由。 必须创建 systemd 单元文件来加载该服务。 以下是该文件的示例。

[Unit]
after=network

[Service]
Type=simple
ExecStart=/bin/bash /home/iotedge-user/route-setup.sh

[Install]
WantedBy=default.target

若要检查服务是否正常运行,请重启 EFLOW VM(Stop-EflowVmStart-EflowVm),然后使用 Connect-EflowVm 连接到该 VM。 使用 sudo route 列出路由并验证其是否正确。 你应该能够看到具有分配指标的新的默认规则。

后续步骤

按照如何为 Azure IoT Edge for Linux on Windows 配置网络中的步骤,验证是否已正确应用网络配置。