-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathresolver.go
122 lines (110 loc) · 4 KB
/
resolver.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package main
/******************************************************************************
resolver.go
DNS resolution functions in here to help netscanx change resolvers and dig out
DNS records and zone info for given targets
Author: CT Geigner "chux0r"
******************************************************************************/
import (
"context"
"fmt"
"log"
"net"
"strings"
"time"
"chux0r.org/portfu"
"chux0r.org/uglynum"
)
type DnsData struct {
Dns net.Resolver // DNS fun, but mostly lookups/resolution
IPs []string // IPs resolved: future: need to convert to []net.IP/support IPv6
RevNames []string // IP reverse-lookup names
}
/******************************************************************************
(*DnsData).get()
Populate *DnsData by doing DNS hostname (forward) or IP (reverse) lookup.
Also: Since we do not want to use Go or Google default resolver configs, this
always sets up a custom dialer for name resolution
******************************************************************************/
func (dd *DnsData)get(s string) error {
var err error
dd.Dns.StrictErrors = false // enable partial results
resolvr := portfu.GetSocketString(Nsd.IPAddr.String(), Nsd.Port) //"default: 1.1.1.1:53 (Cloudflare dns)"
ctx := context.Background()
dd.Dns.Dial = func(ctx context.Context, network, address string) (net.Conn, error) {
//d := net.Dialer{Timeout: time.Second * time.Duration(5)}
return Nsd.DnsDialer.DialContext(ctx, network, resolvr)
}
fmt.Printf("\nDNS lookup: [%s] Resolver: [%s] Port: %d", s, Nsd.IPAddr.String(), Nsd.Port)
// eval: IP, hostname, or "other"
t := net.ParseIP(s)
if t != nil { // is IP, do reverse lookup instead
fmt.Print(" (reverse lookup)")
dd.RevNames, err = dd.Dns.LookupAddr(ctx, s)
if err != nil {
log.Print("DNS resolution error: [", err, "]\n")
return err
}
fmt.Printf("\nHost %s resolves as:\n", s)
for j, n := range dd.RevNames {
fmt.Printf("\tIP #%d: %s\n", j+1, n)
}
return err
} // continue
dd.IPs, err = dd.Dns.LookupHost(ctx, s)
if err != nil {
log.Print("DNS resolution error: [", err, "]\n")
return err
}
fmt.Printf("\nHost [%s] resolves as:\n", s)
for j, ip := range dd.IPs {
fmt.Printf("\tIP #%d: %s\n", j+1, ip)
}
return err
}
type NameSvr struct {
DnsDialer *net.Dialer
IPAddr net.IP
Port uint16
}
// Name service dialer
var Nsd = NameSvr{
DnsDialer: &net.Dialer{
Timeout: time.Second * time.Duration(5), // default is NO FUCKING TIMEOUT... uhh yeah always set this
FallbackDelay: 300 * time.Millisecond, // ipv6 fallback (default, but want to be intentional here)
KeepAlive: -1, // no keepalives. Our Timeout is shorter anyway. We'll deal.
},
IPAddr: net.IP{1,1,1,1}, // TODO: link this to --resolver flag
Port: 53,
}
/******************************************************************************
setResolver
Defines a custom resolver to use by IP and (optionally) port number
Ex: setResolver("8.8.8.8:53")
******************************************************************************/
func (n *NameSvr)setResolver(ipp string) error {
nsdef := strings.Split(ipp, ":")
n.IPAddr = net.ParseIP(nsdef[0])
if n.IPAddr == nil {
return fmt.Errorf("nameserver-set error: invalid address [%s]", nsdef[0])
}
if len(nsdef) >= 2 {
if len(nsdef) > 2 {
log.Printf("Warning: Nameserver-set overloaded. Sent -> [%s] Using host -> [%s] and port -> [%s], discarding excess parameters.", ipp, nsdef[0], nsdef[1])
}
p, valid := uglynum.NumStringToInt32(nsdef[1])
if valid {
n.Port = uint16(p)
log.Printf("Nameserver-set: [%s:%d]",n.IPAddr.String(),n.Port)
} else {
return fmt.Errorf("nameserver-set error: invalid port [%s]", nsdef[1])
}
return nil
} else if len(nsdef) == 1 {
log.Printf("Nameserver-set host IP: [%s]",nsdef[0])
return nil
} else {
log.Fatalf("Error: Nameserver-set logic/OOB. Exiting.")
return fmt.Errorf("Error: Nameserver-set logic/OOB")// if the code is good, the user should never end up in this branch, ever.
}
}