PXE 启动:TFTP 文件传输失败

PXE 启动:TFTP 文件传输失败

我正在尝试从运行 tftpd32 的 Windows 2019 服务器进行 PXE 启动,该服务器由 CloneDeploy 1.4.0 安装。服务器的防火墙已禁用。尝试 PXE 启动 (ipxe) 时,客户端通过 DCHP 获取 IP,并能够连接到 TFTP 服务器,但随后传输超时:

TFTP.
PXE-E35
PXE-E39

此设置在疫情爆发前一直有效,但现在不再有效。我对此后可能发生的变化有些生疏。我更新了计算机的 BIOS/UEFI,但我认为这不是问题所在,因为我在 PXE 启动另一台我未曾动过的机器时遇到了同样的问题。通过多台机器上的 Intel NIC 和 QLogic NIC 启动均失败,症状和日志相同(见下文)。我更新了 pfsense 版本(运行 DHCP 服务器的单独盒子),但我不知道这会如何影响事情,因为 DHCP 方面似乎运行良好?

客户端和服务器位于同一子网,两者之间只有一个(肯定不会过载的)交换机。交换机上没有定义流量限制。

我已在本地启动了一台计算机,并尝试从该计算机进行网络启动。在此计算机上运行 TFTP 客户端时,我可以顺利下载相关文件pxeboot.0。这是失败的启动尝试的 tftpd32 日志:

Connection received from 10.0.1.76 on port 2070 [21/08 09:20:14.219]
Read request for file <pxeboot.0>. Mode octet [21/08 09:20:14.219]
OACK: <tsize=67641,> [21/08 09:20:14.219]
Using local port 60476 [21/08 09:20:14.219]
Peer returns ERROR <TFTP Aborted> -> aborting transfer [21/08 09:20:14.219]
Connection received from 10.0.1.76 on port 2071 [21/08 09:20:14.219]
Read request for file <pxeboot.0>. Mode octet [21/08 09:20:14.219]
OACK: <blksize=1456,> [21/08 09:20:14.219]
Using local port 60477 [21/08 09:20:14.219]
Ack block 1 ignored (received twice) [21/08 09:20:16.235]
TIMEOUT waiting for Ack block #2  [21/08 09:20:34.279]

下面是启动 Windows 后使用 tftp 客户端成功传输的日志(也适用于默认块大小,已将其从 OACK 中删除):

Connection received from 10.0.1.36 on port 59131 [21/08 10:19:54.213]
Read request for file <pxeboot.0>. Mode octet [21/08 10:19:54.213]
OACK: <blksize=1024,tsize=67641,> [21/08 10:19:54.213]
Using local port 49403 [21/08 10:19:54.213]
<pxeboot.0>: sent 67 blks, 67641 bytes in 0 s. 0 blk resent [21/08 10:19:54.213]

我尝试过更改 tftpd32 的设置:尝试了打开和关闭“选项协商”和“PXE 兼容性”的所有组合,但都无法解决问题。

我可以尝试什么来诊断或修复这个问题?

答案1

值得一提的是,我也能排除这是服务器的原因,当在另一台机器上安装 tftpd32 时,我遇到了同样的问题。我切换到 OpenTFTPServer,它工作正常。

答案2

我看到你已经解决了你的问题。

您说 Windows 服务器上的防火墙已禁用,但客户端或两个系统之间的某个地方可能仍有防火墙。NAT 路由器也会导致同样的问题。

TFTP 是不是防火墙友好(无论是否使用 NAT),因为它在初始协商期间仅使用端口 69。在数据传输期间,它改为使用两个都连接两端。防火墙通常会阻止此流量,因为它们无法识别响应。

为了解决这个问题,系统之间的任何防火墙(或 NAT 路由器)都必须支持 TFTP;通常需要启用 TFTP 助手。

tftpd32 和 opentftpserver 之间的区别可能在于它们在服务器端如何分配随机端口。根据标准,它应该是一个临时端口,但显然有些实现会硬编码这个随机端口。如果该硬编码端口来自不同的地址范围,客户端可能会拒绝它。

但这只是猜测。

相关内容