有没有办法查看发送到 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/