From 54f59a215b3b971bdd07b97b5dcc6c51565c67e0 Mon Sep 17 00:00:00 2001 From: Robert Lu Date: Sun, 9 Jul 2023 09:45:19 -0400 Subject: [PATCH] proxy dns with NOTIMP error --- proxy/dns/dns.go | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/proxy/dns/dns.go b/proxy/dns/dns.go index ef23d6f3f9..e01bc421d4 100644 --- a/proxy/dns/dns.go +++ b/proxy/dns/dns.go @@ -197,12 +197,13 @@ func (h *Handler) Process(ctx context.Context, link *transport.Link, d internet. if isIPQuery { if domain, err := strmatcher.ToDomain(domain); err == nil { go h.handleIPQuery(id, qType, domain, writer) - continue + } else { + h.handleDNSError(id, dnsmessage.RCodeFormatError, writer) } + } else { + h.handleDNSError(id, dnsmessage.RCodeNotImplemented, writer) } - } - - if err := connWriter.WriteMessage(b); err != nil { + } else if err := connWriter.WriteMessage(b); err != nil { return err } } @@ -296,6 +297,35 @@ func (h *Handler) handleIPQuery(id uint16, qType dnsmessage.Type, domain string, } } +func (h *Handler) handleDNSError(id uint16, rCode dnsmessage.RCode, writer dns_proto.MessageWriter) { + var err error + + b := buf.New() + rawBytes := b.Extend(buf.Size) + builder := dnsmessage.NewBuilder(rawBytes[:0], dnsmessage.Header{ + ID: id, + RCode: rCode, + RecursionAvailable: true, + RecursionDesired: true, + Response: true, + }) + builder.EnableCompression() + common.Must(builder.StartQuestions()) + common.Must(builder.StartAnswers()) + + msgBytes, err := builder.Finish() + if err != nil { + newError("pack message").Base(err).WriteToLog() + b.Release() + return + } + b.Resize(0, int32(len(msgBytes))) + + if err := writer.WriteMessage(b); err != nil { + newError("write IP answer").Base(err).WriteToLog() + } +} + type outboundConn struct { access sync.Mutex dialer func() (internet.Connection, error)