HTTP 的 BPF 是什么?

Gtk*_*ker 6 c packet-capture

定义可以在这里看到。

候选答案可能是tcp and dst port 80,但可以tcp and dst port 80保证它的HTTP流量并包括所有 HTTP 流量?

似乎不是,因为可以通过这种方式指定 80 以外的其他端口来访问某些站点:

http://domain.name:8080
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:确切的BPFHTTP什么?

更新

是否有一种实现来验证数据包是否c已经是 HTTP 数据包?

bri*_*ner 5

  • 最简单的过滤器: tcp and dst port 80
  • 许多端口(包括 SSL): tcp and (dst port 80 or dst port 8080 or dst port 443)
  • 例如,如果您只需要 HTTP GET 数据包,并且不介意您只会获得每个 GET 的第一个数据包,并且假设 GET 数据包中没有 TCP 选项,则可以过滤 TCP 以及 TCP 有效负载的事实(HTTP) 以 "GET " 开头,不带引号: tcp and tcp[20:4] = 0x47455420
  • 如果您认为可以有 TCP 选项(我很确定这对于非 SYN 数据包来说并不常见),您可以做一个更复杂的过滤器,它实际上使用 TCP 标头并检查 TCP 标头长度(而不是假设它是20): tcp and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • 所有这些过滤器的组合看起来像这样(尽管由于 GET 已加密,因此 SSL 在这里不会真正起作用): tcp and (dst port 80 or dst port 8080 or dst port 443) and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • 以类似的方式,您可以通过过滤此方法开头的字节来过滤任何 HTTP 请求方法。如果您还需要 SYN 和 SYN-ACK 数据包,则可以通过使用按位运算过滤 TCP 标志来添加它们。
  • 不幸的是,过滤所有 HTTP 流量非常困难,因为不在请求或响应中的第一个数据包很难过滤 - 任何 TCP 有效负载都可能是 HTTP 请求或响应的一部分。如果您想要所有 HTTP 流量,您可能应该只依赖端口。


Dan*_*olo 2

BPF 不是有状态的数据包过滤器,因此 BPF 无法检测到非标准 HTTP 端口上的任何流量。BPF 在传输层而不是应用层进行过滤,因此它只关心 TCP/IP,而不关心 TCP/IP 数据包中封装的应用数据。最好的选择是过滤常见的 HTTP 端口 80、8000 和 8080。如果您还想考虑 HTTPS,也可以过滤 443。