Linux whois Command Deep Dive: From Domain Registration to Network Asset Investigation
Linux whois Command Deep Dive: From Domain Registration to Network Asset Investigation#
When troubleshooting a domain ownership issue, I first encountered the whois command. This simple tool hides the entire design philosophy of the domain registration system. Let’s dive deep.
The Essence of the whois Protocol#
whois is an ancient TCP protocol, born in 1982 (RFC 812), even earlier than HTTP. The core logic is extremely simple:
- Client connects to a whois server (usually port 43)
- Sends query string +
\r\n - Server returns plain text result
- Connection closes
That’s it. No complex status codes, no headers—just a pure request-response model.
A minimal whois client in a few lines:
#!/bin/bash
# Simple whois client
echo "$1" | nc whois.iana.org 43
Whois Server Hierarchy#
The key question: where are the whois servers? The answer is hierarchical:
- Root server:
whois.iana.org- queries TLD whois server addresses - TLD servers: like
whois.cnnic.cn(.cn),whois.verisign-grs.com(.com/.net) - Registrar servers: some registrars have their own servers
Complete query flow:
# Step 1: Query IANA root server for TLD whois server
$ whois -h whois.iana.org example.com
% IANA WHOIS server
...
whois: whois.verisign-grs.com # whois server for .com
# Step 2: Query actual registration info
$ whois -h whois.verisign-grs.com example.com
Domain Name: EXAMPLE.COM
Registrar: RESERVED-INTERNET-ASSIGNED-NUMBERS-AUTHORITY
...
Most whois commands handle this hierarchical query automatically, but understanding the underlying mechanism helps troubleshoot issues.
Installation and Basic Usage#
Ubuntu/Debian:
sudo apt install whois
CentOS/RHEL:
sudo yum install whois
Basic queries:
# Query domain
whois google.com
# Query IP address
whois 8.8.8.8
# Specify server
whois -h whois.cnnic.cn baidu.cn
# Concise output (key info only)
whois google.com | grep -E "Registrar|Creation Date|Expiry"
Parsing Whois Output#
Whois output is plain text with no standard format, but common fields include:
Domain Name: EXAMPLE.COM
Registry Domain ID: 123456789_DOMAIN_COM
Registrar WHOIS Server: whois.example-registrar.com
Registrar URL: http://www.example-registrar.com
Updated Date: 2024-01-15T00:00:00Z
Creation Date: 1995-08-14T04:00:00Z
Registry Expiry Date: 2025-08-13T04:00:00Z
Registrar: EXAMPLE REGISTRAR, LLC
Registrar IANA ID: 1234
Registrar Abuse Contact Email: abuse@example-registrar.com
Registrar Abuse Contact Phone: +1.5555555555
Domain Status: clientTransferProhibited
Domain Status: clientDeleteProhibited
Name Server: NS1.EXAMPLE.COM
Name Server: NS2.EXAMPLE.COM
DNSSEC: unsigned
Key Field Meanings#
- Registrar: Domain registrar (e.g., GoDaddy, Namecheap)
- Creation Date: Domain registration time (older domains have higher SEO weight)
- Registry Expiry Date: Expiration date (note renewal)
- Name Server: DNS server addresses
- Domain Status: Domain status (prohibited means locked, prevents unauthorized transfer)
- DNSSEC: Whether DNSSEC security extension is enabled
Understanding Domain Status Codes#
# Common domain statuses
clientTransferProhibited # Transfer locked (normal, protects domain)
clientDeleteProhibited # Delete locked
clientUpdateProhibited # Update locked
clientRenewProhibited # Renew locked (possible dispute)
serverDeleteProhibited # Registry locked (possible legal dispute)
Practical Scenarios#
1. Check if Domain is Available for Registration#
# If returns "No match", domain is unregistered
whois available-domain-check-12345.com 2>&1 | grep -i "no match"
# No match for "AVAILABLE-DOMAIN-CHECK-12345.COM"
# If returns detailed info, domain is already registered
whois google.com | head -5
# Domain Name: GOOGLE.COM
# Registry Domain ID: 2138514_DOMAIN_COM
2. Find Registrar Contact Information#
# Query registrar abuse contact (for reporting abuse)
whois spam-domain.com | grep -i "abuse"
# Registrar Abuse Contact Email: abuse@registrar.com
# Registrar Abuse Contact Phone: +1.5555555555
3. Check IP Address Ownership#
# Query IP ownership (ISP, country, range)
whois 8.8.8.8 | grep -E "OrgName|Country|NetRange"
# NetRange: 8.8.8.0 - 8.8.8.255
# OrgName: Google LLC
# Country: US
4. Batch Query Domain Information#
#!/bin/bash
# Batch query domain creation dates
for domain in google.com facebook.com amazon.com; do
creation=$(whois $domain | grep "Creation Date" | head -1)
echo "$domain: $creation"
done
# google.com: Creation Date: 1997-09-15T04:00:00Z
# facebook.com: Creation Date: 1997-03-29T05:00:00Z
# amazon.com: Creation Date: 1994-11-01T05:00:00Z
Whois Privacy and GDPR#
Due to GDPR (EU General Data Protection Regulation), many registrars offer Whois Privacy service:
# Without privacy protection
Registrant Name: John Doe
Registrant Email: john@example.com
Registrant Phone: +1.5551234567
# With privacy protection
Registrant Name: Privacy Protected
Registrant Email: privacy@registrar.com
Registrant Phone: REDACTED FOR PRIVACY
This makes whois query results potentially incomplete. Some scenarios require accessing real information through the registrar’s backend.
Performance and Edge Cases#
Query Rate Limits#
Many whois servers limit query frequency:
# Fast queries may be limited
for i in {1..100}; do
whois domain$i.com & # Concurrent queries may trigger bans
done
# Correct approach: delay + serial queries
for domain in $(cat domains.txt); do
whois "$domain" >> results.txt
sleep 2 # Avoid triggering limits
done
Internationalized Domain Names#
Chinese domains need Punycode conversion first:
# Wrong: direct Chinese query
whois 百度.cn # Query fails
# Correct: convert to Punycode
whois xn--wxtr44c.cn # Punycode for 百度.cn
Python conversion:
def to_punycode(domain: str) -> str:
return domain.encode('idna').decode('ascii')
print(to_punycode('百度.cn')) # xn--wxtr44c.cn
Format Differences#
Whois output formats vary completely between registries:
# .com domain (Verisign)
Domain Name: EXAMPLE.COM
Creation Date: 1995-08-14T04:00:00Z
# .cn domain (CNNIC)
Domain Name: example.cn
Registration Time: 2003-03-17 12:00:00
Parsing requires adapting to multiple formats.
Web Implementation: Browser-based Whois Query#
Since browsers can’t establish direct TCP connections, a backend proxy is needed:
// Next.js API Route
import { createConnection } from 'net'
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const domain = searchParams.get('domain')
return new Promise((resolve) => {
const socket = createConnection(43, 'whois.iana.org', () => {
socket.write(`${domain}\r\n`)
})
let data = ''
socket.on('data', (chunk) => data += chunk)
socket.on('close', () => {
resolve(new Response(data, {
headers: { 'Content-Type': 'text/plain' }
}))
})
})
}
Frontend usage:
async function queryWhois(domain: string) {
const response = await fetch(`/api/whois?domain=${domain}`)
const text = await response.text()
// Parse key fields
const registrar = text.match(/Registrar:\s*(.+)/)?.[1]
const created = text.match(/Creation Date:\s*(.+)/)?.[1]
return { registrar, created }
}
Whois Alternatives#
Beyond traditional whois, there are other query methods:
1. RDAP (Registration Data Access Protocol)#
Next-generation query protocol returning structured JSON:
curl "https://rdap.verisign.com/com/v1/domain/google.com"
{
"objectClassName": "domain",
"ldhName": "GOOGLE.COM",
"events": [
{
"eventAction": "registration",
"eventDate": "1997-09-15T04:00:00Z"
}
]
}
2. Online Query Services#
- ICANN Lookup: https://lookup.icann.org/
- Official authoritative source, supports all gTLDs
- DomainTools: https://whois.domaintools.com/
- Provides historical whois records (paid)
3. Programming Libraries#
# Python-whois library
import whois
w = whois.whois('google.com')
print(w.registrar) # MarkMonitor Inc.
print(w.creation_date) # 1997-09-15 04:00:00
Summary#
The whois command, while simple, represents a globally distributed domain registration query system. Key takeaways:
- Protocol essence: Plain text TCP protocol, port 43
- Server hierarchy: IANA root → TLD servers → Registrar servers
- Key fields: Registrar, Creation Date, Expiry Date, Name Server
- Privacy protection: GDPR causes some information to be hidden
- Query limits: Note rate control to avoid being banned
Complete domain information query tool: Linux whois Command Query
Related tools: DNS Lookup Tool | IP Address Query