检测具有相同MAC地址的另一台主机

时间:2008-11-10 03:19:06

标签: networking ethernet

如何检测其他主机是否使用与当前主机相同的MAC地址,例如因为其他主机是欺骗性的?

我在嵌入式环境中工作,所以在协议级别寻找答案,而不是“使用这样的工具”。

修改:RARP 解决了这个问题。对于RARP完全得到任何回复,该段上必须至少有一个主机支持RARP。由于RARP已经过时,现代操作系统不支持它。此外,所有RARP都可以告诉您自己的IP地址 - 如果该网段上的另一台主机具有相同的MAC,则响应将不会有任何不同,除非该主机本身使用了不同的IP地址。

4 个答案:

答案 0 :(得分:17)

这个问题太有趣了,无法放下!经过几次错误的开始,我开始考虑问题的基本组成部分,并搜索RFC以寻求建议。 我还没有找到明确的答案,但这是我的思考过程,希望有所帮助:

  • 原始问题询问如何使用您的MAC地址检测另一台设备。假设您在IP网络上,完成此任务需要什么?

  • 被动方法只是监听流量并查找您未传输但具有MAC地址的任何数据包。这可能会也可能不会发生,所以虽然它可以明确地告诉你是否存在重复,但它不能明确告诉你它不存在。

  • 任何活动方法都要求您传输强制冒名顶替者才能响应的数据包。这会立即消除任何依赖于可选协议的方法。

  • 如果其他设备欺骗您,则必须(根据定义)以您的 MAC地址作为目的地来响应数据包。否则它是 snooping 但不是欺骗

  • 解决方案应独立于IP地址,仅涉及MAC地址。

  • 所以答案似乎是传输广播(以太网)数据包或以MAC地址为目的地的数据包,这需要响应。 Monkeywrench是通常涉及IP地址,你不知道。

哪种协议符合此描述?

简单回答:

  • 如果您的网络支持BOOTP或DHCP,您就完成了,因为这会将MAC地址权威地绑定到IP地址。发送BOOTP请求,获取IP地址,并尝试与之通信。您可能需要具有创造性,强制将数据包强制到线路上并防止自己响应(我正在考虑明智地使用iptables和NAT)。

不那么简单的答案:

  • 独立于IP的协议:不使用IP层的协议,或允许广播的协议。没有人想到。

  • 发送任何数据包,这些数据包通常会生成您的响应,阻止您自己做出响应,并寻找其他设备的响应。使用您的IP地址作为目的地似乎是明智的,但我不相信。不幸的是,细节(以及答案)留给了OP的练习......但我希望讨论有所帮助。

我怀疑最终解决方案将涉及多种技术,因为没有一种方法可以保证可靠的决定。

有些信息可在http://en.wikipedia.org/wiki/ARP_spoofing#Defenses

获取

如果一切都失败了,您可能会喜欢这个:http://www.rfc-editor.org/rfc/rfc2321.txt

发布您的解决方案的后续内容,因为我相信它会对其他人有所帮助。祝你好运!

答案 1 :(得分:3)

您可以为子网中的每个可能的ip发送 ARP请求。 当然,ARP请求的源地址必须是 ff:ff:ff:ff:ff:ff ,否则您可能看不到响应。

我使用bittwiste伪造了这样一个数据包并用PReplay重播它,网络上的所有主机都得到了响应。 (我不知道这些伪造的ARP数据包是否合法......某些操作系统可能会忽略它们)

以下是伪造包的样子: alt text

以下是回复的内容: alt text

如果您观看响应并在其中一个数据包(红色矩形)中查看您的MAC地址,那么某人的MAC地址与您的MAC地址相同...

不幸的是,我无法完全测试这个理论,因为我的(Windows)机器都不关心我试图设置nic的MAC地址......

答案 2 :(得分:1)

在一个网段上使用相同MAC地址的两台主机可能会使交换机变得疯狂,您可能通过网络连接非常不可靠来检测它(因为交换机会将属于您主机的部分数据包发送到第二个,取决于你们中哪一个向他们的方向发送了最后一个数据包。)

答案 3 :(得分:1)

这已经很晚了,而且没有答案,但我想跟进我所做的事情以防其他人感兴趣。

我正在使用一些非常奇怪的嵌入式硬件,这些硬件在制造时没有分配MAC地址。这意味着我们需要在软件中分配一个。

显而易见的解决方案是让用户选择他们知道在他们的网络上可用的MAC地址,最好是从本地管理的范围,这就是我所做的。但是,我想选择一个合理安全的默认值,并尝试在发生冲突时警告用户。

最后,我采用了本地管理范围内的随机默认值,通过制作一些具有中等熵的硬件读数来选择。我故意排除了范围的开始和结束,假设这些范围更适合手动选择。很可能在任何给定的网络中只有这些设备中的一个,当然少于20个,因此冲突的可能性非常低,尽管由于可预测的随机数而没有那么低。 / p>

鉴于出现问题的可能性很低,尽管上面有很好的答案,我还是决定放弃冲突检测,并向用户发出警告,以查找MAC冲突问题。

如果我确实决定实施冲突检测,那么鉴于我控制整个网络堆栈,我可能会查找过多的未知或丢失数据包,然后触发MAC地址更改或在发生这种情况时警告用户。

希望这会帮助其他人 - 但可能不会!