Top Related Projects
CoreDNS is a DNS server that chains plugins
PowerDNS Authoritative, PowerDNS Recursor, dnsdist
dnscrypt-proxy 2 - A flexible DNS proxy, with support for encrypted DNS protocols.
Network-wide ads & trackers blocking DNS server
Quick Overview
miekg/dns is a DNS library for Go, providing a comprehensive set of tools for working with DNS protocols and operations. It allows developers to create DNS clients, servers, and perform various DNS-related tasks programmatically.
Pros
- Comprehensive DNS functionality, including support for various record types and operations
- High performance and efficient implementation
- Actively maintained with regular updates and improvements
- Extensive documentation and examples
Cons
- Steep learning curve for developers unfamiliar with DNS concepts
- Some advanced features may require in-depth knowledge of DNS protocols
- Limited built-in caching mechanisms, requiring custom implementation for complex caching scenarios
Code Examples
Creating a simple DNS client to query A records:
package main
import (
"fmt"
"github.com/miekg/dns"
)
func main() {
c := new(dns.Client)
m := new(dns.Msg)
m.SetQuestion(dns.Fqdn("example.com"), dns.TypeA)
r, _, err := c.Exchange(m, "8.8.8.8:53")
if err != nil {
fmt.Println(err)
return
}
for _, ans := range r.Answer {
if a, ok := ans.(*dns.A); ok {
fmt.Printf("IP: %s\n", a.A)
}
}
}
Creating a basic DNS server:
package main
import (
"github.com/miekg/dns"
"log"
)
func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) {
m := new(dns.Msg)
m.SetReply(r)
m.Compress = false
switch r.Opcode {
case dns.OpcodeQuery:
for _, q := range m.Question {
switch q.Qtype {
case dns.TypeA:
rr, _ := dns.NewRR(q.Name + " 3600 IN A 192.0.2.1")
m.Answer = append(m.Answer, rr)
}
}
}
w.WriteMsg(m)
}
func main() {
dns.HandleFunc(".", handleDNSRequest)
server := &dns.Server{Addr: ":53", Net: "udp"}
log.Fatal(server.ListenAndServe())
}
Getting Started
To use miekg/dns in your Go project, first install it using:
go get github.com/miekg/dns
Then, import it in your Go code:
import "github.com/miekg/dns"
You can now use the library's functions and types to work with DNS. Refer to the documentation and examples in the repository for more detailed usage instructions.
Competitor Comparisons
CoreDNS is a DNS server that chains plugins
Pros of CoreDNS
- Full-featured DNS server with plugin architecture for extensibility
- Designed for cloud-native environments and Kubernetes integration
- Active development and community support
Cons of CoreDNS
- Higher complexity and resource usage for simple DNS tasks
- Steeper learning curve for configuration and customization
Code Comparison
CoreDNS configuration (Corefile):
.:53 {
forward . 8.8.8.8
log
errors
}
dns package usage:
m := new(dns.Msg)
m.SetQuestion(dns.Fqdn(name), dns.TypeA)
c := new(dns.Client)
r, _, err := c.Exchange(m, server)
Summary
CoreDNS is a full-featured DNS server built on top of the dns package, offering a plugin-based architecture and cloud-native features. It's well-suited for complex DNS setups and Kubernetes environments. The dns package, on the other hand, is a lower-level library for DNS operations, providing more flexibility for custom implementations but requiring more effort to build a complete DNS server. CoreDNS is ideal for production-ready DNS servers, while the dns package is better for custom DNS-related applications or simpler use cases.
PowerDNS Authoritative, PowerDNS Recursor, dnsdist
Pros of pdns
- Full-featured DNS server with extensive functionality
- Supports multiple backends (MySQL, PostgreSQL, LDAP, etc.)
- Robust and scalable for enterprise-level deployments
Cons of pdns
- Larger codebase and more complex setup
- Higher resource requirements
- Steeper learning curve for basic DNS operations
Code Comparison
pdns (C++):
#include "dnsrecords.hh"
void DNSRecord::setContent(const shared_ptr<DNSRecordContent>& content)
{
d_content = content;
}
dns (Go):
package dns
func (rr *A) String() string {
return rr.Hdr.String() + rr.A.String()
}
Key Differences
- pdns is a full DNS server implementation, while dns is a DNS library
- pdns is written in C++, dns is in Go
- pdns offers more advanced features, dns focuses on simplicity and ease of use
- dns is more suitable for embedding DNS functionality in Go applications
- pdns is better suited for standalone DNS server deployments
Both projects have their merits, with pdns excelling in full-featured DNS server scenarios and dns shining in lightweight, Go-based DNS operations.
dnscrypt-proxy 2 - A flexible DNS proxy, with support for encrypted DNS protocols.
Pros of dnscrypt-proxy
- Provides DNS encryption and authentication out of the box
- Offers a user-friendly command-line interface for easy configuration
- Supports multiple DNS protocols, including DNSCrypt and DNS-over-HTTPS
Cons of dnscrypt-proxy
- More focused on DNS encryption rather than general DNS operations
- May have higher resource usage due to encryption overhead
- Limited flexibility for custom DNS implementations
Code Comparison
dnscrypt-proxy (Go):
func (proxy *Proxy) processIncomingQuery(serverInfo *ServerInfo, encryptedQuery []byte) ([]byte, error) {
nonce, encrypted := encryptedQuery[:NonceSize], encryptedQuery[NonceSize:]
query, err := proxy.Decrypt(serverInfo, nonce, encrypted)
if err != nil {
return nil, err
}
// Process the decrypted query
}
dns (Go):
func (h *Handler) ServeDNS(w ResponseWriter, r *Msg) {
m := new(Msg)
m.SetReply(r)
m.Compress = false
switch r.Opcode {
case OpcodeQuery:
h.Query(m, r)
}
w.WriteMsg(m)
}
The code snippets demonstrate that dnscrypt-proxy focuses on encryption and decryption of DNS queries, while dns provides a more general-purpose DNS server implementation with various operations.
Network-wide ads & trackers blocking DNS server
Pros of AdGuardHome
- Comprehensive DNS-based ad blocking and privacy protection solution
- User-friendly web interface for easy configuration and management
- Supports various upstream DNS protocols (DoH, DoT, DNSCrypt)
Cons of AdGuardHome
- Heavier resource usage due to additional features
- More complex setup and configuration process
- Less flexible for custom DNS implementations
Code Comparison
AdGuardHome (Go):
func (s *Server) handleDNSRequest(d *proxy.DNSContext) error {
req := d.Req
responseWriter := d.ResponseWriter
// ... (request processing logic)
return s.filterDNSRequest(d)
}
miekg/dns (Go):
func (mux *ServeMux) ServeDNS(w dns.ResponseWriter, r *dns.Msg) {
h, _ := mux.match(r.Question[0].Name, r.Question[0].Qtype)
h.ServeDNS(w, r)
}
Summary
AdGuardHome is a feature-rich DNS server with ad-blocking capabilities, while miekg/dns is a lightweight DNS library. AdGuardHome offers a user-friendly interface and comprehensive filtering options but requires more resources. miekg/dns provides a flexible foundation for building custom DNS solutions with lower overhead but lacks built-in ad-blocking features.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Alternative (more granular) approach to a DNS library
Less is more.
Complete and usable DNS library. All Resource Records are supported, including the DNSSEC types. It follows a lean and mean philosophy. If there is stuff you should know as a DNS programmer there isn't a convenience function for it. Server side and client side programming is supported, i.e. you can build servers and resolvers with it.
We try to keep the "master" branch as sane as possible and at the bleeding edge of standards, avoiding breaking changes wherever reasonable. We support the last two versions of Go.
Goals
- KISS;
- Fast;
- Small API. If it's easy to code in Go, don't make a function for it.
Users
A not-so-up-to-date-list-that-may-be-actually-current:
- https://github.com/coredns/coredns
- https://github.com/abh/geodns
- https://github.com/baidu/bfe
- http://www.statdns.com/
- http://www.dnsinspect.com/
- https://github.com/chuangbo/jianbing-dictionary-dns
- http://www.dns-lg.com/
- https://github.com/fcambus/rrda
- https://github.com/kenshinx/godns
- https://github.com/skynetservices/skydns
- https://github.com/hashicorp/consul
- https://github.com/DevelopersPL/godnsagent
- https://github.com/duedil-ltd/discodns
- https://github.com/StalkR/dns-reverse-proxy
- https://github.com/tianon/rawdns
- https://mesosphere.github.io/mesos-dns/
- https://github.com/fcambus/statzone
- https://github.com/benschw/dns-clb-go
- https://github.com/corny/dnscheck for http://public-dns.info/
- https://github.com/miekg/unbound
- https://github.com/miekg/exdns
- https://dnslookup.org
- https://github.com/looterz/grimd
- https://github.com/phamhongviet/serf-dns
- https://github.com/mehrdadrad/mylg
- https://github.com/bamarni/dockness
- https://github.com/fffaraz/microdns
- https://github.com/ipdcode/hades https://jd.com
- https://github.com/StackExchange/dnscontrol/
- https://www.dnsperf.com/
- https://dnssectest.net/
- https://github.com/oif/apex
- https://github.com/jedisct1/dnscrypt-proxy
- https://github.com/jedisct1/rpdns
- https://github.com/xor-gate/sshfp
- https://github.com/rs/dnstrace
- https://blitiri.com.ar/p/dnss (github mirror)
- https://render.com
- https://github.com/peterzen/goresolver
- https://github.com/folbricht/routedns
- https://domainr.com/
- https://zonedb.org/
- https://router7.org/
- https://github.com/fortio/dnsping
- https://github.com/Luzilla/dnsbl_exporter
- https://github.com/bodgit/tsig
- https://github.com/v2fly/v2ray-core (test only)
- https://kuma.io/
- https://www.misaka.io/services/dns
- https://ping.sx/dig
- https://fleetdeck.io/
- https://github.com/markdingo/autoreverse
- https://github.com/slackhq/nebula
- https://addr.tools/
- https://dnscheck.tools/
- https://github.com/egbakou/domainverifier
- https://github.com/semihalev/sdns
- https://github.com/wintbiit/NineDNS
- https://linuxcontainers.org/incus/
- https://ifconfig.es
Send pull request if you want to be listed here.
Features
- UDP/TCP queries, IPv4 and IPv6
- RFC 1035 zone file parsing ($INCLUDE, $ORIGIN, $TTL and $GENERATE (for all record types) are supported
- Fast
- Server side programming (mimicking the net/http package)
- Client side programming
- DNSSEC: signing, validating and key generation for DSA, RSA, ECDSA and Ed25519
- EDNS0, NSID, Cookies
- AXFR/IXFR
- TSIG, SIG(0)
- DNS over TLS (DoT): encrypted connection between client and server over TCP
- DNS name compression
Have fun!
Miek Gieben - 2010-2012 - miek@miek.nl DNS Authors 2012-
Building
This library uses Go modules and uses semantic versioning. Building is done with the go
tool, so
the following should work:
go get github.com/miekg/dns
go build github.com/miekg/dns
Examples
A short "how to use the API" is at the beginning of doc.go (this also will show when you call godoc github.com/miekg/dns
).
Example programs can be found in the github.com/miekg/exdns
repository.
Supported RFCs
all of them
- 103{4,5} - DNS standard
- 1183 - ISDN, X25 and other deprecated records
- 1348 - NSAP record (removed the record)
- 1982 - Serial Arithmetic
- 1876 - LOC record
- 1995 - IXFR
- 1996 - DNS notify
- 2136 - DNS Update (dynamic updates)
- 2181 - RRset definition - there is no RRset type though, just []RR
- 2537 - RSAMD5 DNS keys
- 2065 - DNSSEC (updated in later RFCs)
- 2671 - EDNS record
- 2782 - SRV record
- 2845 - TSIG record
- 2915 - NAPTR record
- 2929 - DNS IANA Considerations
- 3110 - RSASHA1 DNS keys
- 3123 - APL record
- 3225 - DO bit (DNSSEC OK)
- 340{1,2,3} - NAPTR record
- 3445 - Limiting the scope of (DNS)KEY
- 3596 - AAAA record
- 3597 - Unknown RRs
- 4025 - A Method for Storing IPsec Keying Material in DNS
- 403{3,4,5} - DNSSEC + validation functions
- 4255 - SSHFP record
- 4343 - Case insensitivity
- 4408 - SPF record
- 4509 - SHA256 Hash in DS
- 4592 - Wildcards in the DNS
- 4635 - HMAC SHA TSIG
- 4701 - DHCID
- 4892 - id.server
- 5001 - NSID
- 5155 - NSEC3 record
- 5205 - HIP record
- 5702 - SHA2 in the DNS
- 5936 - AXFR
- 5966 - TCP implementation recommendations
- 6605 - ECDSA
- 6725 - IANA Registry Update
- 6742 - ILNP DNS
- 6840 - Clarifications and Implementation Notes for DNS Security
- 6844 - CAA record
- 6891 - EDNS0 update
- 6895 - DNS IANA considerations
- 6944 - DNSSEC DNSKEY Algorithm Status
- 6975 - Algorithm Understanding in DNSSEC
- 7043 - EUI48/EUI64 records
- 7314 - DNS (EDNS) EXPIRE Option
- 7477 - CSYNC RR
- 7828 - edns-tcp-keepalive EDNS0 Option
- 7553 - URI record
- 7858 - DNS over TLS: Initiation and Performance Considerations
- 7871 - EDNS0 Client Subnet
- 7873 - Domain Name System (DNS) Cookies
- 8080 - EdDSA for DNSSEC
- 8499 - DNS Terminology
- 8659 - DNS Certification Authority Authorization (CAA) Resource Record
- 8777 - DNS Reverse IP Automatic Multicast Tunneling (AMT) Discovery
- 8914 - Extended DNS Errors
- 8976 - Message Digest for DNS Zones (ZONEMD RR)
- 9460 - Service Binding and Parameter Specification via the DNS
- 9461 - Service Binding Mapping for DNS Servers
- 9462 - Discovery of Designated Resolvers
Loosely Based Upon
- ldns - https://nlnetlabs.nl/projects/ldns/about/
- NSD - https://nlnetlabs.nl/projects/nsd/about/
- Net::DNS - http://www.net-dns.org/
- GRONG - https://github.com/bortzmeyer/grong
Top Related Projects
CoreDNS is a DNS server that chains plugins
PowerDNS Authoritative, PowerDNS Recursor, dnsdist
dnscrypt-proxy 2 - A flexible DNS proxy, with support for encrypted DNS protocols.
Network-wide ads & trackers blocking DNS server
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot