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

Windows Host OS appears to ignore injected packets via linux sendto using raw socket

我正在使用 Linux sendto() 函数和 RAW 套接字 (socket(AF_INET, SOCK_RAW, IPPROTO_RAW);) 将数据包发送到 Windows 网卡 (eth1)。然而,尽管数据包被发送到网卡的 IP 地址,主机 OS 似乎“忽略”了数据包。

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

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

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

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

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

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