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

使用Scapy为DHCP Offer报文添加DNS服务器IP选项失败求助

问题原因与解决方案

你的问题出在DHCP选项的"end"标记位置上。DHCP协议规定,"end"(代码255)是选项列表的终止符,Scapy在解析和生成DHCP报文时,会忽略这个终止符之后的所有选项。你先在options里加入了"end",之后再插入DNS选项,自然不会被包含到最终的报文里。

修复方法

方法1:直接在初始options列表中添加DNS选项

构建DHCP层时,把DNS服务器选项放在"end"之前,这是最直接的方式:

offer = Ether(src=get_if_hwaddr(conf.iface), dst=client_mac)/ \
    IP(src="192.168.1.1", dst=random_ip)/ \
    UDP(sport=67, dport=68)/ \
    BOOTP(op=2, yiaddr=random_ip, siaddr="192.168.1.1", giaddr="0.0.0.0", xid=pkt[BOOTP].xid)/ \
    DHCP(options=[("message-type", "offer"),
                   ("subnet_mask", "255.255.255.0"),
                   ("router", "192.168.1.1"),
                   ("lease_time", 86400),
                   ("domain_name_server", domain_ip),  # 将DNS选项放在end之前
                   "end"])

方法2:动态插入到end之前(适合后续修改场景)

如果必须用insert方法,不要依赖固定索引(索引可能随选项数量变化),而是找到"end"元素的位置,插入到它前面:

# 先构建不含DNS的初始报文
offer = Ether(src=get_if_hwaddr(conf.iface), dst=client_mac)/ \
    IP(src="192.168.1.1", dst=random_ip)/ \
    UDP(sport=67, dport=68)/ \
    BOOTP(op=2, yiaddr=random_ip, siaddr="192.168.1.1", giaddr="0.0.0.0", xid=pkt[BOOTP].xid)/ \
    DHCP(options=[("message-type", "offer"),
                   ("subnet_mask", "255.255.255.0"),
                   ("router", "192.168.1.1"),
                   ("lease_time", 86400),
                   "end"])
# 找到end选项的位置并插入DNS选项
end_index = next(i for i, opt in enumerate(offer[DHCP].options) if opt == "end")
offer[DHCP].options.insert(end_index, ("domain_name_server", domain_ip))

额外提示

  • 修复后执行print(offer[DHCP]),就能看到DNS选项的内容了;
  • 你的domain_ip是随机生成的,建议可以固定该IP,或者在分配客户端IP时排除它,避免出现IP冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:32:22