@@ -14,7 +14,7 @@ import (
1414const myResolverHost string = "resolver.dnscrypt.info."
1515const 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