/
resolve.go
50 lines (41 loc) · 939 Bytes
/
resolve.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package main
import (
"flag"
"net"
"strings"
"time"
"github.com/miekg/dns"
)
func resolve(server string, domain string, clientIp *string) ([]dns.RR, error) {
// queryType
var qtype uint16
qtype = dns.TypeA
// dnsServer
if !strings.HasSuffix(server, ":53") {
server += ":53"
}
domain = dns.Fqdn(domain)
msg := new(dns.Msg)
msg.SetQuestion(domain, qtype)
msg.RecursionDesired = true
if *clientIP != "" {
opt := new(dns.OPT)
opt.Hdr.Name = "."
opt.Hdr.Rrtype = dns.TypeOPT
e := new(dns.EDNS0_SUBNET)
e.Code = dns.EDNS0SUBNET
e.Family = 1 // ipv4
e.SourceNetmask = 32
e.SourceScope = 0
e.Address = net.ParseIP(*clientIP).To4()
opt.Option = append(opt.Option, e)
msg.Extra = []dns.RR{opt}
}
client := &dns.Client{
DialTimeout: 5 * time.Second,
ReadTimeout: 20 * time.Second,
WriteTimeout: 20 * time.Second,
}
resp, rtt, err := client.Exchange(msg, server)
return resp.Answer, err
}