FING(或任何 IP/MAC 地址映射器)如何工作?

FING(或任何 IP/MAC 地址映射器)如何工作?

根据这个评论,我将听取建议并将其作为一个单独的问题提出。我正在尝试更多地了解网络和安全性,并希望使用工具来帮助增加我的理解。

Fing 似乎是一个非常酷的工具 - 查找网络上的设备及其关联的 MAC 地址。人们可以轻松实现任何提供检测和警报的解决方案,但我想知道这些工具是如何实现的?这是低级 Linux 实用程序的组合,还是正在进行一些自定义编程?

如果是第二个——该算法会是什么样子?

答案1

我刚刚在我的无线网络上运行了 Fing。使用tcpdump,看来 Fing 生成地址解析协议(ARP) 请求数据包。 ARP 是一个非常简单的协议,运行在以太网协议级别(数据链路,OSI 级别 2)。 ARP 请求数据包将广播地址 (ff:ff:ff:ff:ff:ff) 作为“to”地址,将 Android 手机的 MAC 和 IP 地址作为“from”信息,以及 Fing 想要发送的 IP 地址知道关于。看来 Fing 只遍历它所在的任何子网,在我的例子中是 172.31.0.0/24,所以有 255 个 IP 地址,从 172.31.0.1 到 172.31.0.254。游行结束后,它似乎会再次尝试未响应的 IP 地址。在我看来,这就像 Fing 批量尝试 IP 地址,并依赖底层 Linux 内核来缓冲 ARP 回复,以便 Fing 线程尽快处理。如果 Fing 确定超时,则会重新发送。我不清楚 Fing(一个 Java 程序)如何让手机的 Linux 内核生成 ARP 数据包。

臭名昭著的地图,用-sn“ping 扫描”标志调用,可以做同样的事情。我做了一个strace实验nmap -sn 172.31.0.0/24来看看它如何让内核发送 ARP 请求。它看起来像nmap创建一个普通的 TCP/IP 套接字,并connect()使用 IP 地址调用该套接字到 TCP 端口 80。nmap必须在非阻塞模式下执行此操作,因为它会连续执行大量connect()调用,速度比 Linuxconnect()在没有具有 IP 地址的主机时决定超时的速度要快。

所以这就是您的答案:创建一个 TCP/IP 套接字,connect()使用特定端口和 IP 地址进行调用,然后查看错误是什么。如果错误为 ECONNREFUSED,则它是实时 IP 地址,但没有任何内容正在侦听该端口。如果您获得 TCP 连接,则该 IP 地址有一个主机。呼叫超时的 IP 地址connect()没有关联的计算机。您需要对connect()调用进行批处理以提高速度,并且需要等待connect()调用超时才能确定 IP 地址没有与其关联的计算机。

相关内容