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
mhostcommand 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
Lookupsresults 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§
- Into
Name - Conversion into a Name