【问题标题】:ARP reply sent by raw sockets ignored原始套接字发送的 ARP 回复被忽略
【发布时间】:2014-04-24 16:53:56
【问题描述】:

我正在尝试通过响应网络接口上的 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设置禁止处理从同一台电脑或类似的东西发送的数据包?

感谢您的任何想法

梦想

编辑 1: 根据要求,ARP frames content(因为它们不是很长,我把它们放在一张图片中) 我生成的回​​复与路由器生成的回复之间的唯一区别是源 MAC 地址。

【问题讨论】:

  • 您能否提供 ARP 帧的全部内容(请求和响应)?您可以将它们作为文本导出到文件中。
  • 感谢您的回复,我已经用 ARP 帧内容编辑了我的问题
  • 你是在同一台机器上生成和接收帧吗?
  • 是的,我真正想做的是某种“虚拟服务器”,它可以与网络接口上的其他应用程序进行交互。例如:在没有实际互联网/网络连接的情况下使用浏览器加载一些网页。这个“虚拟服务器”应该响应所有生成的请求(ARP、DNS、TCPSYN、HTTP...),以便浏览器认为他从网络获取数据。

标签: c linux sockets networking


【解决方案1】:

可能是某些 linux 设置禁止处理从同一台电脑发送的数据包或类似的东西

简而言之,是的。内核已经知道其所有本地接口的 MAC 地址、IP 地址等。内核在 传出 流量中寻找其 ARP 请求的答案是没有意义的。

【讨论】:

  • 其实我故意用arp -d 192.168.1.1从ARP表中删除了这个ARP条目,然后它自己发送请求,我只回复了提到的应用程序。但是,我可以看到您关于内核不在 outgoing 流量中寻找答案的观点。有没有办法强迫他这样做?或将数据包作为传入流量发​​送到接口
  • 我关闭了这个,你实际上已经指出了我的问题所在。谢谢
猜你喜欢
  • 2018-09-11
  • 2020-03-03
  • 2010-11-05
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多