Skip to content

Commit c043577

Browse files
committed
-resolve: report ECS support
Note that we can't randomize the source network, as Google and possible others refuse networks that don't get BGP announcements.
1 parent 49c17f8 commit c043577

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

dnscrypt-proxy/resolve.go

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
const myResolverHost string = "resolver.dnscrypt.info."
1515
const nonexistentName string = "nonexistent-zone.dnscrypt-test."
1616

17-
func resolveQuery(server string, qName string, qType uint16) (*dns.Msg, error) {
17+
func resolveQuery(server string, qName string, qType uint16, sendClientSubnet bool) (*dns.Msg, error) {
1818
client := new(dns.Client)
1919
client.ReadTimeout = 2 * time.Second
2020
msg := &dns.Msg{
@@ -30,9 +30,27 @@ func resolveQuery(server string, qName string, qType uint16) (*dns.Msg, error) {
3030
Rrtype: dns.TypeOPT,
3131
},
3232
}
33+
34+
if sendClientSubnet {
35+
subnet := net.IPNet{IP: net.IPv4(93, 184, 216, 0), Mask: net.CIDRMask(24, 32)}
36+
prr := dns.EDNS0_SUBNET{}
37+
prr.Code = dns.EDNS0SUBNET
38+
bits, totalSize := subnet.Mask.Size()
39+
if totalSize == 32 {
40+
prr.Family = 1
41+
} else if totalSize == 128 { // if we want to test with IPv6
42+
prr.Family = 2
43+
}
44+
prr.SourceNetmask = uint8(bits)
45+
prr.SourceScope = 0
46+
prr.Address = subnet.IP
47+
options.Option = append(options.Option, &prr)
48+
}
49+
3350
msg.Extra = append(msg.Extra, options)
3451
options.SetDo()
3552
options.SetUDPSize(uint16(MaxDNSPacketSize))
53+
3654
msg.Question[0] = dns.Question{Name: qName, Qtype: qType, Qclass: dns.ClassINET}
3755
msg.Id = dns.Id()
3856
for i := 0; i < 3; i++ {
@@ -69,9 +87,10 @@ func Resolve(server string, name string, singleResolver bool) {
6987
name = dns.Fqdn(name)
7088

7189
cname := name
90+
var clientSubnet string
7291

7392
for once := true; once; once = false {
74-
response, err := resolveQuery(server, myResolverHost, dns.TypeTXT)
93+
response, err := resolveQuery(server, myResolverHost, dns.TypeTXT, true)
7594
if err != nil {
7695
fmt.Printf("Unable to resolve: [%s]\n", err)
7796
os.Exit(1)
@@ -86,14 +105,15 @@ func Resolve(server string, name string, singleResolver bool) {
86105
for _, txt := range answer.(*dns.TXT).Txt {
87106
if strings.HasPrefix(txt, "Resolver IP: ") {
88107
ip = strings.TrimPrefix(txt, "Resolver IP: ")
89-
break
108+
} else if strings.HasPrefix(txt, "EDNS0 client subnet: ") {
109+
clientSubnet = strings.TrimPrefix(txt, "EDNS0 client subnet: ")
90110
}
91111
}
92112
if ip == "" {
93113
continue
94114
}
95115
if rev, err := dns.ReverseAddr(ip); err == nil {
96-
response, err = resolveQuery(server, rev, dns.TypePTR)
116+
response, err = resolveQuery(server, rev, dns.TypePTR, false)
97117
if err != nil {
98118
break
99119
}
@@ -117,7 +137,7 @@ func Resolve(server string, name string, singleResolver bool) {
117137
if singleResolver {
118138
for once := true; once; once = false {
119139
fmt.Printf("Lying : ")
120-
response, err := resolveQuery(server, nonexistentName, dns.TypeA)
140+
response, err := resolveQuery(server, nonexistentName, dns.TypeA, false)
121141
if err != nil {
122142
break
123143
}
@@ -137,6 +157,13 @@ func Resolve(server string, name string, singleResolver bool) {
137157
fmt.Println("no, the resolver doesn't support DNSSEC")
138158
}
139159
}
160+
161+
fmt.Printf("ECS : ")
162+
if clientSubnet != "" {
163+
fmt.Println("client network address is sent to authoritative servers")
164+
} else {
165+
fmt.Println("ignored or selective")
166+
}
140167
}
141168
}
142169

@@ -146,7 +173,7 @@ cname:
146173
for once := true; once; once = false {
147174
fmt.Printf("Canonical name: ")
148175
for i := 0; i < 100; i++ {
149-
response, err := resolveQuery(server, cname, dns.TypeCNAME)
176+
response, err := resolveQuery(server, cname, dns.TypeCNAME, false)
150177
if err != nil {
151178
break cname
152179
}
@@ -170,7 +197,7 @@ cname:
170197

171198
for once := true; once; once = false {
172199
fmt.Printf("IPv4 addresses: ")
173-
response, err := resolveQuery(server, cname, dns.TypeA)
200+
response, err := resolveQuery(server, cname, dns.TypeA, false)
174201
if err != nil {
175202
break
176203
}
@@ -190,7 +217,7 @@ cname:
190217

191218
for once := true; once; once = false {
192219
fmt.Printf("IPv6 addresses: ")
193-
response, err := resolveQuery(server, cname, dns.TypeAAAA)
220+
response, err := resolveQuery(server, cname, dns.TypeAAAA, false)
194221
if err != nil {
195222
break
196223
}
@@ -212,7 +239,7 @@ cname:
212239

213240
for once := true; once; once = false {
214241
fmt.Printf("Name servers : ")
215-
response, err := resolveQuery(server, cname, dns.TypeNS)
242+
response, err := resolveQuery(server, cname, dns.TypeNS, false)
216243
if err != nil {
217244
break
218245
}
@@ -242,7 +269,7 @@ cname:
242269

243270
for once := true; once; once = false {
244271
fmt.Printf("Mail servers : ")
245-
response, err := resolveQuery(server, cname, dns.TypeMX)
272+
response, err := resolveQuery(server, cname, dns.TypeMX, false)
246273
if err != nil {
247274
break
248275
}
@@ -266,7 +293,7 @@ cname:
266293

267294
for once := true; once; once = false {
268295
fmt.Printf("HTTPS alias : ")
269-
response, err := resolveQuery(server, cname, dns.TypeHTTPS)
296+
response, err := resolveQuery(server, cname, dns.TypeHTTPS, false)
270297
if err != nil {
271298
break
272299
}
@@ -312,7 +339,7 @@ cname:
312339

313340
for once := true; once; once = false {
314341
fmt.Printf("Host info : ")
315-
response, err := resolveQuery(server, cname, dns.TypeHINFO)
342+
response, err := resolveQuery(server, cname, dns.TypeHINFO, false)
316343
if err != nil {
317344
break
318345
}
@@ -332,7 +359,7 @@ cname:
332359

333360
for once := true; once; once = false {
334361
fmt.Printf("TXT records : ")
335-
response, err := resolveQuery(server, cname, dns.TypeTXT)
362+
response, err := resolveQuery(server, cname, dns.TypeTXT, false)
336363
if err != nil {
337364
break
338365
}

0 commit comments

Comments
 (0)