【问题标题】:What's a unique, persistent alternative to MAC address?什么是 MAC 地址的独特、持久的替代方案?
【发布时间】:2013-08-19 14:36:00
【问题描述】:

我需要能够重复地、非随机地、唯一地标识一个服务器主机,它可以被任意虚拟化并且我无法控制。

  • MAC 地址不起作用,因为在某些虚拟化环境中,网络接口没有硬件地址。
  • 无法生成状态文件并将其保存到磁盘,因为可能会克隆虚拟机,从而复制文件。
  • 服务器的 SSH 主机密钥可能是候选者。它们可以像状态文件一样被克隆,但实际上它们通常不会被克隆,因为这是一个安全问题,因此很少犯错误。
  • 还有 /var/lib/dbus/machine-id,但这取决于 dbus。 (感谢 Preetam)。
  • 有一个 cpuid,但显然已弃用。 (感谢 Twitter 上的 Bruno Aguirre)。
  • 主机名值得考虑。像 Chef 这样的许多系统已经需要唯一的主机名。 (感谢 Alfie John)

我希望该解决方案能够持续很长时间,并且肯定会在服务器重新启动和软件重新启动时持续存在。最终,我也知道我的软件的用户会弃用主机并希望将其替换为另一个主机,但要保持与之关联的数据的连续性,因此从长远来看,UUID 可能被认为是可变的,但我不这样做'不特别希望主机开始认为自己是未知的并无缘无故地重新注册自己。

主机是否有任何替代的持久唯一标识符?

【问题讨论】:

  • 解决这个问题的逻辑相当困难。例如,如果您关闭虚拟机,将其所有文件(虚拟 HD 等)复制到两台新机器上并保持不变,那么它们中的哪一个会被标记为原始主机?
  • 持久化所需的持续时间是多少?
  • 还有/var/lib/dbus/machine-id,不过这要依赖于dbus。
  • 我已经(我希望)进一步澄清了要求。
  • 这是来自社交网络上另一个人的评论:我们选择在 [...] 中使用 SSH 密钥,如果不可用,则回退到 MAC 地址。也许你也想要一些适用于 Windows 的东西,为此我们选择了 Windows 域 SID,它“有点稳定”(如果服务器移动域,它会重新编译)。多年来,我们一直在寻找比这更好的解决方案, 就是没有。 特别是以跨平台的方式..

标签: virtualization uuid mac-address


【解决方案1】:

这实际上取决于“持久”的含义。例如,两个 VM 不能分别向您打开相同的网络套接字,因此即使它们是彼此的位级克隆,也可以将它们区分开来。

因此,所需要的只是足够的信息来区分机器的持久性持续时间。

  • 如果持久性的持续时间是网络连接的长度,那么您根本不需要任何标识符——套接字本身是唯一的。

  • 如果需要更长的持久性(例如,对于引导的长度),那么您可以在系统引导时重新生成 UUID。 (请注意,克隆的 VM 仍需要重新启动,除非您正在热复制它。)

  • 1234563机器。如果虚拟机随后被克隆,您将知道这一点,因为您将有两台机器报告来自不同来源的相同 ID - 例如,两个不同的网络套接字、不同的启动时间等。由于您可以区分它们,因此您有足够的信息来区分两台克隆的机器,这意味着您可以采取后续行动来强制进一步区分,例如指示每台机器重新生成其状态文件。

最终,如果一台机器是完美克隆的,那么根据定义,您一开始就无法分辨出哪一台是“真正的”,只有现在有两台可区分的机器。

暗示您可以区分“真实的”和“克隆的”之间的差异意味着您可以使用某种状态来记录两者之间的差异,例如当虚拟机本身被创建时,您可以将其合并到状态记录中。

【讨论】:

  • 你可以判断它是否被克隆,但如果虚拟化环境的一切都可以改变——IP、MAC、CPU 数量等等——你如何区分哪个实例是“真实”的? ?
  • 要求是您能够区分它们(“唯一标识”)。我没有看到任何关于它的记录被保存的信息。当您无法区分地克隆一台机器时,根据定义,两者都不是“真正的”!
  • 我同意区分任何两个正在运行的实例或多或少是微不足道的。我将“重复、非随机、唯一标识”解释为更严格的含义(我认为在 OP 指定的条件下数学上是不可能的)。
  • 我已经按照您所说的方式考虑了解决方案。澄清一下,我正在运行的软件正在连接数据并将数据发送到我控制的 API。所以,如果我从两个不同的 ip:port 套接字获得报告,它们都向我发送相同的 UUID,我可以检测到 UUID 已被重用,但你是对的,我认为我无法检测到哪个是真实的。
【解决方案2】:

看起来简单的解决方案已被排除。 所以这可能会导致复杂的解决方案,比如这个协议: - 客户端发送元组 [MAC 地址、SSH 公钥、序列号] - 如果服务器按预期接收到此元组,则服务器和客户端都增加序列号。 - 否则服务器必须确定发生了什么(客户端被克隆了吗?客户端移动了吗?),也许会得出一个初步结论并提醒人们进行验证。

【讨论】:

    【解决方案3】:

    根据可用信息,我认为没有直接的“使用 X 解决方案”,但这里有一些一般性建议可能会让您找到更好的位置。

    • 如果从“黄金映像”克隆,请考虑使用一些“首次启动”逻辑来生成唯一 ID。 Chef、Puppet 或 Cf-engine 等配置管理系统提供了一些脚手架来实现这一目标。
    • 考虑像zookeeper 这样的全局状态管理器。特别是它的原子计数器功能。随着时间的推移,同一个系统可能会获得新的 ID,但它会是唯一的。
    • 另外这个stack overflow 可能会给你一些其他的方向。它引用了 Twitter 解决类似问题的方法。

    【讨论】:

    • 不幸的是,我无法做这样的事情。我正在构建由其他人安装在我无法控制的服务器上的软件。
    【解决方案4】:

    如果我理解正确,您需要在这些条件下持久的、全球唯一的标识符:

    • 可以在运行时克隆的操作系统安装,因此虚拟机内部的任何状态都将不起作用,并且
    • 可以在任意虚拟化环境中运行,因此虚拟机外部的任何状态都不起作用。

    我意识到这并不能直接回答您的问题,但似乎设计或约束确实需要一些实质性的调整以适应解决方案。

    【讨论】:

    • 我也不确定是否有解决方案。我希望我忽略了一些有创意(或明显)的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多