【问题标题】:View - but not intercept - all IPv4 traffic to Linux computer查看 - 但不拦截 - 到 Linux 计算机的所有 IPv4 流量
【发布时间】:2016-09-29 00:36:09
【问题描述】:

有没有办法查看所有发送到 Linux 计算机的 IPv4 数据包?

我知道我可以使用 libpcap 在以太网级别捕获数据包。这可以工作,但我真的不想对 IPv4 数据包进行碎片整理。 libpcap 是否提供此功能而我只是缺少它?

一种可行的方法是使用tun 设备。我可以通过ip route add default via $TUN_IP dev $TUNID 将所有流量路由到tun 设备来捕获所有IPv4 流量。不过,这也会阻止出站流量,这不是我想要的。

我只想查看 IPv4 数据包,而不是拦截它们。 (或者,更好的是,可选拦截它们。)

编辑:我正在专门寻找一个编程接口来执行此操作。例如。我可以在 C 程序中使用的东西。

【问题讨论】:

  • 您必须在自己的程序中执行此操作吗? Wireshark 可以执行 IP 重组。
  • 您可以为此使用 iptables。见:stackoverflow.com/questions/23697282/…
  • "这可行,但我并不想对 IPv4 数据包进行碎片整理。" - libpcap/tcpdump 不对流量进行碎片整理。他们甚至明确地捕获/打印片段偏移量和 DF 位。请参阅 tcpdump 手册页中的 IP Fragmentation
  • 我不想我自己对它们进行碎片整理。我希望重新组装的数据包一个接一个地呈现。见编辑:寻找编程接口
  • 我希望您知道(通常)有大量其他 IP4 流量没有路由到您的计算机,而是在同一组线路上

标签: c linux sockets networking libpcap


【解决方案1】:

是的,您可以看到到达您的网络接口的所有数据包。有几个选项可以访问或查看它们。这里列出了一些可能的解决方案,其中第一个是最简单的,最后一个是最难使用的:

Wireshark

当涉及到带有 GUI(使用 libpcap)的协议分析器时,我想说这几乎是标准。它有大量选项、漂亮的 GUI、强大的过滤功能和重组 IP 数据报。它使用 libpcap,还可以显示原始以太网帧数据。例如,它允许您查看 ARP 等第 2 层数据包。此外,您可以将到达网络接口的完整数据捕获到一个文件中,以便以后进行分析(也在 Wireshark 中)。

tcpdump

非常强大,类似于 Wireshark 的功能,但它是一个命令行实用程序,它也使用 libpcap。还可以捕获/转储完整的接口流量到文件。由于格式兼容,您可以在 Wireshark 中查看转储的数据。

ngrep

这被称为“网络 grep”,类似于 tcpdump,但支持正则表达式 (regex) 来过滤有效负载数据。它允许将捕获的数据保存为 Wireshark 和 tcpdump 支持的文件格式(也使用 libpcap)。

libnids

引用来自官方gitrepository

"Libnids 是一个提供 NIDS 功能的库 (网络入侵检测系统)组件,即E-component。它的意思是 libnids 代码监视所有本地网络流量 [...] 并提供有关它们的方便信息以 NIDS的分析模块。 Libnids 执行:

  • 将 TCP 段组装成 TCP 流
  • IP 碎片整理
  • TCP 端口扫描检测”

libpcap

当然,您也可以直接使用该库编写自己的程序。不用说,这需要更多的努力。

原始或数据包套接字

如果你想自己做所有的脏活,这是低级选项,当然也可以让你做任何你想做的事情。上面列出的工具将它们用作通用基础。原始套接字在 OSI 第 3 层运行,数据包套接字在第 2 层运行。


注意:这并不是可用工具或选项的完整列表。我敢肯定还有更多,但这些是我能想到的最常见的。

【讨论】:

  • AFAIK libpcap 仅使用以太网层,我正在寻找 IP 层。 AFAIK 原始套接字无法捕获所有 IP 层流量,只能捕获特定协议。我想避免自己重新组装 IP 数据包。我正在寻找例如一个 C 接口来执行此操作。
  • 原始套接字可以捕获所有 IP 流量,不管是什么协议。无论如何,我更新了我的答案。您正在寻找的是 libnids。它非常易于使用,您只需创建一个回调函数,注册它,库就会传入所有碎片整理的 IP 数据报。
  • 原始套接字如何做到这一点?您能否将我链接到手册页或解释如何创建这样的套接字?
  • 现在我明白你的意思了。原始套接字可以捕获所有协议,但只能捕获您在创建套接字时指定的协议。手册页在这里:man7.org/linux/man-pages/man7/raw.7.html。尽管如此,libnids 会做你想做的事。
  • 谢谢。我的最终解决方案是自己重新组装数据包:)
【解决方案2】:

从技术上讲,您必须通过 libpcap 复制收到的数据包。更具体地说,您可以做的是使用 libpcap 获取数据包,这样数据包将被阻塞,因此您需要将它们重新发送到目的地。假设您想制作防火墙或其他东西,您应该做的是有一个可以像获取包裹然后将其发送到目的地的图层,在这之间您可以复制您得到的东西进一步的过程。为了制作拦截选项,您需要创建一些预定义的规则,即违反规则的规则将不会再次发送到它们的目的地。

但这需要付出很多努力,我认为你不想为此付出生命。

@Barmar 提到的

Wire-shark 已经可以完成这项工作了。

如果您需要某种命令行界面选项,我会说“tcpdump”是最好的监控工具之一。例如,要捕获进出端口 80 的所有 ipv4 HTTP 数据包,命令将是:

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

有关更多信息和选项,请参阅tcpdump

如果您需要为其编写程序,请具体说明,然后我们可以帮助您了解如何做。

【讨论】:

  • 是的,我正在寻找一个程序接口,例如在 C 程序中,获取重新组装的 IPv4 数据包。据我所知(不远),libpcap 仅适用于以太网级别,所以这不是我想要的。
  • 好吧,我不明白你所说的 libpcap 仅适用于以太网级别的意思。我已经将它用于任何类型的数据包传输、发送、接收、处理;通过 wifi、电缆、虚拟网络等。您还需要什么?
  • 据我所知,libpcap 捕获以太网帧,而不是 IPv4 数据包。 IPv4 数据包可以跨多个以太网帧进行分段。我不想将这些片段重新组装成整个 IPv4 数据包。换句话说,我认为 libpcap 在 OSI 模型级别 2 上工作,但我想要一个到级别 3 的接口。
猜你喜欢
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多