IP地址由本地互联网注册机构(LIRs)分配给最终用户。 LIRs需要在其适当的区域互联网注册机构(RIRs)数据库中注册任何分配的地址空间的各种详细信息。有5个RIRs(ARIN,RIPE NCC,APNIC,LACNIC和AfriNIC)负责世界上不同的地区。据我所知,它们都提供RESTful API,您可以使用它来获取所需的信息。
例如,如果IP来自欧洲,则可以使用RIPE API搜索与某个IP地址相关的inetnum或route对象:
http://rest.db.ripe.net/search?query-string=194.79.41.40
在whois-resource
中,您将获得多个对象,对您最有兴趣的是route
对象:
<object type="route">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/route/194.79.40.0/22AS35796"/>
<source id="ripe"/>
<primary-key>
<attribute name="route" value="194.79.40.0/22"/>
<attribute name="origin" value="AS35796"/>
</primary-key>
<attributes>
<attribute name="route" value="194.79.40.0/22"/>
<attribute name="descr" value="NBS"/>
<attribute name="origin" value="AS35796" referenced-type="aut-num">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/aut-num/AS35796"/>
</attribute>
<attribute name="mnt-by" value="NBS-MNT" referenced-type="mntner">
<link xlink:type="locator" xlink:href="http://rest.db.ripe.net/ripe/mntner/NBS-MNT"/>
</attribute><attribute name="source" value="RIPE" comment="Filtered"/>
</attributes>
</object>
请记住,此路由对象可能是一个比用户实际所属的更大的摘要范围,但这是您可以得到的最好结果。
检查以下链接以获取其他RIRs:
- AFRINIC(非洲):afrinic.net
- APNIC(亚太地区):apnic.net
- ARIN(北美):arin.net
- LACNIC(拉丁美洲和加勒比海地区):lacnic.net
编辑:
我应该在原回答中提到这一点,但我被API部分分散了注意力。实际上,在所有这些背后,其实是一个非常简单的whois协议,特别是如果您正在处理需要一些工作来解析JSON或XML的编程语言。
Whois协议使用TCP端口43,并且连接到服务器后,您只需要发送搜索键(在您的情况下为IP地址)。 您将获得响应,服务器将终止连接。 就这样。 您可以尝试telnet whois.ripe.net 43
,打开连接后只需发送194.79.41.40
或RIPE NCC发行的其他IP。
whois存在的问题之一是没有一个中央数据库可以查询并始终获得结果,而是需要查询发行特定IP的RIR。但即使您“错过”了正确的RIR和查询(例如)whois.iana.org以获取RIPE NCC发布的地址,您也将获得具有正确whois服务器和发行IP的组织(RIR)的响应。因此,您可以检查用户的地理位置统计信息并优先考虑最有可能为您提供结果的一个whois服务器,或使用响应选择第二个要查询的服务器。
另一个问题是响应没有标准化,因此您必须为5个whois服务器中的每一个创建响应解析器。