]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add support for returning several IPs to spoof from Lua 5496/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 5 Jul 2017 15:49:42 +0000 (17:49 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 5 Jul 2017 15:49:42 +0000 (17:49 +0200)
pdns/README-dnsdist.md
pdns/dnsdist.cc
pdns/dnsdist.hh
regression-tests.dnsdist/test_Spoofing.py

index 237f4f0001091db23c8affdf460e8b43ac7fd833..19597947ce8e5d2b3b525e238a948692aedb130f 100644 (file)
@@ -591,7 +591,7 @@ Valid return values for `LuaAction` functions are:
  * DNSAction.Nxdomain: return a response with a NXDomain rcode
  * DNSAction.Pool: use the specified pool to forward this query
  * DNSAction.Refused: return a response with a Refused rcode
- * DNSAction.Spoof: spoof the response using the supplied IPv4 (A), IPv6 (AAAA) or string (CNAME) value
+ * DNSAction.Spoof: spoof the response using the supplied string (CNAME) value or a comma-separated list of IPv4 (A) or IPv6 (AAAA)
  * DNSAction.Truncate: return a response with TC=1
 
 The same feature exists to hand off some responses for Lua inspection, using `addLuaResponseAction(x, func)`.
index 9a365662c22e15a11834737846841980446ab718..d36512d922df75c488dd946ee74bb531507d3458 100644 (file)
@@ -809,16 +809,33 @@ catch(...)
   return 0;
 }
 
-void spoofResponseFromString(DNSQuestion& dq, const string& spoofContent)
+static void spoofResponseFromString(DNSQuestion& dq, const string& spoofContent)
 {
   string result;
-  try {
-    ComboAddress spoofAddr(spoofContent);
-    SpoofAction sa({spoofAddr});
-    sa(&dq, &result);
-  }
-  catch(PDNSException &e) {
-    SpoofAction sa(spoofContent); // CNAME then
+
+  std::vector<std::string> addrs;
+  stringtok(addrs, spoofContent, " ,");
+
+  if (addrs.size() == 1) {
+    try {
+      ComboAddress spoofAddr(spoofContent);
+      SpoofAction sa({spoofAddr});
+      sa(&dq, &result);
+    }
+    catch(const PDNSException &e) {
+      SpoofAction sa(spoofContent); // CNAME then
+      sa(&dq, &result);
+    }
+  } else {
+    std::vector<ComboAddress> cas;
+    for (const auto& addr : addrs) {
+      try {
+        cas.push_back(ComboAddress(addr));
+      }
+      catch (...) {
+      }
+    }
+    SpoofAction sa(cas);
     sa(&dq, &result);
   }
 }
index 1b05cb47b6669a098eafa0962ea541a8eab4973d..eaf9394bb7e4e8cb7795acc1aa2e8311c859b3d2 100644 (file)
@@ -715,7 +715,6 @@ std::shared_ptr<DownstreamState> wrandom(const NumberedServerVector& servers, co
 std::shared_ptr<DownstreamState> whashed(const NumberedServerVector& servers, const DNSQuestion* dq);
 std::shared_ptr<DownstreamState> roundrobin(const NumberedServerVector& servers, const DNSQuestion* dq);
 int getEDNSZ(const char* packet, unsigned int len);
-void spoofResponseFromString(DNSQuestion& dq, const string& spoofContent);
 uint16_t getEDNSOptionCode(const char * packet, size_t len);
 void dnsdistWebserverThread(int sock, const ComboAddress& local, const string& password, const string& apiKey, const boost::optional<std::map<std::string, std::string> >&);
 bool getMsgLen32(int fd, uint32_t* len);
index 7c271a069236dcd020f4e6caef98f4f65042366b..ad67dcae6db0a256c33271af052881dde3f93d20 100644 (file)
@@ -270,7 +270,7 @@ class TestSpoofingLuaSpoof(DNSDistTest):
     function spoof1rule(dq)
         if(dq.qtype==1) -- A
         then
-                return DNSAction.Spoof, "192.0.2.1"
+                return DNSAction.Spoof, "192.0.2.1,192.0.2.2"
         elseif(dq.qtype == 28) -- AAAA
         then
                 return DNSAction.Spoof, "2001:DB8::1"
@@ -302,7 +302,7 @@ class TestSpoofingLuaSpoof(DNSDistTest):
                                     60,
                                     dns.rdataclass.IN,
                                     dns.rdatatype.A,
-                                    '192.0.2.1')
+                                    '192.0.2.1', '192.0.2.2')
         expectedResponse.answer.append(rrset)
 
         (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)