我使用tcprewrite修改了一个pcap,以设置源和目标IP = 127.0.0.1,而端口号不同。我还将两个MAC地址设置为00:00:00:00:00:00 :00,因为我理解本地主机上的通信忽略mac。我确保校验和是固定的。
当我在一个shell中运行tcpreplay -i lo test-lo.pcap,在另一个shell中运行tcpdump -i lo -p udp port 50001时,我会看到流量。然而,当我试图用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呢?
发布于 2021-04-08 20:35:16
我之所以问这个问题,是因为我自己的UDP侦听器代码也与netcat有同样的问题,并且认为我可能遗漏了一些东西。为什么tcpdump和wireshark会看到流量,而不是netcat呢?
查看维基百科内核数据包流的这幅图像:

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

正如您所看到的,为了到达本地进程套接字,包必须在内核中通过一系列步骤。这些步骤包括桥接、路由、过滤等。哪一步丢弃您的数据包?我不知道。你可以试着调整包,也许你会幸运的。
如果您想要一种更系统的方法,可以使用像落差表这样的工具。它会连接到内核中,并显示内核丢弃数据包的位置。
https://stackoverflow.com/questions/66991199
复制相似问题