![确定 IP 地址子网地址](https://linux22.com/image/1497316/%E7%A1%AE%E5%AE%9A%20IP%20%E5%9C%B0%E5%9D%80%E5%AD%90%E7%BD%91%E5%9C%B0%E5%9D%80.png)
如果有一个任意的公共 IP 地址,是否有办法在不知道网络掩码的情况下确定其所属的子网?
答案1
简短的回答是“不”。
您所能做的最好的事情就是做出有根据的猜测 - 猜测的准确程度取决于您有多绝望以及您拥有哪些可利用的资源。
猜测的来源包括(但可能不限于)
- 来自 IP 地址的提示 - 至少在新西兰,历史上地址被分解为大小范围(最小是 256 的“C 类”)。
- BGP 路由表告诉您什么。
- 根据 @Zina 的帖子 - 网关和主机如何响应。这里有陷阱,而且充其量是不可靠的。关于下一跳的假设并不总是有效的 - 虽然您可以改进这一点,但如果您可以对设备进行指纹识别并查看同一路由器是否对多个地址做出响应并从中推断子网划分。
- 通过从同一子网中路由器后面的设备提供的服务获取提示 - 再次,高度不可靠,但是,例如,云服务可能以相同的方式设置同一 Web 服务器的多个实例,并且其邻居 - 可能属于其他租户会有不同的配置。
- 最后一个八位字节也告诉了你一些信息。某些值更有可能与常规地址(广播和网络)“不同”,这也可能有助于推断。
答案2
您也许能够使用 traceroute 找到它。使用 找到您的公共网关traceroute www.google.com
。现在只需从公共 DG 开始 traceroute 上一个/下一个 IP。当您开始看到将显示边界的额外跳数。例如我的 IP 是 xy96.112 而我的路由器显示 DG 是 96.1. 并且我用 traceroute google check 看到相同的结果,第一跳是本地路由器 IP,下一跳是公共网关 IP。所以我知道它至少是一个 /25 网络(第一个 IP -> 1 - 我的公共 IP -> 112 - 意味着至少是一个有 126 台主机的网络)。使用 traceroute 我看到 xy95.254 上有一个额外跳数(因此 96.1 上的 DG 是网络中的第一个 IP)并且 xy98.1 上有一个额外跳数 - 因此我假设它是一个 /22 网络。当然,只有当您从跳数获得带有 IP 地址的回复时,这才有效。