基于Scapy编写简易DHCP服务器:发送DHCP OFFER包遇阻求助
解决Scapy DHCP OFFER包发送失败的问题
嘿,我看你在用Scapy写极简DHCP服务器时卡在OFFER包发送环节了,咱们来揪出代码里的几个关键问题,帮你搞定它!
先说说你代码里的核心问题
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没法正确解析。
DHCP选项配置错误
server_id必须是DHCP服务器自身的IP(也就是你的srv_ip),你现在填成dest_addr了,客户端收到OFFER后找不到服务器,自然没法继续后续流程。- DHCP选项列表必须以
("end", "")结尾,这是DHCP协议要求的,Scapy有时候会因为缺少这个标记导致包解析异常。
发送环节的细节遗漏
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
相关产品推荐
相关产品推荐

