Use the net package to create a server listening on a specific address and the net/dns package to handle DNS queries. The server accepts incoming connections, reads DNS packets, and writes responses back to the client.
package main
import (
"net"
"net/dns"
)
func main() {
listener, err := net.Listen("udp", ":53")
if err != nil {
panic(err)
}
defer listener.Close()
server := &dns.Server{Addr: ":53", Net: "udp"}
server.HandleFunc(".", func(w dns.ResponseWriter, r *dns.Msg) {
m := new(dns.Msg)
m.SetReply(r)
w.WriteMsg(m)
})
server.ListenAndServe(listener)
}
For a client, use dns.Client to send queries to a server address:
package main
import (
"fmt"
"net"
"net/dns"
)
func main() {
client := new(dns.Client)
m := new(dns.Msg)
m.SetQuestion("example.com.", dns.TypeA)
resp, _, err := client.Exchange(m, "8.8.8.8:53")
if err != nil {
panic(err)
}
fmt.Println(resp.Answer)
}