From 46314dcf720387f587c427d2437166e2ec57b1bd Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Tue, 29 Jun 2021 16:47:59 +0200 Subject: [PATCH] rec: Support more dnstap transport types (DoT) --- pdns/lwres.cc | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/pdns/lwres.cc b/pdns/lwres.cc index 3af1421dc3..ca578ce6a5 100644 --- a/pdns/lwres.cc +++ b/pdns/lwres.cc @@ -73,7 +73,7 @@ static bool isEnabledForQueries(const std::shared_ptr>>& fstreamLoggers, const struct timeval &queryTime, const ComboAddress& localip, const ComboAddress& ip, bool doTCP, boost::optional auth, const vector& packet) +static void logFstreamQuery(const std::shared_ptr>>& fstreamLoggers, const struct timeval &queryTime, const ComboAddress& localip, const ComboAddress& ip, DnstapMessage::ProtocolType protocol, boost::optional auth, const vector& packet) { if (fstreamLoggers == nullptr) return; @@ -81,7 +81,7 @@ static void logFstreamQuery(const std::shared_ptr(&*packet.begin()), packet.size(), &ts, nullptr, auth); + DnstapMessage message(str, DnstapMessage::MessageType::resolver_query, SyncRes::s_serverID, &localip, &ip, protocol, reinterpret_cast(&*packet.begin()), packet.size(), &ts, nullptr, auth); for (auto& logger : *fstreamLoggers) { logger->queueData(str); @@ -101,7 +101,7 @@ static bool isEnabledForResponses(const std::shared_ptr>>& fstreamLoggers, const ComboAddress&localip, const ComboAddress& ip, bool doTCP, boost::optional auth, const PacketBuffer& packet, const struct timeval& queryTime, const struct timeval& replyTime) +static void logFstreamResponse(const std::shared_ptr>>& fstreamLoggers, const ComboAddress&localip, const ComboAddress& ip, DnstapMessage::ProtocolType protocol, boost::optional auth, const PacketBuffer& packet, const struct timeval& queryTime, const struct timeval& replyTime) { if (fstreamLoggers == nullptr) return; @@ -110,7 +110,7 @@ static void logFstreamResponse(const std::shared_ptr(packet.data()), packet.size(), &ts1, &ts2, auth); + DnstapMessage message(str, DnstapMessage::MessageType::resolver_response, SyncRes::s_serverID, &localip, &ip, protocol, reinterpret_cast(packet.data()), packet.size(), &ts1, &ts2, auth); for (auto& logger : *fstreamLoggers) { logger->queueData(str); @@ -298,6 +298,7 @@ LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int ComboAddress localip; bool fstrmQEnabled = false; bool fstrmREnabled = false; + bool dnsOverTLS = false; #ifdef HAVE_FSTRM if (isEnabledForQueries(fstrmLoggers)) { fstrmQEnabled = true; @@ -331,7 +332,7 @@ LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int getsockname(queryfd, reinterpret_cast(&localip), &slen); } if (fstrmQEnabled) { - logFstreamQuery(fstrmLoggers, queryTime, localip, ip, doTCP, context ? context->d_auth : boost::none, vpacket); + logFstreamQuery(fstrmLoggers, queryTime, localip, ip, DnstapMessage::ProtocolType::DoUDP, context ? context->d_auth : boost::none, vpacket); } } #endif /* HAVE_FSTRM */ @@ -358,6 +359,9 @@ LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int if (tlsCtx == nullptr) { g_log << Logger::Error << "DoT to " << ip << " requested but not available" << endl; } + else { + dnsOverTLS = true; + } } auto handler = std::make_shared("", s.releaseHandle(), timeout, tlsCtx, now->tv_sec); // Returned state ignored @@ -377,9 +381,9 @@ LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int } #ifdef HAVE_FSTRM - if (fstrmQEnabled) { - logFstreamQuery(fstrmLoggers, queryTime, localip, ip, doTCP, context ? context->d_auth : boost::none, vpacket); - } + if (fstrmQEnabled) { + logFstreamQuery(fstrmLoggers, queryTime, localip, ip, !dnsOverTLS ? DnstapMessage::ProtocolType::DoTCP : DnstapMessage::ProtocolType::DoT, context ? context->d_auth : boost::none, vpacket); + } #endif /* HAVE_FSTRM */ ret = arecvtcp(packet, 2, handler, false); @@ -422,7 +426,11 @@ LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int #ifdef HAVE_FSTRM if (fstrmREnabled && (!*chained || doTCP)) { - logFstreamResponse(fstrmLoggers, localip, ip, doTCP, context ? context->d_auth : boost::none, buf, queryTime, *now); + DnstapMessage::ProtocolType protocol = doTCP ? DnstapMessage::ProtocolType::DoTCP : DnstapMessage::ProtocolType::DoUDP; + if (dnsOverTLS) { + protocol = DnstapMessage::ProtocolType::DoT; + } + logFstreamResponse(fstrmLoggers, localip, ip, protocol, context ? context->d_auth : boost::none, buf, queryTime, *now); } #endif /* HAVE_FSTRM */ -- 2.47.3