HTTP 的 BPF 是什么?

发布于 2024-08-31 02:56:07 字数 467 浏览 8 评论 0原文

可以在此处查看定义。

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

似乎不是,因为某些网站可以通过指定 80 以外的不同端口来访问:

http://domain.name:8080

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

更新

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

The definition can be seen here.

The candidate answer may be tcp and dst port 80,but can tcp and dst port 80 guarantee it's HTTP traffic and includes all HTTP traffic?

It seems not,because some site can be visited by specifying a different port other than 80 this way:

http://domain.name:8080

So my question is: what's the exact BPF for HTTP?

UPDATE

Is there an implementation to verify whether a packet is a HTTP one in c already?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

翻身的咸鱼 2024-09-07 02:56:07
  • 最简单的过滤器:tcp 和 dst 端口 80
  • 许多端口(包括 SSL):tcp 和(dst 端口 80 或 dst 端口 8080 或 dst 端口 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
  • 所有这些过滤器的组合看起来像这样(尽管 SSL 在这里不起作用,因为 GET 已加密):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 流量,您可能应该单独依赖端口。
  • Simplest filter: tcp and dst port 80
  • Many ports (including SSL): tcp and (dst port 80 or dst port 8080 or dst port 443)
  • If you want only HTTP GET packets for example, and don't mind that you will only get the first packet of every GET and you assume there are no TCP options in the GET packets, you can filter TCP and the fact that the TCP payload (HTTP) starts with "GET " without the quotes: tcp and tcp[20:4] = 0x47455420
  • If you think there can be TCP options (I'm pretty sure it's not that common for non SYN packets), you can do a more complex filter, which actually uses the TCP header and checks for the TCP header length (instead of assuming it's 20): tcp and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • A combination of all these filters would look like that (though SSL won't really work here since the GET is encrypted): tcp and (dst port 80 or dst port 8080 or dst port 443) and tcp[(tcp[12] >> 4) * 4 : 4] = 0x47455420
  • In a similar manner, you can filter any HTTP request method by filtering the bytes that this method starts with. If you want also the SYN and SYN-ACK packets, you add them by filtering the TCP flags using bitwise operations.
  • Unfortunately, filtering all HTTP traffic is pretty hard since a packet that isn't in the first in the request or response is pretty hard to filter - any TCP payload can be part of an HTTP request or response. If you want all HTTP traffic, you should probably rely on ports alone.
岁月静好 2024-09-07 02:56:07

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

There's no exact BPF for HTTP, because HTTP is not a link-layer protocol. The best way to do this is to choose any traffic that appears likely to be HTTP, and then verify that in your application. You will have to stitch together TCP segments to do so, as data in a particular TCP segment from the middle of a stream does not indicate the application-layer protocol.

伤痕我心 2024-09-07 02:56:07

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

BPF is not a stateful packet filter and so any traffic that is on non-standard HTTP ports won't be detectable with BPF. BPF filters at the transport layer and not the application layer, so it just cares about TCP/IP, not the application data encapsulated within TCP/IP packets. Your best bet is to filter on common HTTP ports, 80, 8000, and 8080. Also 443 if you want to account for HTTPS as well.

何时共饮酒 2024-09-07 02:56:07

Wireshark 在解码数据包并在适当的情况下将其标记为 HTTP 方面做得不错。

Wireshark does a decent job of decoding packets and labeling them HTTP where appropriate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文