Convert Figma logo to code with AI

miekg logodns

DNS library in Go

7,957
1,125
7,957
18

Top Related Projects

12,196

CoreDNS is a DNS server that chains plugins

3,614

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

12,196

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.

3,614

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 Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

Build Status Code Coverage Go Report Card

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:

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