dns

Die DNS-Erweiterung ermöglicht DNS-Lookups und Reverse-DNS-Lookups aus DuckDB heraus

Maintainer: tobilg

Installation und Laden

INSTALL dns FROM community;
LOAD dns;

Beispiel

-- Performs a forward DNS lookup to resolve a hostname to its first IPv4 address.
D SELECT dns_lookup('google.com') as ip;
┌─────────────────┐
│ ip │
varchar
├─────────────────┤
142.251.209.142
└─────────────────┘
-- Performs a DNS lookup to resolve all TXT records for a hostname.
D SELECT unnest(dns_lookup_all('google.com', 'TXT')) as txt_record order by txt_record ASC LIMIT 5;
┌───────────────────────────────────────────────────────────────────────────────────────────────┐
│ txt_record │
varchar
├───────────────────────────────────────────────────────────────────────────────────────────────┤
│ MS=E4A68B9AB2BB9670BCE15412F62916164C0B20BB │
│ apple-domain-verification=30afIBcvSuDV2PLX │
│ cisco-ci-domain-verification=47c38bc8c4b74b7233e9053220c1bbe76bcc1cd33c7acf7acd36cd6a5332004b │
│ docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e │
│ docusign=1b0a6754-49b1-4db5-8540-d2c12664b289 │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
-- Performs a reverse DNS lookup to resolve an IP address to its hostname.
D SELECT reverse_dns_lookup('8.8.8.8') as hostname;
┌────────────┐
│ hostname │
varchar
├────────────┤
dns.google
└────────────┘
-- Returns all TXT records for a hostname as a table.
D SELECT * FROM corey('lastweekinaws.com') order by txt_record ASC;
┌───────────────────────────────────────────────────────────────────────────────┐
│ txt_record │
varchar
├───────────────────────────────────────────────────────────────────────────────┤
│ google-site-verification=2cfGboK6oBt4GlzI62WGmKWI_SjoDEKRSaAgmZsQZlo │
│ google-site-verification=FRrs1UZEfmPke4kYWmYH0wcOPwcMLM0pphvpyhGCa2w │
│ google-site-verification=FuHv5niDbZdqLlXOlvyqokvFJDso9WtDAE3-zHJgz40 │
│ google-site-verification=VE5d97aE3ZCw4GzBHIKKeUGKaCYs2evsGq3QCM0t87I │
│ v=spf1 include:_spf.google.com include:sendgrid.net include:spf.revue.co ~all │
└───────────────────────────────────────────────────────────────────────────────┘
-- Sets the DNS resolver to use for lookups (e.g. 'google' or 'cloudflare').
-- Hint: The C-API doesn't currently support using SET commands. The usage of a SELECT is a workaround.
D SELECT set_dns_config('google');
┌───────────────────────────────────────┐
│ set_dns_config('google') │
varchar
├───────────────────────────────────────┤
│ DNS configuration updated to 'google'
└───────────────────────────────────────┘
-- Set concurrency limit to 250 (default: 50)
D SELECT set_dns_concurrency_limit(250);
┌───────────────────────────────────────┐
│ set_dns_concurrency_limit(250) │
varchar
├───────────────────────────────────────┤
│ DNS concurrency limit updated to 250
└───────────────────────────────────────┘
-- Set DNS cache size to 8192 (default: 1000)
D SELECT set_dns_cache_size(8192);
┌────────────────────────────────┐
│ set_dns_cache_size(8192) │
varchar
├────────────────────────────────┤
│ DNS cache size updated to 8192
└────────────────────────────────┘

Über dns

Diese Community-Erweiterung implementiert DNS-(Reverse-)Lookup-Funktionen für DuckDB.

Funktionen

dns_lookup(hostname, [record_type])

Führt einen Forward-DNS-Lookup aus, um einen Hostnamen auf seine erste IPv4-Adresse oder auf den ersten Record eines angegebenen DNS-Record-Typs aufzulösen.

Parameter:

  • hostname (VARCHAR): Der aufzulösende Hostname
  • record_type (VARCHAR, optional): Der abzufragende DNS-Record-Typ. Unterstützte Typen: A, AAAA, CNAME, MX, NS, PTR, SOA, SRV, TXT, CAA

Rückgabe: VARCHAR – der erste aufgelöste Record (IPv4-Adresse, wenn kein record_type angegeben ist, oder erster Record des angegebenen Typs), oder NULL bei Fehler

Beispiele:

-- Erste IPv4-Adresse holen (Standardverhalten)
SELECT dns_lookup('google.com');
-- Gibt zurück: 142.250.181.206 (oder ähnlich)
-- TXT-Record holen
SELECT dns_lookup('_dmarc.google.com', 'TXT');
-- Gibt zurück: v=DMARC1; p=reject; rua=mailto:[email protected]
-- MX-Record holen
SELECT dns_lookup('google.com', 'MX');
-- Gibt zurück: 10 smtp.google.com.
-- CNAME-Record holen
SELECT dns_lookup('www.github.com', 'CNAME');
-- Gibt zurück: github.com.

dns_lookup_all(hostname, [record_type])

Führt einen Forward-DNS-Lookup aus, um einen Hostnamen auf alle seine IPv4-Adressen oder auf alle Records eines angegebenen DNS-Record-Typs aufzulösen.

Parameter:

  • hostname (VARCHAR): The hostname to resolve
  • record_type (VARCHAR, optional): The DNS record type to query. Supported types: A, AAAA, CNAME, MX, NS, PTR, SOA, SRV, TXT, CAA

Rückgabe: VARCHAR[] – ein Array aller aufgelösten Records (alle IPv4-Adressen, wenn kein record_type angegeben ist, oder alle Records des angegebenen Typs), oder NULL bei Fehler

Beispiele:

-- Alle IPv4-Adressen holen (Standardverhalten)
SELECT dns_lookup_all('cloudflare.com');
-- Gibt zurück: [104.16.132.229, 104.16.133.229] (oder ähnlich)
-- Alle MX-Records holen
SELECT dns_lookup_all('google.com', 'MX');
-- Gibt zurück: [10 smtp.google.com.]
-- Alle TXT-Records holen
SELECT dns_lookup_all('google.com', 'TXT');
-- Gibt zurück: [v=spf1 include:_spf.google.com ~all, google-site-verification=..., ...]
-- Mit unnest einzelne Records erhalten
SELECT unnest(dns_lookup_all('google.com', 'TXT')) as txt_record;

reverse_dns_lookup(ip_address)

Führt einen Reverse-DNS-Lookup aus, um eine IPv4-Adresse auf einen Hostnamen aufzulösen.

Parameter:

  • ip_address (VARCHAR): Die aufzulösende IPv4-Adresse (muss gültiges IPv4-Format sein)

Rückgabe: VARCHAR – der aufgelöste Hostname, oder NULL bei Fehler

Beispiel:

SELECT reverse_dns_lookup('8.8.8.8');
-- Gibt zurück: dns.google

set_dns_config(preset)

Aktualisiert die DNS-Resolver-Konfiguration für alle nachfolgenden DNS-Abfragen.

Parameter:

  • preset (VARCHAR): Das zu verwendende DNS-Resolver-Preset. Unterstützte Presets:
  • 'default': Systemeigene Standard-DNS-Server
  • 'google': Google Public DNS (8.8.8.8, 8.8.4.4)
  • 'cloudflare': Cloudflare DNS (1.1.1.1, 1.0.0.1)
  • 'quad9': Quad9 DNS (9.9.9.9, 149.112.112.112)

Rückgabe: VARCHAR – eine Erfolgs- oder Fehlermeldung

Beispiele:

-- Zu Google Public DNS wechseln
SELECT set_dns_config('google');
-- Gibt zurück: DNS configuration updated to 'google'
-- Zu Cloudflare DNS wechseln
SELECT set_dns_config('cloudflare');
-- Gibt zurück: DNS configuration updated to 'cloudflare'
-- Alle nachfolgenden Abfragen verwenden die neue Konfiguration
SELECT dns_lookup('example.com');
-- Auf Systemstandard zurücksetzen
SELECT set_dns_config('default');
-- Gibt zurück: DNS configuration updated to 'default'
-- Ungültiges Preset gibt einen Fehler zurück
SELECT set_dns_config('invalid');
-- Gibt zurück: Unknown preset 'invalid'. Supported: default, google, cloudflare, quad9

set_dns_concurrency_limit(limit)

Aktualisiert das Concurrency-Limit für DNS-Lookup-Operationen, um TCP-Verbindungserschöpfung zu verhindern. Dies steuert die maximale Anzahl gleichzeitiger DNS-Anfragen, die über alle DNS-Operationen hinweg gleichzeitig laufen können.

Parameter:

  • limit (BIGINT): Die maximale Anzahl gleichzeitiger DNS-Anfragen (muss größer als 0 sein)

Rückgabe: VARCHAR – eine Erfolgs- oder Fehlermeldung

Standard: 50 gleichzeitige Anfragen

Beispiele:

-- Concurrency-Limit auf 500 für High-Throughput-Szenarien setzen
SELECT set_dns_concurrency_limit(500);
-- Gibt zurück: Concurrency limit updated to 500

set_dns_cache_size(size)

Aktualisiert die DNS-Cache-Größe für den Resolver. Der Cache speichert DNS-Abfrageergebnisse, um die Performance zu verbessern, indem wiederholte Lookups für dieselben Abfragen vermieden werden. Jeder Cache-Eintrag speichert die Ergebnisse einer eindeutigen DNS-Abfrage (Kombination aus Hostname + Record-Typ).

Parameter:

  • size (BIGINT): Die maximale Anzahl gecachter DNS-Abfragen (muss größer als 0 sein)

Rückgabe: VARCHAR – eine Erfolgs- oder Fehlermeldung

Standard: 4096 gecachte Abfragen

Beispiele:

-- Cache-Größe auf 8192 für größere Workloads setzen
SELECT set_dns_cache_size(8192);
-- Gibt zurück: DNS cache size updated to 8192
-- Cache-Größe auf 2048 für kleineren Speicherbedarf setzen
SELECT set_dns_cache_size(2048);
-- Gibt zurück: DNS cache size updated to 2048

corey(hostname) – Tabellenfunktion

Fragt alle TXT-Records eines Hostnamens ab und gibt sie als Tabelle mit einer Zeile pro TXT-Record zurück. Das ist nützlich für erweiterte Filterung, Aggregation und Analyse von TXT-Records.

Schließlich kann Route 53 eine echte Datenbank sein!

Parameter:

  • hostname (VARCHAR): Der Hostname, für den TXT-Records abgefragt werden

Rückgabe: Eine Tabelle mit einer einzelnen Spalte:

  • txt_record (VARCHAR): Jeder TXT-Record als eigene Zeile

Beispiele:

-- Alle TXT-Records holen for a domain
SELECT * FROM corey('google.com');
-- TXT-Records filtern
SELECT * FROM corey('google.com')
WHERE txt_record LIKE '%spf%';
-- TXT-Records zählen
SELECT COUNT(*) as record_count
FROM corey('google.com');
-- Mehrere Domains mit UNION ALL abfragen
SELECT 'google.com' as domain, * FROM corey('google.com')
UNION ALL
SELECT 'github.com' as domain, * FROM corey('github.com')
UNION ALL
SELECT 'cloudflare.com' as domain, * FROM corey('cloudflare.com');
-- Domains mit DMARC-Records finden
SELECT '_dmarc.google.com' as domain, * FROM corey('_dmarc.google.com')
WHERE txt_record LIKE 'v=DMARC%'
UNION ALL
SELECT '_dmarc.github.com' as domain, * FROM corey('_dmarc.github.com')
WHERE txt_record LIKE 'v=DMARC%';
-- Alternative: dns_lookup_all für dynamische Abfragen mit Spalten verwenden
SELECT
domain,
dns_lookup_all(domain, 'TXT') as txt_records
FROM (VALUES ('google.com'), ('github.com')) AS domains(domain)
WHERE dns_lookup_all(domain, 'TXT') IS NOT NULL;

Diese Erweiterung ist experimentell und potenziell instabil. Vollständige Beispiele finden Sie in der README.

Hinzugefügte Funktionen

function_name function_type description comment examples
dns_lookup scalar Performs a forward DNS lookup to resolve a hostname to its first IPv4 address, or to the first record of a specified DNS record type as second parameter. NULL [SELECT dns_lookup(‘google.com’);]
dns_lookup_all scalar Performs a forward DNS lookup to resolve a hostname to all its IPv4 addresses, or to all records of a specified DNS record type second parameter. NULL [SELECT dns_lookup_all(‘cloudflare.com’);]
reverse_dns_lookup scalar Performs a reverse DNS lookup to resolve an IPv4 address given as a parameter to a hostname. NULL [SELECT reverse_dns_lookup(‘8.8.8.8’);]
set_dns_config scalar Updates the DNS resolver configuration for all subsequent DNS queries. NULL [SELECT set_dns_config(‘google’);]
set_dns_concurrency_limit scalar Updates the concurrency limit for DNS lookup operations to prevent TCP connection exhaustion. NULL [SELECT set_dns_concurrency_limit(100);]
set_dns_cache_size scalar Updates the DNS cache size for the resolver. NULL [SELECT set_dns_cache_size(8192);]
corey table Queries all TXT records for a hostname and returns them as a table with one row per TXT record. NULL [SELECT * FROM corey(‘lastweekinaws.com’);]

Überladene Funktionen

Diese Erweiterung fügt keine Funktionsüberladungen hinzu.

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

Diese Erweiterung fügt keine Einstellungen hinzu.