s.bind(localip);
std::shared_ptr<TLSCtx> tlsCtx{nullptr};
- if (ip.getPort() == 853) {
+ if (SyncRes::s_dot_to_port_853 && ip.getPort() == 853) {
TLSContextParameters tlsParams;
tlsParams.d_provider = "openssl";
tlsParams.d_validateCertificates = false;
g_log<<Logger::Error<<t_id<<" ["<<MT->getTid()<<"/"<<MT->numProcesses()<<"] answer to "<<(dc->d_mdp.d_header.rd?"":"non-rd ")<<"question '"<<dc->d_mdp.d_qname<<"|"<<DNSRecordContent::NumberToType(dc->d_mdp.d_qtype);
g_log<<"': "<<ntohs(pw.getHeader()->ancount)<<" answers, "<<ntohs(pw.getHeader()->arcount)<<" additional, took "<<sr.d_outqueries<<" packets, "<<
sr.d_totUsec/1000.0<<" netw ms, "<< spentUsec/1000.0<<" tot ms, "<<
- sr.d_throttledqueries<<" throttled, "<<sr.d_timeouts<<" timeouts, "<<sr.d_tcpoutqueries<<" tcp connections, rcode="<< res;
+ sr.d_throttledqueries<<" throttled, "<<sr.d_timeouts<<" timeouts, "<<sr.d_tcpoutqueries<<"/"<<sr.d_dotoutqueries<<" tcp/dot connections, rcode="<< res;
if(!shouldNotValidate && sr.isDNSSECValidationRequested()) {
g_log<< ", dnssec="<<sr.getValidationState();
<<broadcastAccFunction<uint64_t>(pleaseGetEDNSStatusesSize)<<endl;
g_log<<Logger::Notice<<"stats: outpacket/query ratio "<<ratePercentage(SyncRes::s_outqueries, SyncRes::s_queries)<<"%";
g_log<<Logger::Notice<<", "<<ratePercentage(SyncRes::s_throttledqueries, SyncRes::s_outqueries+SyncRes::s_throttledqueries)<<"% throttled"<<endl;
- g_log<<Logger::Notice<<"stats: "<<SyncRes::s_tcpoutqueries<<" outgoing tcp connections, "<<
+ g_log<<Logger::Notice<<"stats: "<<SyncRes::s_tcpoutqueries<<"/"<<SyncRes::s_dotoutqueries << " outgoing tcp/dot connections, "<<
broadcastAccFunction<uint64_t>(pleaseGetConcurrentQueries)<<" queries running, "<<SyncRes::s_outgoingtimeouts<<" outgoing timeouts"<<endl;
uint64_t pcSize = broadcastAccFunction<uint64_t>(pleaseGetPacketCacheSize);
SyncRes::s_tcp_fast_open = ::arg().asNum("tcp-fast-open");
SyncRes::s_tcp_fast_open_connect = ::arg().mustDo("tcp-fast-open-connect");
+#ifdef HAVE_DNS_OVER_TLS
+ SyncRes::s_dot_to_port_853 = ::arg().mustDo("dot-to-port-853");
+#endif
+
if (SyncRes::s_tcp_fast_open_connect) {
checkFastOpenSysctl(true);
checkTFOconnect();
::arg().set("edns-padding-mode", "Whether to add EDNS padding to all responses ('always') or only to responses for queries containing the EDNS padding option ('padded-queries-only', the default). In both modes, padding will only be added to responses for queries coming from `edns-padding-from`_ sources")="padded-queries-only";
::arg().set("edns-padding-tag", "Packetcache tag associated to responses sent with EDNS padding, to prevent sending these to clients for which padding is not enabled.")="7830";
+ ::arg().set("dot-to-port-853", "Force DoT connection to target port 853 if DoT compiled in")="yes";
+
::arg().setCmd("help","Provide a helpful message");
::arg().setCmd("version","Print version string");
::arg().setCmd("config","Output blank configuration");
addGetStat("ignored-packets", &g_stats.ignoredCount);
addGetStat("empty-queries", &g_stats.emptyQueriesCount);
addGetStat("max-mthread-stack", &g_stats.maxMThreadStackUsage);
-
+
addGetStat("negcache-entries", getNegCacheSize);
addGetStat("throttle-entries", getThrottleSize);
addGetStat("outgoing6-timeouts", &SyncRes::s_outgoing6timeouts);
addGetStat("auth-zone-queries", &SyncRes::s_authzonequeries);
addGetStat("tcp-outqueries", &SyncRes::s_tcpoutqueries);
+ addGetStat("dot-outqueries", &SyncRes::s_dotoutqueries);
addGetStat("all-outqueries", &SyncRes::s_outqueries);
addGetStat("ipv6-outqueries", &g_stats.ipv6queries);
addGetStat("throttled-outqueries", &SyncRes::s_throttledqueries);
addGetStat("taskqueue-pushed", []() { return getTaskPushes(); });
addGetStat("taskqueue-expired", []() { return getTaskExpired(); });
addGetStat("taskqueue-size", []() { return getTaskSize(); });
-
+
/* make sure that the ECS stats are properly initialized */
SyncRes::clearECSStats();
for (size_t idx = 0; idx < SyncRes::s_ecsResponsesBySubnetSize4.size(); idx++) {
std::atomic<uint64_t> SyncRes::s_outgoing6timeouts;
std::atomic<uint64_t> SyncRes::s_outqueries;
std::atomic<uint64_t> SyncRes::s_tcpoutqueries;
+std::atomic<uint64_t> SyncRes::s_dotoutqueries;
std::atomic<uint64_t> SyncRes::s_throttledqueries;
std::atomic<uint64_t> SyncRes::s_dontqueries;
std::atomic<uint64_t> SyncRes::s_qnameminfallbacksuccess;
unsigned int SyncRes::s_refresh_ttlperc;
int SyncRes::s_tcp_fast_open;
bool SyncRes::s_tcp_fast_open_connect;
+bool SyncRes::s_dot_to_port_853;
#define LOG(x) if(d_lm == Log) { g_log <<Logger::Warning << x; } else if(d_lm == Store) { d_trace << x; }
}
-SyncRes::SyncRes(const struct timeval& now) : d_authzonequeries(0), d_outqueries(0), d_tcpoutqueries(0), d_throttledqueries(0), d_timeouts(0), d_unreachables(0),
+SyncRes::SyncRes(const struct timeval& now) : d_authzonequeries(0), d_outqueries(0), d_tcpoutqueries(0), d_dotoutqueries(0), d_throttledqueries(0), d_timeouts(0), d_unreachables(0),
d_totUsec(0), d_now(now),
d_cacheonly(false), d_doDNSSEC(false), d_doEDNS0(false), d_qNameMinimization(s_qnameminimization), d_lm(s_lm)
}
if(doTCP) {
- LOG(prefix<<qname<<": using TCP with "<< remoteIP.toStringWithPort() <<endl);
- s_tcpoutqueries++;
- d_tcpoutqueries++;
+ if (SyncRes::s_dot_to_port_853 && remoteIP.getPort() == 853) {
+ LOG(prefix<<qname<<": using DoT with "<< remoteIP.toStringWithPort() <<endl);
+ s_dotoutqueries++;
+ d_dotoutqueries++;
+ } else {
+ LOG(prefix<<qname<<": using TCP with "<< remoteIP.toStringWithPort() <<endl);
+ s_tcpoutqueries++;
+ d_tcpoutqueries++;
+ }
}
int preOutQueryRet = RCode::NoError;
bool truncated = false;
bool spoofed = false;
bool gotAnswer = false;
- bool forceTCP = remoteIP->getPort() == 853;
+ bool forceTCP = SyncRes::s_dot_to_port_853 && remoteIP->getPort() == 853;
if (!forceTCP) {
gotAnswer = doResolveAtThisIP(prefix, qname, qtype, lwr, ednsmask, auth, sendRDQuery, wasForwarded,
static std::atomic<uint64_t> s_authzonequeries;
static std::atomic<uint64_t> s_outqueries;
static std::atomic<uint64_t> s_tcpoutqueries;
+ static std::atomic<uint64_t> s_dotoutqueries;
static std::atomic<uint64_t> s_unreachables;
static std::atomic<uint64_t> s_ecsqueries;
static std::atomic<uint64_t> s_ecsresponses;
static unsigned int s_refresh_ttlperc;
static int s_tcp_fast_open;
static bool s_tcp_fast_open_connect;
-
+ static bool s_dot_to_port_853;
+
std::unordered_map<std::string,bool> d_discardedPolicies;
DNSFilterEngine::Policy d_appliedPolicy;
std::unordered_set<std::string> d_policyTags;
unsigned int d_authzonequeries;
unsigned int d_outqueries;
unsigned int d_tcpoutqueries;
+ unsigned int d_dotoutqueries;
unsigned int d_throttledqueries;
unsigned int d_timeouts;
unsigned int d_unreachables;