我需要从 Linux 机器上的所有网络接口(interface)捕获数据包。
为此,我计划使用 pcap_open_live()
API 并将“any”作为设备参数传递。
我有不同类型的端口:以太网端口(例如 eth0)和 GRE 隧道(例如 tun0) 来自不同类型接口(interface)的数据包具有不同的 header 格式:
- 来自以太网端口的数据包具有 MAC header
- 来自隧道的数据包带有 Linux“熟”捕获封装(16 字节) header
我如何检查 pcap_loop()
回调处理程序我得到了哪种类型的数据包头?
最佳答案
您收到的所有数据包都具有相同类型的数据包 header ;这就是您在 pcap_t 上调用 pcap_datalink()
时得到的类型。 pcap_datalink()
返回的值是 DLT_
值,如 Link-Layer Header Types 中所示。 tcpdump.org 网站上的页面。
如果您打开了任何
设备,pcap_datalink()
将返回DLT_LINUX_SLL
,这意味着ALL您捕获的数据包将具有“熟化”捕获 header - 即使是来自 eth0
的数据包!您必须在 eth0
而不是 any
上捕获这些数据包的以太网 header 。
关于linux - libpcap - 从所有接口(interface)捕获数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8995741/