我试图通过响应网络接口上的ARP请求,在ubuntu中为ARP表添加一个条目。
我正在使用原始套接字捕获ARP请求,然后生成ARP回复并在同一接口上发送它。我可以在wireshark中看到我的ARP回复,但它被忽略,没有ARP表项被添加到ARP表中,只发送了另一个相同的ARP请求。 Here is capture from wireshark.当我重新打开wifi并且路由器实际响应时,它会被立即接受。
以下是我如何设置套接字sll:
struct sockaddr_ll sll;
sll.sll_family = PF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(ETH_P_ALL);
for(int i=0;i<6;i++)
sll.sll_addr[i] = targetMAC[i];
以及我如何发送数据包:
sendto(sockfd, ARPreply, 60, 0, (struct sockaddr*)&packet_info , sizeof(struct sockaddr_ll)) < 0)
我真的不知道出了什么问题。我知道它应该工作,因为我在Windows上做了类似的事情(使用sparppcap)。我尝试搞乱sll设置,但是因为我可以看到数据包实际发送到网络接口,我认为问题可能在其他地方。可能是某些Linux设置禁止处理从同一台PC或类似的东西发送的数据包?
感谢您提出任何想法
Dreamo
编辑1: 根据要求,ARP frames content(因为它们不是很长,我把它们放在一张图片中) 我生成的回复和路由器生成的回复之间的唯一区别是源MAC地址。
答案 0 :(得分:0)
可能是某些Linux设置禁止处理从同一台PC发送的数据包
简而言之,是的。内核已经知道其所有本地接口的MAC地址,IP地址等。内核在传出流量中查找其ARP请求的答案是没有意义的。