* `addQPSLimit({domain, domain}, n)`: limit queries within those domains (together) to n per second
* `addQPSLimit(netmask, n)`: limit queries within that netmask to n per second
* `addQPSLimit({netmask, netmask}, n)`: limit queries within those netmasks (together) to n per second
+ * Answer changing functions:
+ * `truncateTC(bool)`: if set (default) truncate TC=1 answers so they are actually empty. Fixes an issue for PowerDNS Authoritative Server 2.9.22.
* Advanced functions for writing your own policies and hooks
* ComboAddress related:
* `tostring()`: return in human-friendly format
g_outputBuffer=g_policy.getLocal()->name+"\n";
});
+ g_lua.writeFunction("truncateTC", [](bool tc) { g_truncateTC=tc; });
g_lua.registerMember("name", &ServerPolicy::name);
g_lua.registerMember("policy", &ServerPolicy::policy);
GlobalStateHolder<servers_t> g_dstates;
+bool g_truncateTC{1};
+void truncateTC(const char* packet, unsigned int* len)
+try
+{
+ unsigned int consumed;
+ DNSName qname(packet, *len, 12, false, 0, 0, &consumed);
+ *len=consumed+12+4;
+ struct dnsheader* dh =(struct dnsheader*)packet;
+ dh->ancount = dh->arcount = dh->nscount=0;
+}
+catch(...)
+{
+ g_stats.truncFail++;
+}
+
// listens on a dedicated socket, lobs answers from downstream servers to original requestors
void* responderThread(std::shared_ptr<DownstreamState> state)
{
else
--state->outstanding; // you'd think an attacker could game this, but we're using connected socket
+ if(dh->tc && g_truncateTC) {
+ truncateTC(packet, (unsigned int*)&len);
+ }
+
dh->id = ids->origID;
g_stats.responses++;
if(ids->origDest.sin4.sin_family == 0)
struct DNSDistStats
{
- using stat_t=std::atomic<uint64_t>;
+ using stat_t=std::atomic<uint64_t>; // aww yiss ;-)
stat_t responses{0};
stat_t servfailResponses{0};
stat_t queries{0};
stat_t selfAnswered{0};
stat_t downstreamTimeouts{0};
stat_t downstreamSendErrors{0};
+ stat_t truncFail{0};
double latency{0};
};
extern std::vector<ComboAddress> g_locals; // not changed at runtime
extern std::string g_key; // in theory needs locking
-
+extern bool g_truncateTC;
struct dnsheader;
void controlThread(int fd, ComboAddress local);
webserver("0.0.0.0:8083", "geheim2")
addLocal("0.0.0.0:5200")
setKey("MXNeLFWHUe4363BBKrY06cAsH8NWNb+Se2eXU5+Bb74=")
+truncateTC(true) -- fix up possibly badly truncated answers from pdns 2.9.22
warnlog(string.format("Script starting %s", "up!"))