2011-07-19 44 views
0

我需要发现Linux中的所有网络邻居(他们也在运行Linux),我需要获取他们的IP地址(第三层)。任何想法如何做到这一点?邻居发现C

顺便说一句,我需要做的是,在C,而不是在shell

许多在此先感谢!

+1

使用nmap或查看它的工作方式可以帮助您找到Linux机器。 – vpit3833

回答

2

你应该做的是让邻居运行一个守护进程,它对UDP多播做出响应(对发送者有一个单播响应)。

然后发送一个TTL为1的UDP组播(这样它就不会被路由),并聆听谁来回应。您只会收到来自正在运行代理的邻居的响应。

另一种可能性是使用已有的协议,例如mDNS。

+0

+1为mDNS,更多谷歌搜索条款在这里领先:Bonjour/Avahi/ZeroConf。 –

1

如果有问题的机器不合作,没有保证的方式来做到这一点。

您可以做的最好的做法是扫描可能的地址并探测每个地址,以查看是否可以得到响应 - 该探测可以是从简单的ICMP回应请求(ping)到复杂的畸形数据包从远程主机引发响应。

所要求的复杂程度以及它是否能够工作完全取决于所讨论的主机的防火墙等级。

正如一位评论员已经观察到的,有像nmap这样的整个程序致力于试图发现这些信息,这些信息提供了一些关于这可能是多么重要的想法。另一个极端是,如果主机协同工作,那么简单的广播ICMP回应请求可能就足够了。

0

如果您的网段使用合理体面的交换机,则可以通过检查其中一个交换机的转发数据库来发现链路层邻居。您应该能够通过SNMP自动获得此信息,并检查交换机的文档。

一旦你有一个链接邻居列表,你可以试着找出他们的IP地址,但要记住他们可能有很多或根本没有。为此,你需要某种反向ARP。也许你的路由器维护一个MAC-to-IP关联列表,你可以查询它(SNMP将是最方便的解决方案)。