首页 > 解决方案 > 使用 netcat 在 localhost 中看不到 tcpreplay 流量

问题描述

我有一个使用 tcprewrite 修改的 pcap 文件,以设置源 IP 和目标 IP = 127.0.0.1,而端口号不同。我还将两个 MAC 地址都设置为 00:00:00:00:00:00,因为我知道 localhost 上的通信会忽略 MAC。我确保校验和是固定的。

当我tcpreplay -i lo test-lo.pcap在一个 shell 和tcpdump -i lo -p udp port 50001另一个 shell 中运行时,我看到了流量。然而,当我尝试使用 来查看流量时netcat -l -u 50001,它什么也看不到。Wireshark 正在正确捕获流量。

旁注:在本地主机上运行 tcpreplay 时,我看到以下警告: Warning: Unsupported physical layer type 0x0304 on lo. Maybe it works, maybe it won't. See tickets #123/318这似乎令人担忧。

我问是因为我自己的 UDP 侦听器代码也有与 netcat 相同的问题,并认为我可能遗漏了一些东西。为什么 tcpdump 和 wireshark 会看到流量,而 netcat 看不到流量?

标签: udpnetcattcpreplay

解决方案


我问是因为我自己的 UDP 侦听器代码也有与 netcat 相同的问题,并认为我可能遗漏了一些东西。为什么 tcpdump 和 wireshark 会看到流量,而 netcat 看不到流量?

查看来自维基百科的内核数据包流的图像:

在此处输入图像描述

如您所见,路径上有不同的地方可以访问数据包。Wireshark 使用libpcap,它使用AF_PACKET套接字来查看数据包。您的 UDP 侦听器(如 netcat)使用常规用户空间套接字。让我们在这张图片上突出显示两者。Wireshark 通过红色路径获取数据包,netcat 通过紫色路径获取数据包:

在此处输入图像描述

如您所见,数据包必须在内核中经过一系列步骤才能到达本地进程套接字。这些步骤包括桥接、路由、过滤等。哪个步骤会丢弃您的数据包?我不知道。您可以尝试调整数据包,也许您会很幸运。

如果您想要更系统的方法,请使用dropwatch 之类的工具。它连接到内核并向您显示内核丢弃数据包的计数器。


推荐阅读