我需要生成一个包含目标 MAC 地址的以太网标头(因为 libnfnetlink 在预路由发生之前只提供 IP 标头),传出接口号也是已知的,因此可以在正确的网络中进行查找。
从 IP 地址解析 MAC 地址的库/函数是什么?
不清楚为什么需要 MAC 地址,因为这通常是在较低级别为您处理的。
但是,假设您的目标位于本地以太网段上,您可以使用arp命令在本地缓存中查找值。如果该值没有被缓存......嗯,这是一个问题。也许arping会有所帮助......
(通常,您会向 IP 地址 10.10.10.10 发送一个数据包,然后您的系统会发送一个 ARP 数据包来查询谁拥有 10.10.10.10,然后目标系统会返回一个带有其 MAC 地址的响应, 然后它会被缓存。(你可以用tcpdump观察这个过程。)或者当一个系统上线时,它会发出一个广播消息,通知其他人它的 MAC 地址。当然,如果你的目的地在另一个以太网段上,您正在路由到网关而不是直接到目的地,并且没有可用的目的地 MAC 地址。)
您可以在以下位置进一步阅读:
显然,您只能找到直连 IP 地址的 MAC 地址,但没有独立于平台的方法。在 Linux 上,您可以在/proc/net/arp
向目标发送某些内容以触发内核发送 ARP 后查看。
编辑以添加您也可以使用SIOCGARP
ioctl()
仅在 ARP 缓存中查找的内容,因此如果还没有 ARP,它将不会发送 ARP。
否则,您将不得不制作自己的 ARP 请求数据包。如果你走那条路,你可能会重用一堆来自arping的代码。
一般情况下,您无法从 IP 地址中获取 MAC 地址,事实上,由于 IP 可以在以太网以外的数据链路协议上运行,因此某些 IP 地址没有对应的 MAC 地址。
MAC 地址仅在同一以太网段上可用且仅相关。在该段上,可以通过 ARP 请求检索它。