Windows 主机操作系统似乎忽略了通过 linux sendto 使用原始套接字注入的数据包

Posted

技术标签:

【中文标题】Windows 主机操作系统似乎忽略了通过 linux sendto 使用原始套接字注入的数据包【英文标题】:Windows Host OS appears to ignore injected packets via linux sendto using raw socket 【发布时间】:2021-09-07 12:03:53 【问题描述】:

我正在使用 Linux sendto() 函数和 RAW 套接字 (socket(AF_INET, SOCK_RAW, IPPROTO_RAW);) 将数据包发送到 Windows 网卡 (eth1)。然而,虽然数据包的地址是网卡的 IP 地址,但主机操作系统似乎“忽略”了这些数据包。

例如,网卡的 IP 为 192.168.1.2,我的用户空间应用程序发送一个网络数据包,其中包含地址为 192.168.1.2 的 ping。我可以在 Wireshark 中观察到 ping 到达 192.168.1.2 的网络设备,但是没有生成回复。 ping 上的 TTL 不为零,所以我不知道为什么主机操作系统会“忽略”发往它的数据包。

同样,如果我创建一个 UDP 套接字并将其绑定到 5050 端口上的 192.168.1.2 侦听,然后在 5050 端口上发送一个寻址到 192.168.1.2 的用户空间 UDP 数据包,则该数据包永远不会传递到该端口。

什么会导致接收它的网卡忽略一个数据包?

如果我从用户空间(通过自定义 IP 隧道)发送数据包以强制处理数据包,就好像它们来自路由器一样,是否需要任何套接字标志?

【问题讨论】:

【参考方案1】:

问题原来是本机 Windows 防火墙,禁用防火墙解决了这个问题。

此外,如果在网络设备上重新发布网络数据包,如果单个设备(mac addr)正在发布来自不同源 ip 的多个 ip 数据包,windows 可能会过滤掉数据包,假设 macip 是唯一的1:1 映射。

【讨论】:

以上是关于Windows 主机操作系统似乎忽略了通过 linux sendto 使用原始套接字注入的数据包的主要内容,如果未能解决你的问题,请参考以下文章

vscode 通过 WIN10 ubuntu子系统(Bash On Windows)管理远程主机

Windows主机上运行Azure IoT Edge的推荐方法

如何把Windows主机中的文件拉到centOS虚拟机中

Windows 主机上的 GitHub Actions(powershell?):前几行的退出代码被忽略

CentOS 6 系统无法开机故障修复

CentOS 6 系统无法开机故障修复