Skip to main content

Crate mhost

Crate mhost 

Source
Expand description

mhost is a modern, high-performance DNS lookup library and CLI tool.

It provides multi-server concurrent DNS lookups across UDP, TCP, TLS (DoT), and HTTPS (DoH) transports, with support for 20+ DNS record types. The library can query many nameservers in parallel and aggregate results, making it well suited for DNS diagnostics, propagation checking, and subdomain discovery.

§Quick Start — Builder API

The easiest way to get started is with ResolverGroupBuilder:

use mhost::resolver::{ResolverGroupBuilder, MultiQuery};
use mhost::resolver::lookup::Uniquify;
use mhost::nameserver::predefined::PredefinedProvider;
use mhost::RecordType;
use std::time::Duration;

// Build a resolver group with system nameservers + Google DNS
let resolvers = ResolverGroupBuilder::new()
    .system()
    .predefined(PredefinedProvider::Google)
    .timeout(Duration::from_secs(3))
    .build()
    .await?;

// Query for A and AAAA records
let query = MultiQuery::multi_record(
    "example.com",
    vec![RecordType::A, RecordType::AAAA],
)?;
let lookups = resolvers.lookup(query).await?;

// Deduplicate results across nameservers
let a_records = lookups.a().unique().to_owned();
println!("A records: {:?}", a_records);

§Manual Construction

For full control, you can construct resolvers manually:

use mhost::nameserver::NameServerConfig;
use mhost::resolver::{MultiQuery, Resolver, ResolverConfig, ResolverGroup};
use mhost::resolver::lookup::Uniquify;
use mhost::RecordType;
use std::net::SocketAddr;

// Create a ResolverGroup from the OS nameservers
let mut resolvers = ResolverGroup::from_system_config(Default::default())
    .await?;

// Add a custom resolver for Google DNS
let sock_addr: SocketAddr = "8.8.8.8:53".parse()?;
let config = ResolverConfig::new(NameServerConfig::udp(sock_addr));
let google = Resolver::new(config, Default::default()).await?;
resolvers.add(google);

// Lookup A, AAAA, and TXT records
let query = MultiQuery::multi_record(
    "example.com",
    vec![RecordType::A, RecordType::AAAA, RecordType::TXT],
)?;
let lookups = resolvers.lookup(query).await?;
let a_records = lookups.a().unique().to_owned();
println!("A records: {:?}", a_records);

Re-exports§

pub use error::Error;
pub use resources::RecordType;

Modules§

app
mhost command line app to query, discover and lint DNS.
diff
Compute diffs between sets of various record types to look for changes, deviations etc.
error
Main error type of this library.
estimate
Compute run time estimates for various queries.
lints
Pure DNS lint checks that analyse Lookups results for common misconfigurations.
nameserver
Nameserver configuration and transport protocol types.
resolver
DNS resolver abstractions for concurrent multi-server lookups.
resources
DNS record types, records, and record data.
services
Supporting services to download name server lists and query WHOIS information for IP subnets.
statistics
Statistics module to compute statistical information on query results.
system_config
Read operating system configuration for DNS resolving, i.e. read /etc/resolv.conf.
utils
Various helpers for serialization and concurrent execution control.

Structs§

Name
A domain name

Enums§

IpNetwork
Represents a generic network range. This type can have two variants: the v4 and the v6 case.

Traits§

IntoName
Conversion into a Name

Type Aliases§

Result