You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Scapy编写简易DHCP服务器:发送DHCP OFFER包遇阻求助

解决Scapy DHCP OFFER包发送失败的问题

嘿,我看你在用Scapy写极简DHCP服务器时卡在OFFER包发送环节了,咱们来揪出代码里的几个关键问题,帮你搞定它!

先说说你代码里的核心问题

  1. BOOTP字段配置错误

    • yiaddr是要分配给客户端的IP地址,你现在填的dest_addr大概率不对——客户端发起DISCOVER时还没有IP,所以这里应该填你打算分配给它的那个IP,而不是客户端的地址。
    • chaddr需要是6字节的二进制MAC地址,如果你的client_mac是字符串格式(比如"aa:bb:cc:dd:ee:ff"),得先转成字节:bytes.fromhex(client_mac.replace(":", "")),不然Scapy没法正确解析。
  2. DHCP选项配置错误

    • server_id必须是DHCP服务器自身的IP(也就是你的srv_ip),你现在填成dest_addr了,客户端收到OFFER后找不到服务器,自然没法继续后续流程。
    • DHCP选项列表必须以("end", "")结尾,这是DHCP协议要求的,Scapy有时候会因为缺少这个标记导致包解析异常。
  3. 发送环节的细节遗漏

    • sendp需要指定发送接口(比如iface="eth0"或者你实际用的网卡名),不然Scapy可能会选错接口,导致包发不出去。
    • 如果客户端是通过广播发送DISCOVER的,IP层的dst应该设为广播地址"255.255.255.255",而不是某个特定的dest_addr——毕竟客户端此时还没有IP,只能接收广播包。

修正后的代码示例

# 先处理MAC地址格式(如果是字符串的话)
client_mac_bytes = bytes.fromhex(client_mac.replace(":", ""))
# 要分配给客户端的IP(比如192.168.1.100,根据你的网段调整)
assigned_ip = "192.168.1.100"

# 重新构建各层包
ethernet = Ether(dst=dest_mac, src=hw, type=0x800)
# 客户端无IP,IP层用广播地址
ip = IP(dst="255.255.255.255", src=srv_ip)
udp = UDP(sport=67, dport=68)
bootp = BOOTP(op=2, yiaddr=assigned_ip, siaddr=srv_ip, chaddr=client_mac_bytes)
dhcp = DHCP(options=[
    ("message-type", "offer"),
    ("server_id", srv_ip),
    ("broadcast_address", broadcast),
    ("router", gateway),
    ("subnet_mask", netmask),
    ("end", "")  # 必须添加的DHCP选项结束标记
])

of_pack = ethernet/ip/udp/bootp/dhcp
# 指定网卡发送,verbose=1可以看到发送日志
sendp(of_pack, iface="你的网卡接口名", verbose=1)

额外调试建议

  • 用of_pack.show()打印包的详细结构,检查各字段是否符合DHCP协议规范。
  • 用Wireshark或者Scapy的sniff函数抓包,确认OFFER包是否真的发送出去了,以及格式是否正确。

内容的提问来源于stack exchange,提问作者kekyc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:27:21