适用于: IoT Edge 1.5
IoT Edge 1.4
重要
IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是较低的版本,请参阅更新 IoT Edge。
如果在环境中使用 Azure IoT Edge for Linux on Windows (EFLOW) 时遇到网络问题,请使用本文作为故障排除和诊断的指南。 此外,请查看对 IoT Edge for Linux on Windows 设备进行故障排除以获取更多 EFLOW 虚拟机故障排除帮助。
隔离问题
对 IoT Edge for Linux on Windows 网络进行故障排除时,应注意四种可能导致问题的网络功能:
- IP 地址配置
- 域名系统 (DNS) 配置
- 防火墙和端口配置
- 其他组件
有关 EFLOW 网络概念的详细信息,请参阅 IoT Edge for Linux on Windows 网络。 有关 EFLOW 网络配置的详细信息,请参阅 Azure IoT Edge for Linux on Windows 的网络配置。
单击 IP 地址
对 IoT Edge for Linux on Windows 网络进行故障排除时,第一步应该是检查 VM IP 地址配置。 如果 IP 通信配置不正确,则所有入站和出站连接都会失败。
- 使用“以管理员身份运行”,启动提升的 PowerShell 会话。
- 检查 VM 生命周期代理返回的 IP 地址。 记下此 IP 地址,并在后续步骤中将其与从 VM 内部获取的 IP 地址进行比较。
Get-EflowVmAddr
- 连接到 EFLOW 虚拟机。
Connect-EflowVm
- 检查 eth0 VM 网络接口配置。
在输出中,应会看到 eth0 配置信息。 确保正确设置 inet 地址。ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.31.100.171 netmask 255.255.240.0 broadcast 172.31.111.255 inet6 fe80::215:5dff:fe2a:2f62 prefixlen 64 scopeid 0x20<link> ether 00:15:5d:2a:2f:62 txqueuelen 1000 (Ethernet) RX packets 115746 bytes 11579209 (11.0 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 976 bytes 154184 (150.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果 inet IP 地址为空或不同于使用 Get-EflowVmAddr
cmdlet 获得的地址,则需要排查 EFLOW VM 分配无效或未分配 IP 地址的原因。 使用下表排查问题:
虚拟交换机 | IP 地址分配 | 疑难解答 |
---|---|---|
外部 | 静态 IP | 确保正确设置 IP 配置。 应使用 ip4Address、ip4GateWayAddress 和 ip4PrefixLength 这三个参数。 分配给 VM 的 IP 地址应有效,并且未被外部网络上的其他设备使用。 可检查 /etc/systemd/network/ 下的文件来检查 EFLOW VM 接口配置。 |
外部 | DHCP | 确保外部网络上有 DHCP 服务器。 如果没有 DHCP 服务器,请使用静态 IP 配置。 此外,请确保 DHCP 服务器没有有关 MAC 地址的防火墙策略。 如果有,可以使用 Get-EflowVmAddr cmdlet 获取 EFLOW MAC 地址。 |
默认交换机 | DHCP | 通常,此问题与默认开关故障相关。 请尝试重新启动 Windows 主机 OS。 如果问题仍然存在,请尝试禁用和启用 Hyper-V |
内部 | 静态 IP | 确保正确设置 IP 配置。 应使用 ip4Address、ip4GateWayAddress 和 ip4PrefixLength 这三个参数。 分配给 VM 的 IP 地址应有效,并且没有被内部网络上的其他设备使用。 此外,若要连接到 Internet,需要设置 NAT 表。 请遵循“创建 Azure IoT Edge for Linux on Windows 虚拟交换机”中的 NAT 配置步骤 |
内部 | DHCP | 确保内部网络上存在 DHCP 服务器。 若要在 Windows Server 上设置 DHCP 服务器和 NAT 表,请按照“创建 Azure IoT Edge for Linux on Windows 虚拟交换机”的步骤操作 |
警告
在某些情况下,如果在 Windows Server 或客户端 VM 上使用外部虚拟交换机,则可能需要一些额外的配置。 有关嵌套虚拟化配置的详细信息,请参阅 Azure IoT Edge for Linux on Windows 的嵌套式虚拟化。
如果 IP 地址分配出现问题,请尝试设置另一个 Windows 或 Linux 虚拟机并分配相同的交换机和 IP 配置。 如果新的非 EFLOW VM 存在相同的问题,则虚拟交换机或 IP 配置可能会出现问题,并且它不特定于 EFLOW。
检查域名系统 (DNS) 配置
对 IoT Edge for Linux on Windows 网络进行故障排除时,第二步应该是检查分配给 EFLOW VM 的 DNS 服务器。 若要查看 EFLOW VM DNS 配置,请参阅 Azure IoT Edge for Linux on Windows 网络配置。 如果地址解决有效,则此问题可能与网络上的防火墙或安全配置有关。
EFLOW VM 使用系统解析的服务来管理 DNS 解析。 有关此服务的详细信息,请参阅系统解析。 若要设置特定的 DNS 服务器地址,可以使用 Set-EflowVmDnsServers
cmdlet。 如果需要进一步了解 DNS 配置信息,可以通过 sudo systemctl status systemd-resolved
命令查看 /etc/systemd/resolve.conf 和 system-resolved 服务。 此外,可以将特定 DNS 服务器设置为模块配置的一部分,请参阅选项 2:在每个模块 IoT Edge 部署中设置 DNS 服务器。
由于多种原因,地址解析可能会失败。 第一个问题就是可以正确配置 DNS 服务器,但无法从 EFLOW VM 访问它们。 如果 DNS 服务器响应 ICMP ping 流量,可以尝试对 DNS 服务器执行 ping 操作以检查网络连接。
- 使用“以管理员身份运行”,启动提升的 PowerShell 会话。
- 连接到 EFLOW 虚拟机。
Connect-EflowVm
- 对 DNS 服务器地址执行 ping 操作并检查响应。
ping <DNS-Server-IP-Address>
提示
如果服务器可访问,应会收到响应,并且问题可能与其他 DNS 服务器配置相关。 如果没有响应,则可能存在服务器连接问题。
其次,某些网络环境将 DNS 服务器的访问权限限制为特定的允许列表地址。 如果是这样,请先确保可以从 Windows 主机 OS 访问 DNS 服务器,然后向网络团队确认是否需要将 EFLOW IP 地址添加到允许列表。
最后,某些网络环境将阻止公共 DNS 服务器。 如果是这样,请与网络环境团队沟通以确定有效的 DNS 服务器,然后使用 Set-EflowVmDnsServers
cmdlet 对其进行设置。
检查防火墙和端口配置规则
Azure IoT Edge for Linux on Windows 可让你使用支持的 Azure IoT 中心协议,从本地服务器与 Azure 云进行通信。 有关 IoT 中心协议的详细信息,请参阅选择通信协议。 有关 IoT 中心防火墙和端口配置的详细信息,请参阅对 IoT Edge 设备进行故障排除。
IoT Edge for Linux on Windows 仍依赖于基础 Windows 主机 OS 和网络配置。 因此,必须确保设置适当的网络和防火墙规则来保护 Edge 与云之间的通信。 为托管 Azure IoT Edge for Linux on Windows 运行时的底层服务器配置防火墙规则时,可参考下表中的指导:
协议 | 端口 | 传入 | 传出 | 指南 |
---|---|---|---|---|
MQTT | 8883 | 阻止(默认) | 阻止(默认) | 使用 MQTT 作为通信协议时,请将传出(出站)端口配置为“打开”。 IoT Edge 不支持将端口 1883 用于 MQTT。 - 应阻止传入(入站)连接。 |
AMQP | 5671 | 阻止(默认) | 打开(默认) | IoT Edge 的默认通信协议。 如果未为其他支持的协议配置 Azure IoT Edge,或者 AMQP 是所需的通信协议,则必须将此端口配置为“打开”。 IoT Edge 不支持将端口 5672 用于 AMQP。 当 Azure IoT Edge 使用不同的受 IoT 中心支持的协议时,请阻止此端口。 应阻止传入(入站)连接。 |
HTTPS | 443 | 阻止(默认) | 打开(默认) | 将传出(出站)配置为在端口 443 上打开以进行 IoT Edge 预配。 使用手动脚本或 Azure IoT 设备预配服务 (DPS) 时,此配置是必需的。 只应针对特定的两个方案打开传入(入站)连接: 1. 如果你有一个透明网关,其中的下游设备会发送方法请求。 则无需向外部网络打开端口 443,即可连接到 IoT 中心或通过 Azure IoT Edge 提供 IoT 中心服务。 因此,传入规则可限制为只能从内部网络打开传入(入站)连接。 2. 适用于客户端到设备 (C2D) 的方案。 IoT Edge 不支持将端口 80 用于 HTTP。 如果无法在企业中配置非 HTTP 协议(例如 AMQP 或 MQTT),消息可通过 WebSocket 发送。 在这种情况下,将使用端口 443 进行 WebSocket 通信。 |
注意
如果使用外部虚拟交换机,请确保为 EFLOW 虚拟机内使用的模块端口映射添加相应的防火墙规则。
有关 EFLOW 虚拟机防火墙的更多信息,请参见 IoT Edge For Linux on Windows 安全性。 若要检查 EFLOW 虚拟机规则,请使用以下步骤:
- 使用“以管理员身份运行”,启动提升的 PowerShell 会话。
- 连接到 EFLOW 虚拟机。
Connect-EflowVm
- 列出 iptables 防火墙规则。
sudo iptables -L
若要将防火墙规则添加到 EFLOW VM,可以使用 EFLOW Util - 防火墙规则 示例 PowerShell cmdlet。 此外,还可以按照以下步骤创建相同的规则:
- 使用“以管理员身份运行”,启动提升的 PowerShell 会话。
- 连接到 EFLOW 虚拟机
Connect-EflowVm
- 添加防火墙规则以接受 <protocol>(udp 或 tcp)流量的 <port> 的传入流量。
sudo iptables -A INPUT -p <protocol> --dport <port> -j ACCEPT
- 最后,保留规则,以便在每个 VM 启动时重新创建它们
sudo iptables-save | sudo tee /etc/systemd/scripts/ip4save
检查其他配置
网络通信可能失败的原因有多种。 以下部分仅列出用户过去遇到的几个问题。
EFLOW 虚拟机不响应 ping(ICMP 流量)请求。
默认情况下,EFLOW VM 防火墙上禁用 ICMP ping 流量响应。 若要响应 ping 请求,请使用以下 PowerShell cmdlet 以允许 ICMP 流量:
Invoke-EflowVmCommand "sudo iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT"
使用多播流量发现设备失败。
首先,若要使用多播发现设备,必须将 Hyper-V VM 配置为使用外部交换机。 其次,必须将 IoT Edge 自定义模块配置为利用容器创建选项使用主机网络:
{ "HostConfig": { "NetworkMode": "host" }, "NetworkingConfig": { "EndpointsConfig": { "host": {} } } }
添加了防火墙规则,但流量仍无法访问 IoT Edge 模块。
如果在添加适当的防火墙规则后仍然无法通信,请尝试完全禁用防火墙以进行故障排除。
sudo iptables -F sudo iptables -X sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT
完成后,重新启动 VM(
Stop-EflowVm
和Start-EflowVm
)将 EFLOW VM 防火墙恢复正常状态。使用多个 NIC 时无法连接到 Internet。
通常,此问题与路由问题相关。 请参阅如何配置 Azure IoT Edge for Linux on Windows 工业 IoT 和 DMZ 配置以设置静态路由。
后续步骤
认为在 IoT Edge 平台中发现了 bug? 提交问题,以便我们可以持续改进。
如果你还有其他问题,请创建支持请求以获取帮助。