Skip to content

Instantly share code, notes, and snippets.

@mpfund
Last active December 7, 2023 12:34
Show Gist options
  • Save mpfund/eb8d91e905279f51da9dc7251761119f to your computer and use it in GitHub Desktop.
Save mpfund/eb8d91e905279f51da9dc7251761119f to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"github.com/miekg/dns"
)
func main() {
// Create a DNS server instance
server := &dns.Server{Addr: ":53", Net: "udp"}
// Handle DNS queries
dns.HandleFunc(".", func(w dns.ResponseWriter, r *dns.Msg) {
m := new(dns.Msg)
m.SetReply(r)
for _, q := range r.Question {
if q.Qtype == dns.TypeCNAME {
cname := "example.com." // Replace with your CNAME target
// Create a CNAME RR with a TTL of 3600 seconds (1 hour)
cnameRR := &dns.CNAME{
Hdr: dns.RR_Header{
Name: q.Name,
Rrtype: dns.TypeCNAME,
Class: dns.ClassINET,
Ttl: 3600,
},
Target: cname,
}
// Add the CNAME RR to the answer section
m.Answer = append(m.Answer, cnameRR)
// Check if Chrome can resolve the CNAME target
// (You can add this part back if needed)
} else {
// Handle unspecified queries here
defaultIP := "192.168.1.1" // Replace with your desired default IP address
// Create an A or AAAA RR depending on the query type
if q.Qtype == dns.TypeA {
rr, err := dns.NewRR(fmt.Sprintf("%s IN A %s", q.Name, defaultIP))
if err == nil {
m.Answer = append(m.Answer, rr)
}
} else if q.Qtype == dns.TypeAAAA {
rr, err := dns.NewRR(fmt.Sprintf("%s IN AAAA %s", q.Name, defaultIP))
if err == nil {
m.Answer = append(m.Answer, rr)
}
}
}
}
if len(m.Answer) > 0 {
w.WriteMsg(m)
} else {
dns.HandleFailed(w, r)
}
})
// Start the DNS server
go func() {
if err := server.ListenAndServe(); err != nil {
fmt.Printf("DNS server error: %v\n", err)
}
}()
fmt.Println("DNS server listening on :53 (UDP)...")
select {}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment