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

标签 c linux sockets networking libpcap

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

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

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

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

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

最佳答案

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

Wireshark

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

tcpdump

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

ngrep

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

libnids

引用自官方git repository :

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

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

libpcap

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

原始或数据包套接字

如果你想自己做所有脏活,这是低级选项,当然它也允许你做你想做的一切。上面列出的工具使用它们作为共同基础。原始套接字在 OSI 第 3 层上运行,而数据包套接字在第 2 层上运行。


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

关于c - 查看(但不拦截)到 Linux 计算机的所有 IPv4 流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39759620/

相关文章:

java - 套接字关闭错误

javascript - 什么时候可以断开套接字客户端

使用C计算直线的平均长度

c - C语言中结构体的指针

python - 为什么 Python 运行时以这种方式处理警告?

c - 有没有比使用 backtrace() 更便宜的方法来查找调用堆栈的深度?

python - 使用 Python TAP 设备嗅探 ICMP 数据包(例如 ping echo 请求)

c++ - 我如何才能加速此代码(MWE!),例如使用限制

c - Linux 终端输入/输出 C 程序

linux - 使用 awk 反转字段