The DNS Extension enables DNS lookups and reverse DNS lookups from within DuckDB
Maintainer(s):
tobilg
Installing and Loading
INSTALL dns FROM community;
LOAD dns;
Example
## A DuckDB extension for performing DNS lookups and reverse DNS lookups, written in pure Rust using the DuckDB C Extension API.
## Functions
### `dns_lookup(hostname)`
Performs a forward DNS lookup to resolve a hostname to its first IPv4 address.
**Parameters:**
- `hostname` (VARCHAR): The hostname to resolve
**Returns:** VARCHAR - The first resolved IPv4 address, or NULL on error
**Example:**
```sql
SELECT dns_lookup('google.com');
-- Returns: 142.250.181.206 (or similar)
dns_lookup_all(hostname)
Performs a forward DNS lookup to resolve a hostname to all its IPv4 addresses.
Parameters:
hostname
(VARCHAR): The hostname to resolve
Returns: VARCHAR[] - An array of all resolved IPv4 addresses, or NULL on error
Example:
SELECT dns_lookup_all('cloudflare.com');
-- Returns: [104.16.132.229, 104.16.133.229] (or similar)
-- Unnest to get individual IPs
SELECT unnest(dns_lookup_all('google.com')) as ip;
reverse_dns_lookup(ip_address)
Performs a reverse DNS lookup to resolve an IPv4 address to a hostname.
Parameters:
ip_address
(VARCHAR): The IPv4 address to resolve (must be valid IPv4 format)
Returns: VARCHAR - The resolved hostname, or NULL on error
Example:
SELECT reverse_dns_lookup('8.8.8.8');
-- Returns: dns.google
### About dns
> This extension is experimental and potentially unstable. Do not use in production. See README for full examples.
## Usage Examples
### Basic DNS Lookup
```sql
-- Look up IP for a domain
SELECT dns_lookup('github.com') as ip;
-- Use in WHERE clause
SELECT * FROM users WHERE ip_address = dns_lookup('example.com');
Basic Reverse DNS Lookup
-- Look up hostname for an IP
SELECT reverse_dns_lookup('1.1.1.1') as hostname;
-- Check if hostname matches
SELECT reverse_dns_lookup('8.8.8.8') = 'dns.google' as is_google_dns;
Advanced Queries
-- Look up multiple domains
SELECT
'google.com' as domain,
dns_lookup('google.com') as ip
UNION ALL
SELECT
'cloudflare.com' as domain,
dns_lookup('cloudflare.com') as ip;
-- Get all IPs for multiple domains
SELECT
domain,
dns_lookup_all(domain) as all_ips,
len(dns_lookup_all(domain)) as ip_count
FROM (VALUES ('google.com'), ('cloudflare.com'), ('github.com')) AS domains(domain);
-- Unnest all IPs from multiple domains
SELECT
domain,
unnest(dns_lookup_all(domain)) as ip
FROM (VALUES ('google.com'), ('cloudflare.com')) AS domains(domain);
-- Look up multiple IPs with table
SELECT
ip,
reverse_dns_lookup(ip) as hostname
FROM (VALUES
('8.8.8.8'),
('1.1.1.1'),
('208.67.222.222')
) AS ips(ip);
-- Filter NULL results (failed lookups)
SELECT
ip,
reverse_dns_lookup(ip) as hostname
FROM (VALUES ('8.8.8.8'), ('999.999.999.999')) AS ips(ip)
WHERE reverse_dns_lookup(ip) IS NOT NULL;
-- Use in computed columns
SELECT
server_name,
ip_address,
reverse_dns_lookup(ip_address) as hostname
FROM servers
WHERE dns_lookup(server_name) = ip_address;
-- Check if specific IP is in DNS results
SELECT
domain,
list_contains(dns_lookup_all(domain), '142.250.181.206') as has_google_ip
FROM (VALUES ('google.com')) AS domains(domain);
Added Functions
function_name | function_type | description | comment | examples |
---|---|---|---|---|
dns_lookup | scalar | NULL | NULL | |
dns_lookup_all | scalar | NULL | NULL | |
reverse_dns_lookup | scalar | NULL | NULL |