From 1b726acf1ff86f44e198e91b9fc12f736f6562c9 Mon Sep 17 00:00:00 2001 From: bert hubert Date: Fri, 4 Sep 2015 13:30:44 +0200 Subject: [PATCH] hook up truncation for MaxQPSIPRule so we can group ipv6 by /64 etc --- pdns/dnsdist-lua.cc | 4 ++-- pdns/dnsdistconf.lua | 2 ++ pdns/dnsrulactions.hh | 9 ++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pdns/dnsdist-lua.cc b/pdns/dnsdist-lua.cc index 35c10982b8..85f911132f 100644 --- a/pdns/dnsdist-lua.cc +++ b/pdns/dnsdist-lua.cc @@ -355,8 +355,8 @@ vector> setupLua(bool client, const std::string& confi }); - g_lua.writeFunction("MaxQPSIPRule", [](unsigned int qps) { - return std::shared_ptr(new MaxQPSIPRule(qps)); + g_lua.writeFunction("MaxQPSIPRule", [](unsigned int qps, boost::optional ipv4trunc, boost::optional ipv6trunc) { + return std::shared_ptr(new MaxQPSIPRule(qps, ipv4trunc.get_value_or(32), ipv6trunc.get_value_or(64))); }); diff --git a/pdns/dnsdistconf.lua b/pdns/dnsdistconf.lua index cafe0a9d6f..4258c75cdd 100644 --- a/pdns/dnsdistconf.lua +++ b/pdns/dnsdistconf.lua @@ -36,6 +36,8 @@ function luarule(remote, qname, qtype, dh, len) end addLuaAction("192.168.1.0/24", luarule) +addAction(MaxQPSIPRule(5, 24, 64), DropAction()) + topRule() addDomainBlock("powerdns.org.") diff --git a/pdns/dnsrulactions.hh b/pdns/dnsrulactions.hh index f86397a8e9..2eb64e31c9 100644 --- a/pdns/dnsrulactions.hh +++ b/pdns/dnsrulactions.hh @@ -4,12 +4,15 @@ class MaxQPSIPRule : public DNSRule { public: - MaxQPSIPRule(unsigned int qps) : d_qps(qps) {} + MaxQPSIPRule(unsigned int qps, unsigned int ipv4trunc=32, unsigned int ipv6trunc=64) : + d_qps(qps), d_ipv4trunc(ipv4trunc), d_ipv6trunc(ipv6trunc) + {} bool matches(const ComboAddress& remote, const DNSName& qname, uint16_t qtype, dnsheader* dh, int len) const override { ComboAddress zeroport(remote); zeroport.sin4.sin_port=0; + zeroport.truncate(zeroport.sin4.sin_family == AF_INET ? d_ipv4trunc : d_ipv6trunc); auto iter = d_limits.find(zeroport); if(iter == d_limits.end()) { iter=d_limits.insert({zeroport,QPSLimiter(d_qps, d_qps)}).first; @@ -19,13 +22,13 @@ public: string toString() const override { - return "per IP match for QPS over " + std::to_string(d_qps); + return "IP (/"+std::to_string(d_ipv4trunc)+", /"+std::to_string(d_ipv6trunc)+") match for QPS over " + std::to_string(d_qps); } private: mutable std::map d_limits; - unsigned int d_qps; + unsigned int d_qps, d_ipv4trunc, d_ipv6trunc; }; -- 2.47.2