能否辨别两个 IP 地址是否属于同一台服务器?

能否辨别两个 IP 地址是否属于同一台服务器?

给定两个公共 IP 地址并且知道它们都位于同一个 /27 网络上,是否有可能从远程位置(即不同的国家/地区)确定它们属于一台还是两台服务器?

答案1

不,一般情况下不是。


为了让来自 SO 的客人高兴,我们进行了以下补充:

  • 基本 TCP/IP 协议(​​例如 IP/TCP/UDP、ICMP)中没有任何内容专门用于做出问题中要求的区分。
  • 对于许多更高级别的协议(例如 HTTP)来说也是如此。
  • 确实有可能利用答案模式的或多或少的细微差别来做出猜测关于系统。如果您有两个非常不同的系统,例如 Linux 和 Windows 服务器,这可能足以确保拥有两个主机。
  • 系统越相似,这就越困难。HA Web 集群中具有相同硬件和操作系统的两个节点很可能无法通过这种方式分开。我认为这是当今大多数场景的普遍情况。
  • 最后:同一物理机箱上的两台虚拟机是一台还是两台服务器?这取决于您最初尝试区分的原因,这可能很重要,而且在网络层面上完全不可能分辨。

答案2

好奇“为什么”。对双宿主机的担忧通常被归结为一些未具名的系统管理员的头痛问题。OSI 模型应该隐藏详细信息。

以 Linux 为中心的答案就在前方。

有一些方法可以生成指纹并做出教育性猜测。

  1. nmap -o 和 nmap 进行适当的端口扫描。服务器并不总是绑定到两个 NIC。但很多时候它们会这样做。

  2. MAC 地址。如果您有办法获取 MAC 地址,制造商喜欢对集成硬件使用连续的地址。两个几乎相同的 MAC 地址更可能是同一块主板。当然,这不适用于售后卡。

  3. 问候。Telnet、ftp、smtp 等都提供识别信息。查看这些服务是否正在运行,提供足够独特的信息。横幅现在可能很少见,但仍然值得一试。

  4. 测试独立于 NIC 的行为。例如,尝试通过向 ssh 提供虚假身份验证十几次来触发拒绝主机。如果拒绝主机被触发,您应该会发现套接字在下一次尝试时立即关闭。看看其他 IP 是否也发生这种情况。

/27 网络是……什么,29 台主机?我认为高可信度识别双主机机器的可能性非常小,可能只有 5%。但考虑到主机数量如此之少,您也许能够做出有根据的猜测。

面试时问的有趣问题。实际上我可能会偷用它。

答案3

理论上,在大多数情况下,你可以给出一个有意义的置信水平。不过,有几个注意事项使得实践起来更加困难。

我会与其他答案重叠,而且我可能会遗漏一些东西,但这至少是有关为什么这些特定的部分重要或不重要的一个详细推理。

不过,首先,别再想 MAC 地址了。除非您能直接访问网段,否则您将无法看到它们。

另外,不要相信端口扫描。只为某些 IP 设置防火墙端口、让软件只监听某些 IP 或让 IDS/IPS 系统在检测到扫描时应用过滤,这些都很简单。所有这些都会搞砸你的测试。

好的,所以你可以简单地判断:两个盒子完全相同的概率很低,除非它们有其他关联。所以你实际上要做的是试图证明它们是不同的盒子,而不是试图证明它们是相同的。

  1. Ping。您需要同时测试两者并进行大量测试。事实证明,虽然网络时间存在抖动,但它是相当高质量的伪随机噪声,如果您在短时间内有足够的样本,噪声的平均值足以让您进行准确的比较。

    网络中的每个第 2 层跳转都会增加少量延迟,不同的拥塞级别将产生不同的延迟值。如果两个 IP 显示出明显不同的并发延迟,那么您可以假设它们可能不是同一个盒子。

    警告 1:具有两个上行链路(未绑定)且在每个上行链路上配置了不同 IP 的单个服务器可能会产生足够的上行链路不平衡,从而导致这种情况。

  2. 端口扫描。目标端口可以处于以下三种状态之一:监听、关闭、过滤。如上所述,它们处于哪种状态实际上没有多大用处,但仍有有用的信息可供利用。

    1. 在多个 IP 上打开端口的机器很可能在所有 IP 上运行相同的软件。例如,可以在一个 IP 上运行 nginx,在另一个 IP 上运行 apache,但大多数人不会这么做。对正在运行的服务进行指纹识别以寻找相似之处。查找它宣传的软件和版本、它支持的选项、宣传的主机名(如果有)、软件行为是否存在任何怪癖,诸如此类。

      Web 服务在这方面用处最小,更有用的是诸如 SMTP(由于 sendmail 支持,很难混合搭配,泄露了大量信息)、SNMP(信息金矿)、SSH(谁运行多个 SSH 守护进程?)和 HTTPS(如果你运气好,他们运行的是相同的软件,你可以检查 SSL 配置中的差异,相同但不寻常的配置是一个很好的指标)。NTP 曾经是一个很好的测试,但现在由于它被大量用作 DoS 放大器,因此被严格锁定,SNTP 也不够准确,无法以同样的方式成为确凿的证据。

    2. 第 3 层指纹识别。远程指纹识别操作系统的主要方式是利用其 TCP/IP 实现中的怪癖。这里无法详述确切的细节,但本质上数据包元数据会泄露大量信息,关闭或过滤的端口如何响应连接以及主机在收到格式错误的数据包时的行为也是如此。虽然这些特征并不能确定正在运行什么,但可以合理地保证,对于绑定到特定 TCP/IP 堆栈的每个 IP,它们几乎相同。明显不同的系统应该具有明显不同的特征。

    注意事项 2:运行完全相同操作系统和供应商补丁的两台机器可能看起来一模一样。在 Windows 上,运行自动更新的同一 Windows 版本的两份副本将很难区分,除非它们运行不同的防火墙。在 Linux 上,差异可能主要与所搭载的内核版本和选项有关。此测试只能给出两个 IP 不在同一操作系统上的可能性很高。

  3. 重放攻击。在两个 IP 上打开端口列表后,对每个 IP 执行相同的操作并查找行为差异。例如超时、错误消息、重试限制等。某些软件很难或很少根据 IP 配置不同。如果您知道一个 IP 正在接受特定域的邮件,请查看另一个 IP 是否也接受该域的邮件。

    注意事项 3:与测试 2 中的服务指纹识别部分相比,这些数据质量较低,因为这些数据更容易在不同的 IP 上进行不同的配置,并且可能存在各种幕后交互。错误结果的可能性很高,因此对这些结果的信心不足。

所以正如我所说,潜在的理论是不同的主机可能有不同的配置,从而泄露信息。

这没有考虑到的是,很难判断在两个 IP 上运行的同一个网站是同一台服务器还是两台配置了冗余的服务器。它也没有考虑到运行配置管理以保持系统非常相似的系统管理员。它也没有考虑到将在不同主机上运行的多个服务 DNATing 到单个 IP 地址的主机。

虚拟化技术给工作带来了一些奇怪的麻烦。Docker 等容器化系统共享了足够多的堆栈,使得各个容器看起来比实际更相似。桥接到物理网卡的虚拟网卡应该无法与物理上独立的硬件区分开来,但事实并非如此,这主要是因为桥接器是软件,因此数据包必须通过主机 IP 堆栈。

有很多方法可以迷惑那些试图测试可重复性的人们。你所能期望的最好结果是一个具有较低怀疑幅度的模式。

对于运行服务器的人来说,这个寓意是你应该将服务器配置为泄露尽可能少的信息:

  1. 尽可能地减少横幅信息。攻击者对您的配置了解得越少,对您越有利。

  2. 让软件只接受它应该服务的 IP 上的连接,并且只在必要时才接受。如果它不需要外部访问,请让它仅绑定到本地主机。减少攻击面总是好的。

  3. 如果你绝对需要监听某些东西,并且想要避免两个 IP 之间的关联,请尽量将不寻常的选项保持在最低限度。你希望它融入其中。

  4. 让防火墙运行默认丢弃策略。我认为 IDS 设置可能会对攻击者做出随机响应,噪音会让攻击者更难相信他们的结果,但确实会让你脱颖而出。

  5. 随机延迟模块对于防止定时攻击毫无用处。真的。选择一个随机数,然后多次掷骰子,写下结果加上你一开始选择的数字。你最终得到的是一个具有固定偏移量的范围。如果替换随机数,范围就会移动。如果范围发生变化,偏移量保持不变,只需重复采样过程即可获得新的基线。

  6. IP 堆栈规范器确实存在,但上次我查看时,它是安全研究中被忽视的一部分。对于安全供应商来说,这可能是一个值得投资的好市场。

相关内容