【问题标题】:WFP filter: Raw TCP packets dropped when sent via FwpsInjectNetworkSendAsyncWFP 过滤器:通过 FwpsInjectNetworkSendAsync 发送时丢弃的原始 TCP 数据包
【发布时间】:2014-05-04 19:30:25
【问题描述】:

我在 FWPM_LAYER_OUTBOUND_IPPACKET_V4 注册了一个内核 WFP 过滤器,在其中我将每个 IPv4 NET_BUFFER_LIST 复制到一个缓冲区,并从工作线程中重新注入它而不进行修改。我使用 FWPM_SUBLAYER_UNIVERSAL 作为子层。基本上:

mdl = IoAllocateMdl(buffer, ...)
MmBuildMdlForNonPagedPool(mdl);
FwpsAllocateNetBufferAndNetBufferList0(..., mdl, ..., &nbl)
FwpsInjectNetworkSendAsync0(..., nbl, ...)

从 sendComplete 回调中返回 0 以及 NET_BUFFER_LIST_STATUS()。

这适用于 UDP 和 ICMP(我收到回复),但不适用于 TCP 数据包。我可以从我正在测试的虚拟机中看到 SYN 在 NetMon 中发出,但 NetMon 没有看到外部数据包(在主机中)。当然,远程主机也没有回复。

我尝试更新 IP 校验和(我在分类 Fn 中得到 0)并且它没有改变任何东西。当我的classifyFn 收到TCP 校验和时(据NetMon 所知),TCP 校验和已经正确。我查看了原始的nbl,我的平面缓冲区和WinDBG中新创建的nbl,它们都包含IP数据包(以0x45等开头)。

我必须为过滤器创建一个新的子层吗?是否因为我从与系统进程关联的工作线程调用 sendAsync 而丢弃了数据包?

【问题讨论】:

    标签: networking tcp driver wfp


    【解决方案1】:

    回答我自己的问题:显然在重新注入数据包之前更新所有校验和(包括 tcp/udp)可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      相关资源
      最近更新 更多