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的推荐方法