什么是HTTP的BPF?

这个定义可以在这里看到。

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

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

 http://domain.name:8080 

所以我的问题是:什么是HTTP的确切BPF

UPDATE

是否有实现来validation数据包是否已经是c的HTTP?

HTTP没有确切的BPF,因为HTTP不是链路层协议。 执行此操作的最佳方法是选择可能是HTTP的任何流量,然后在应用程序中validation该流量。 您必须将TCP段拼接在一起才能这样做,因为来自流中间的特定TCP段中的数据不表示应用层协议。

  • 最简单的filter: 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数据包不常见),你可以做一个更复杂的filter,它实际上使用TCP头并检查TCP头长度(而不是假设它是20): tcp and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • 所有这些filter的组合看起来都是这样的(虽然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流量,您应该单独依赖端口。

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

Wireshark在解码数据包方面做得不错,并在适当的时候将HTTP标记为HTTP。