Whois是一种网络协议,也是一种网络服务,能够让客户端查询域名或者IP是否注册,以及注册人的相关信息。我们通常所说的whois信息就是通过whois查询到的信息。IP whois信息即是IP的是否注册使用以及注册人(或机构)的信息。
全球的IP地址的分配都由国际组织ICANN(互联网名称与数字地址分配机构)进行分配和管理。由于互联网最早由美国发明出来,所以最早的负责分配IP地址的机构是IANA(互联网号码分配机构)。1998年12月ICANN与IANA签订协议,正式将IANA组织纳入到ICANN旗下。
ICANN是互联网名称与数字地址分配机构。ICANN 总部位于加利福尼亚州滨德尔湾,是加利福尼亚州的一家非营利性公司,成立于1998年9月18日,旨在监督之前由其他组织(尤其是 IANA)直接代表美国政府执行的许多与互联网相关的任务。
由于ICANN作为一个全球性机构,不便于直接将IP或域名分配到具体的使用机构上,所以就全球就成立了五大区域互联网注册机构(RIR),分别管理亚太地区(APNIC)、非洲地区(AFRINIC)、美洲地区(ARIN)、拉丁美洲地区(LACNIC)、欧洲地区(RIPE)的互联网注册事宜。
全球五大区域性互联网注册机构直接管理区域内的互联网注册接入事宜,但是区域内仍然有很多国家和地区实体,五大区域性互联网注册机构可能还是管理不过来。于是每个实体内部也成了对应的地区性互联网注册机构以区域性互联网注册机构对接,负责管理本地区的互联网注册事宜。所以一个IP的whois信息,是由注册用户提交给区域性互联网注册机构,,再由地区性互联网注册机构上报到区域性互联网注册机构。

IP whois信息由IP的whois服务器提供对外的查询接口,通过whois协议就可以直接查询。IP地址的whois信息,由各大区域性互联网注册机构提供whois服务对外开放查询。如下图通过命令查询”114.114.114.114”的whois信息,图中清晰的显示了查询的whois服务器(whois.apnic.net)是亚太地区互联网注册机构维护的服务器。

从CNNIC官网政策上可以看到要注册IP地址必须要成为CNNIC的IP分配联盟会员,成为会员就必须是组织机构。所以ip只会由企业所有,而域名则可以为企业或个人所有。从费用上可以看到注册的IP地址越多越便宜。一年的成本费用,1个C段大约要7千元,最便宜2个A段54万元,平均为60元每各IP每年。域名的注册就会相对很容易,且持有价格便宜,因为理论上域名的数量是无上限的。

选取中国电信基站IP、赛尔网络教育网IP、公共DNS(114.114.114.114)这三个IP查询其对应的WHOIS信息,发现注册信息都是真实的,都代表了注册单位的信息,而不会包括终端用户的信息。
下图所示为某大学教育网IP,获得的IP地址都是对应的注册单位的信息是CERNET-CN
,描述信息为中国教育研究网络。

下图所示查询某运营商手机基站出口的IP地址,查询出来的whois信息为中国电信浙江节点,未能通过语义上展示出其他信息来。

但是查询114.114.114.114获得的whois信息,确是注册单位“南京信风网络科技有限公司”的注册信息。

|
栏目 |
IP whois |
域名whois |
|
所有人类型 |
单位所有 |
单位所有/个人所有 |
|
注册成本 |
高 |
低 |
|
使用人与所有人一致 |
大部分不一致 |
大部分一致 |
|
信息真实性 |
真实 |
个人注册真实性低 |
由于IP的whois信息是注册单位的真实信息,这些信息都是统一使用的英文语言,所以这些信息有很大的价值可以挖掘。于是乎批量的获取这些IP WHOIS信息就特别有价值了。
这是最容易想到的办法了,少量的IP通过whois服务器查询,是一个比较容易的办法,但是大批量的对whois服务器发起请求和查询,可能会被whois服务器封禁请求查询IP。
向5个RIR机构提出申请是批量获得whois信息是最为可行的方法,5个RIR机构掌握着所有的IP的whois信息,其在官方已经给出了相关的申请方式和手续。但是不同的RIR机构对于信息审批要求都不一样,且最复杂的拉丁美洲,需要将申请文件,邮寄至LACNIC总部。最终申请是否通过可能存在着很大的不确定性。


相比较于批量获得完整的ip whois信息,使用RIR公开的有限字段批量数据来进行挖掘,也是一个不错的选择。RIR会公开少量有必要的IP whois信息,特别是包括路由信息,这些对互联网是必要的。
下图是几个有限公开信息的截图,可以看到敏感信息都进行了***号处理。同时最为需要注意的是,这些公开信息的时效性和准确性,都不完整正常,需要进行一些甄别和识别,可能才会产生比较大的预期价值。


这个确实是一个很小的知识点,但是很多时候,不了解背景知识的人,不容易找到正确答案。


通过IP的whois信息可以生产这个IP是教育网的IP,还是阿里云的云主机的IP,这些IP的基础的whois信息中是包含最基础的信息。

比如通过以下关键字,可以研判该IP是家庭宽带adsl的IP地址:

追踪到国外这个IP属于美国派拓网络安全公司。

https://www.cnnic.cn/n4/2022/0801/c84-275.html
https://www.cnnic.cn/n4/2022/0818/c84-346.html
https://www.arin.net/reference/research/bulkwhois/
https://www.lacnic.net/2472/2/lacnic/request-bulk-whois-access
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在