我构建了 getaddrinfo() 示例,网址为http://beej.us/guide/bgnet/html/multi/syscalls.html#getaddrinfo
当我在示例域(例如 facebook.com)上运行它时,它列出了三个(3)IP 地址:
IPv4: 69.63.189.11
IPv4: 69.63.189.16
IPv4: 69.63.181.12
然而,我知道 facebook.com 还有相当多的地址(至少 20 个),如以下答案所示:
http://wiki.answers.com/Q/Discuss:Facebook 的 IP 地址是什么
这个答案只是时间的快照,将来可能会发生变化。我希望能够实现一些代码来列出全部运行该代码时域使用的 IP 地址。
有办法实现这个吗?如果有,怎么做?
答案1
您可以使用计算机上游的透明代理。
对于单台计算机,我还使用 hosts 文件和特殊的 DNS 服务器,通过为 facebook.com 和 www.facebook.com 创建虚假条目来毒害 DNS 记录。我将其指向某个页面,上面写着“您已被抓获”。
在您的用户弄清楚如何使用匿名代理之前,这一切都是可以的。
经过几个步骤后,这真的变成了一个人为问题。如果是在企业,这将成为一项企业政策并属于人力资源部门。如果是在家里,请注意孩子使用电脑的时间。
答案2
不是,因为 facebook.com 的 DNS 服务器很可能只为您提供这三个信息:它只是没有告诉您其他信息。
这样做的原因有很多:一些服务器在地理位置上离您很近,因此 DNS 服务器会优先将这些 IP 分配给您。为了遏制潜在的 DoS 攻击,DNS 服务器将确保没有人能够知道 facebook.com 使用的“所有”IP。
但主要是关于负载平衡。一小时后再试,你可能会得到三个不同的IP。这是因为他们希望将负载分散到所有服务器中,因此 DNS 将优先考虑那些流量较少的主机,而不是流量较多的主机。
答案3
根据 DNS 设置,可能无法获取所有 IP。某些服务不会公开所有位置的所有主机条目。也就是说,即使您获取了某个域的所有 DNS 条目,您也可能只会获取与您的特定位置相关的条目。
我正要添加循环情况,但正如 Dean 所说,如果您再试一次,您可能会得到另外三个 IP。我还在 facebook.com 上进行了快速查找,他们有几个额外的 DNS 安全功能,这使得获取任何其他信息变得更加困难。