/ DNS

whois xyz

Linux 中的 whois 客户端把各个顶域的 whois 服务器写在了代码里,所以不包含一些新的顶域。在 Linux 里可以给这个 whois 客户端添加配置/etc/whois.conf,指定顶域的 whois 服务器。

如果没有进行配置,查询一些新顶域的域名 whois 信息时就查不到了,比如大家喜闻乐见的电影搜索网站 51bt.xyz 这个网站的域名,或者 Google 新买的 abc.xyz 这个域名,whois 查询时就得到了这样的信息。

whois server is known for this kind of object.

为了能查询这些域名的 whois 信息,就要把这些域名顶域的 whois 服务器写在配置文件里,格式是这样 \.ac$ whois.nic.ac 意思是以 .ac 结尾的域名,去 whois.nic.ac 查询 whois 信息。

但是首先,要找到这些顶域的 whois 服务器是什么。

查找 whois 服务器的方法

IANA

首选的方法向 IANA 查询,IANA 相当于 DNS 解析过程中的根。例如查询顶域 xyz 的 whois 服务器 whois -h whois.iana.org,会得到很多内容

% IANA WHOIS server
% for more information on IANA, visit http://www.iana.org
% This query returned 1 object

domain:       XYZ

organisation: XYZ.COM LLC
address:      2121 E Tropicana Ave
address:      Las Vegas
address:      NV 89119
address:      United States

contact:      administrative
name:         General Counsel
organisation: XYZ.COM LLC
address:      2121 E Tropicana Ave., STE2
address:      Las Vegas
address:      NV 89119
address:      United States
phone:        +1.7027632191
e-mail:       hello@xyz.com

contact:      technical
name:         CTO
organisation: CentralNic
address:      35-39 Moorgate
address:      London EC2R 6AR
address:      United Kingdom
phone:        +44.2033880600
fax-no:       +44.2033880601
e-mail:       tld.ops@centralnic.com

nserver:      GENERATIONXYZ.NIC.XYZ 212.18.249.42 2a04:2b00:13ff:0:0:0:0:42
nserver:      X.NIC.XYZ 194.169.218.42 2001:67c:13cc:0:0:0:1:42
nserver:      Y.NIC.XYZ 185.24.64.42 2a04:2b00:13cc:0:0:0:1:42
nserver:      Z.NIC.XYZ 212.18.248.42 2a04:2b00:13ee:0:0:0:0:42
ds-rdata:     3599 8 1 3FA3B264F45DB5F38BEDEAF1A88B76AA318C2C7F
ds-rdata:     3599 8 2 B9733869BC84C86BB59D102BA5DA6B27B2088552332A39DCD54BC4E8D66B0499

whois:        whois.nic.xyz

status:       ACTIVE
remarks:      Registration information: http://nic.xyz

created:      2014-02-06
changed:      2015-03-18
source:       IANA

其中包含了 whois 的那一行,其值 whois.nic.xyz 就是要找的 xyz 的 whois 服务器了。

whois-servers.net

有些时候上面的方法竟然查不到,比如 whois -h whois.iana.org ad 查询 ad 顶域的信息,返回的结果里没有 whois 这一项。

可以尝试使用 dig ad.whois-servers.net 的方法,也就是以要查的顶域作为 whois-servers.net 的子域名进行 DNS 请求。检查返回结果中的 CNAME,就是这个顶域的 whois 服务器。

例如 dig +noall buzz.whois-servers.net +answer 结果是

buzz.whois-servers.net.	 551	 IN    CNAME    	whois.nic.buzz.
whois.nic.buzz.		     552     IN	    A        	156.154.115.28
whois.nic.buzz.		     552     IN     A           156.154.117.28

得到 buzz 顶域的 whois 服务器就是 whois.nic.buzz.


一个尝试获取顶域 whois 服务器的丑陋脚本

#!/bin/bash

set -o errexit 

TLDS_FILE="./tlds-alpha-by-domain.txt"
WHOIS_SERVER_FILE="./whois_server.txt"
ERROR_FILE="${WHOIS_SERVER_FILE}.err"
DOMAIN_REGEX='^[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(\.([A-Za-z]{2,}|xn--[A-Za-z0-9]{2,}))\.?$'

if [[ ! -f $TLDS_FILE ]]
then
    # 下载顶域列表
    wget https://data.iana.org/TLD/tlds-alpha-by-domain.txt -O $TLDS_FILE
fi

cat /dev/null > $WHOIS_SERVER_FILE
cat /dev/null > $ERROR_FILE

while read tld
do
    # 过滤可能出现的空行和注释的内容
    if [[ -z $tld ]]; then continue; fi
    if [[ ${tld:0:1} = '#' ]]; then continue; fi
    ## 一律转换为小写字母
    tld=$(echo $tld | tr A-Z a-z)
    echo $tld

    # 首先通过 whois -h whois.iana.org xxx 的方式向 IANA 查询 tld 信息
    whois_server=$(whois -h whois.iana.org $tld | grep whois | head -1 | awk '{print $2}'|| echo "NOT FOUND")
    if [[ ! "x$whois_server" = "x" || "x$whois_server" = "xNOT FOUND" ]] &&  [[ $whois_server =~ $DOMAIN_REGEX ]]
    then
        echo "\\.$tld\$ $whois_server" >> $WHOIS_SERVER_FILE
    else
        # 如果上面的方法没查到,尝试使用 dig xxx.whois-servers.net 的方法,不太可靠,放弃
        echo "dig $tld.whois-servers.net"
        whois_server=$(dig +noall $tld.whois-servers.net +answer | head -1 | awk '{print $5}' || echo "NOT FOUND")
        if [[ ! "x$whois_server" = "x" || "x$whois_server" = "xNOT FOUND" ]] && [[ $whois_server =~ $DOMAIN_REGEX ]]
        then
            # 有些顶域查到了 whois.ripe.net,并不能从这里查到这些顶域的域名信息
            if [[ "$whois_server" = "whois.ripe.net." ]]
            then
                echo "$tld got $whois_server" >> $ERROR_FILE
            else
                echo "\\.$tld\$ $whois_server" >> $WHOIS_SERVER_FILE
            fi
        else
            echo "didn't find $tld whois server"
            echo "$tld" >> $ERROR_FILE
        fi
    fi
done < $TLDS_FILE

参考内容
Where to find an up-to-date list of WHOIS Servers for various tlds?
How to whois new TLDs?