查看 - 但不拦截 - Linux 计算机的所有 IPv4 流量

View - but not intercept - all IPv4 traffic to Linux computer

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

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

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

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

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

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

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

Wire-shark as mentioned by @Barmar can do the job already.

If you need some kind of command line interface option I would say that "tcpdump" is one of the best monitoring tools. for example for capturing all ipv4 HTTP packets to and from port 80 the command will be:

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

for more information and options see tcpdump

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

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

Wireshark

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

tcpdump

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

ngrep

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

libnids

官方语录gitrepository:

"Libnids 是一个提供 NIDS 之一功能的库 (Network Intrusion Detection System)组件,即E组件。它的意思是 libnids 代码监视所有本地网络流量 [...] 并提供有关它们的方便信息 分析NIDS的模块。 Libnids 执行:

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

libpcap

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

原始或数据包套接字

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


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