我需要发现 Linux 中的所有网络邻居(他们也在运行 Linux),我需要获取他们的 IP 地址(第 3 层)。任何想法如何做到这一点?
顺便说一句,我需要这样做,而C
不是shell
提前谢谢了!
我需要发现 Linux 中的所有网络邻居(他们也在运行 Linux),我需要获取他们的 IP 地址(第 3 层)。任何想法如何做到这一点?
顺便说一句,我需要这样做,而C
不是shell
提前谢谢了!
你应该做的是,让邻居运行一个守护进程,它响应(对发送者的单播响应)UDP 多播。
然后发送一个 TTL 为 1 的 UDP 多播(所以它不会被路由),并监听看看谁响应。您只会收到来自运行代理的邻居的响应。
另一种可能性是使用已经这样做的现有协议,例如 mDNS。
如果有问题的机器不合作,则无法保证这样做。
你能做的最好的就是扫描可能的地址并探测每个地址,看看你是否能得到响应——探测可以是任何东西,从简单的 ICMP 回显请求(ping)到试图引发响应的复杂的畸形数据包从远程主机。
所需的复杂程度,以及它是否会起作用,完全取决于所讨论的主机的防火墙等严重程度。
正如评论者已经观察到的那样,有完整的程序,例如nmap
致力于尝试发现这些信息,这让人们了解了这可能是多么的重要。
在另一个极端,如果主机正在合作,那么一个简单的广播 ICMP 回显请求可能就足够了。
如果您的网段使用相当不错的交换机,您可以通过检查其中一台交换机的转发数据库来发现链路层邻居。您应该能够通过 SNMP 相当自动地获取此信息,请查看您的交换机文档。
获得链接邻居列表后,您可以尝试找出它们的 IP 地址,但请记住,它们可能有很多或根本没有。为此,您需要某种反向 ARP。也许您的路由器维护着一个 MAC-to-IP 关联列表,您可以查询它(同样 SNMP 将是最方便的解决方案)。