udp - 使用 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 看不到流量?
解决方案
我问是因为我自己的 UDP 侦听器代码也有与 netcat 相同的问题,并认为我可能遗漏了一些东西。为什么 tcpdump 和 wireshark 会看到流量,而 netcat 看不到流量?
查看来自维基百科的内核数据包流的图像:
如您所见,路径上有不同的地方可以访问数据包。Wireshark 使用libpcap
,它使用AF_PACKET
套接字来查看数据包。您的 UDP 侦听器(如 netcat)使用常规用户空间套接字。让我们在这张图片上突出显示两者。Wireshark 通过红色路径获取数据包,netcat 通过紫色路径获取数据包:
如您所见,数据包必须在内核中经过一系列步骤才能到达本地进程套接字。这些步骤包括桥接、路由、过滤等。哪个步骤会丢弃您的数据包?我不知道。您可以尝试调整数据包,也许您会很幸运。
如果您想要更系统的方法,请使用dropwatch 之类的工具。它连接到内核并向您显示内核丢弃数据包的计数器。
推荐阅读
- regex - vbscript 正则表达式,在两个字符串之间替换
- c++ - 按值返回 std::array
- python - 如何将matplotlib的plt对象函数传递给python中的另一个方法?
- java - 休眠一对多映射 DataIntegrityViolationException
- javascript - SAPUI5 将数据从一个视图传递到另一个视图
- python-3.x - 如何在执行期间更改 Python 脚本的工作目录?
- laravel - 如何在 Laravel 中重定向到贝宝?
- excel - VBA Excel:调用函数的参数数量错误或属性分配无效
- java - JavaFX 应用程序在调用 Stage.ShowAndWait() 方法时导致 Ubuntu 14.04 上的 Java VM 崩溃并出现问题框架:C [libc.so.6+0x3c10d]
- javascript - 访问令牌在 JavaScript 时间过期