我目前正在为我的 Juniper 交换机堆栈而苦苦挣扎。
拓扑是这样的拓扑
堆栈上的客户端端口配置为带 dot1x(多个请求者)的标记访问,并根据 Radius 身份验证进行切换。此操作没有问题,VLAN 也得到正确分配。
2 个 PFSense 防火墙确实为故障转移配置中的每个 VLAN 提供了一个 DHCP 实例,其 CARP IP 与 VLAN 位于同一子网上。因此不需要 DHCP 中继。
Windows 客户端可以获取 IP 并正常工作,但 Linux 客户端和 PXE 启动则不能。
从 tcpdump 和 Wireshark 中,我们看到 Linux 客户端上存在 DHCP Discover/Offer 循环。Offer 到达客户端,但客户端未发送 DHCP 请求。我们尝试了多种 Linux 衍生产品和 PXE 实现,但均未成功。我们还比较了 Windows 和 Linux 的 Wireshark 捕获结果,发现两者完全没有区别。
关于如何追踪该问题有什么建议吗?
提前致谢。
更新:
只是为了添加更多信息。
IP分配流程如下:
- 客户端启动(NIC 连接到交换机堆栈)
- 交换机通过 Radius 服务器对客户端进行身份验证
- Radius 服务器回复“Accept”和 VLAN ID 940
- 交换机堆栈将 VLAN 940 分配给客户端在多请求者模式下连接的端口
- 客户端发送 DHCP Discover
- DHCP 服务器(均为 PFSense)以一个提议做出响应。
- 客户端发送 DHCP 请求
- DHCP 服务器发送 DHCP ACK
因此,显然 1-6 是有效的。客户端通过 Radius 服务器分配到 VLAN 940,发出 DHCP 发现,两个 PFSense 都为 VLAN 940(IP 范围 10.94.0.1-200/24)配置了 DHCP 实例,并且它们发送了提供。
这是 PFsense 防火墙之一上的 tcpdump,希望它有帮助。
18:55:25.538580 IP (tos 0x0, ttl 20, id 3, offset 0, flags [none], proto UDP (17), length 576)
0.0.0.0.bootpc > 255.255.255.255.bootps: [udp sum ok] BOOTP/DHCP, Request from 00:19:99:f7:3d:23 (oui Unknown), length 548, xid 0x99f73d23, secs 18, Flags [Broadcast] (0x8000)
Client-Ethernet-Address 00:19:99:f7:3d:23 (oui Unknown)
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Discover
Parameter-Request Option 55, length 36:
Subnet-Mask, Time-Zone, Default-Gateway, Time-Server
IEN-Name-Server, Domain-Name-Server, RL, Hostname
BS, Domain-Name, SS, RP
EP, RSZ, TTL, BR
YD, YS, NTP, Vendor-Option
Requested-IP, Lease-Time, Server-ID, RN
RB, Vendor-Class, TFTP, BF
Option 128, Option 129, Option 130, Option 131
Option 132, Option 133, Option 134, Option 135
MSZ Option 57, length 2: 1260
GUID Option 97, length 17: 0.72.178.216.253.99.205.17.226.190.154.221.134.53.14.178.59
ARCH Option 93, length 2: 0
NDI Option 94, length 3: 1.2.1
Vendor-Class Option 60, length 32: "PXEClient:Arch:00000:UNDI:002001"
END Option 255, length 0
PAD Option 0, length 0, occurs 200
18:55:26.546900 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 334)
10.94.0.253.bootps > 255.255.255.255.bootpc: [udp sum ok] BOOTP/DHCP, Reply, length 306, xid 0x99f73d23, secs 18, Flags [Broadcast] (0x8000)
Your-IP 10.94.0.5
Server-IP 10.91.0.1
Client-Ethernet-Address 00:19:99:f7:3d:23 (oui Unknown)
file "pxelinux.0"
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Offer
Server-ID Option 54, length 4: 10.94.0.253
Lease-Time Option 51, length 4: 600
Subnet-Mask Option 1, length 4: 255.255.255.0
Default-Gateway Option 3, length 4: 10.94.0.254
Domain-Name-Server Option 6, length 8: 10.0.2.1,10.0.2.2
Domain-Name Option 15, length 9: "domain.intra"
NTP Option 42, length 4: 10.94.0.254
TFTP Option 66, length 9: "10.91.0.1"
END Option 255, length 0
18:55:26.547180 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 334)
10.94.0.252.bootps > 255.255.255.255.bootpc: [udp sum ok] BOOTP/DHCP, Reply, length 306, xid 0x99f73d23, secs 18, Flags [Broadcast] (0x8000)
Your-IP 10.94.0.104
Server-IP 10.91.0.1
Client-Ethernet-Address 00:19:99:f7:3d:23 (oui Unknown)
file "pxelinux.0"
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Offer
Server-ID Option 54, length 4: 10.94.0.252
Lease-Time Option 51, length 4: 600
Subnet-Mask Option 1, length 4: 255.255.255.0
Default-Gateway Option 3, length 4: 10.94.0.254
Domain-Name-Server Option 6, length 8: 10.0.2.1,10.0.2.2
Domain-Name Option 15, length 9: "domain.intra"
NTP Option 42, length 4: 10.94.0.254
TFTP Option 66, length 9: "10.91.0.1"
END Option 255, length 0
客户端看到完全相同的内容,但只是忽略它。看起来不对吗?
如果我在服务器端交换机(Radius 服务器连接的地方)上对 Linux VM 执行相同操作,它就会正常工作。因此,我非常确定问题出在 Juniper 交换机堆栈的某个地方。
更新 2:
我对交换机堆栈中问题的假设是正确的。似乎“标记访问”端口模式没有按应有的方式运行。切换到“访问”端口模式确实解决了问题。但这对我来说没有多大意义,因为“访问”模式不应该能够处理不同 VLAN 中的多个请求者,但它显然可以。
答案1
许多 Linux 发行版ipconfig
在配置网络接口时使用 klibc(请注意,这与 Windows 中使用的同名工具不同)
https://kernel.googlesource.com/pub/scm/libs/klibc/klibc/+/klibc-0.130/ipconfig/README
请查看变量
-c proto
可以指定为 BOOTP 或 DHCP
我发现,根据所使用的 DHCP 服务器,DHCP 客户端会完全忽略符合要求的 DHCP 提议,但是当正确设置参数时,-c
客户端会接受该提议。
在启动 Ubuntu 时,您可以通过在内核命令行中添加IP=DHCP
或来指定此参数。在 Debian 中情况有所不同,它们将内核变量用于不同的目的,在这种情况下,您必须编辑启动 initrd 并手动更改相应脚本中的 ipconfig 行(通常是 /lib/live/boot/9990-networking.sh)。IP=BOOTP
IP