@@ -197,12 +197,13 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, d internet.
197197 if isIPQuery {
198198 if domain , err := strmatcher .ToDomain (domain ); err == nil {
199199 go h .handleIPQuery (id , qType , domain , writer )
200- continue
200+ } else {
201+ h .handleDNSError (id , dnsmessage .RCodeFormatError , writer )
201202 }
203+ } else {
204+ h .handleDNSError (id , dnsmessage .RCodeNotImplemented , writer )
202205 }
203- }
204-
205- if err := connWriter .WriteMessage (b ); err != nil {
206+ } else if err := connWriter .WriteMessage (b ); err != nil {
206207 return err
207208 }
208209 }
@@ -296,6 +297,35 @@ func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string,
296297 }
297298}
298299
300+ func (h * Handler ) handleDNSError (id uint16 , rCode dnsmessage.RCode , writer dns_proto.MessageWriter ) {
301+ var err error
302+
303+ b := buf .New ()
304+ rawBytes := b .Extend (buf .Size )
305+ builder := dnsmessage .NewBuilder (rawBytes [:0 ], dnsmessage.Header {
306+ ID : id ,
307+ RCode : rCode ,
308+ RecursionAvailable : true ,
309+ RecursionDesired : true ,
310+ Response : true ,
311+ })
312+ builder .EnableCompression ()
313+ common .Must (builder .StartQuestions ())
314+ common .Must (builder .StartAnswers ())
315+
316+ msgBytes , err := builder .Finish ()
317+ if err != nil {
318+ newError ("pack message" ).Base (err ).WriteToLog ()
319+ b .Release ()
320+ return
321+ }
322+ b .Resize (0 , int32 (len (msgBytes )))
323+
324+ if err := writer .WriteMessage (b ); err != nil {
325+ newError ("write IP answer" ).Base (err ).WriteToLog ()
326+ }
327+ }
328+
299329type outboundConn struct {
300330 access sync.Mutex
301331 dialer func () (internet.Connection , error )
0 commit comments