42 lines
984 B
Go
42 lines
984 B
Go
package net
|
|
|
|
import (
|
|
"context"
|
|
"github.com/benburkert/dns"
|
|
"net"
|
|
)
|
|
|
|
func ReplaceDefaultDnsResolver(){
|
|
cli := &dns.Client{Resolver: &PreferIPV4Resolver{}}
|
|
net.DefaultResolver.PreferGo = true
|
|
net.DefaultResolver.Dial = cli.Dial
|
|
}
|
|
|
|
type PreferIPV4Resolver struct{}
|
|
|
|
func (p *PreferIPV4Resolver) ServeDNS(ctx context.Context, w dns.MessageWriter, r *dns.Query) {
|
|
if r.Questions[0].Type == dns.TypeAAAA {
|
|
w.Status(dns.ServFail)
|
|
} else if msg, err := w.Recur(ctx); err != nil {
|
|
w.Status(dns.ServFail)
|
|
} else {
|
|
p.writeMessage(w, msg)
|
|
}
|
|
}
|
|
|
|
func (p *PreferIPV4Resolver) writeMessage(w dns.MessageWriter, msg *dns.Message) {
|
|
w.Status(msg.RCode)
|
|
w.Authoritative(msg.Authoritative)
|
|
w.Recursion(msg.RecursionAvailable)
|
|
|
|
for _, res := range msg.Answers {
|
|
w.Answer(res.Name, res.TTL, res.Record)
|
|
}
|
|
for _, res := range msg.Authorities {
|
|
w.Authority(res.Name, res.TTL, res.Record)
|
|
}
|
|
for _, res := range msg.Additionals {
|
|
w.Additional(res.Name, res.TTL, res.Record)
|
|
}
|
|
}
|