* RE2Rule on query name (optional)
* Response code
* Packet requests DNSSEC processing
+ * Packet requests recursion
* Query received over UDP or TCP
* Opcode (OpcodeRule)
* Number of entries in a given section (RecordsCountRule)
* an AllRule
* an AndRule
+ * a DNSSECRule
* a MaxQPSIPRule
* a MaxQPSRule
* a NetmaskGroupRule
* a QNameWireLengthRule
* a QTypeRule
* a RCodeRule
+ * a RDRule
* a RegexRule
* a RE2Rule
* a RecordsCountRule
* `QNameWireLengthRule(min, max)`: matches if the qname's length on the wire is less than `min` or more than `max` bytes
* `QTypeRule(qtype)`: matches queries with the specified qtype
* `RCodeRule(rcode)`: matches queries or responses the specified rcode
+ * `RDRule()`: matches queries with the `RD` flag set
* `RegexRule(regex)`: matches the query name against the supplied regex
* `RecordsCountRule(section, minCount, maxCount)`: matches if there is at least `minCount` and at most `maxCount` records in the `section` section
* `RecordsTypeCountRule(section, type, minCount, maxCount)`: matches if there is at least `minCount` and at most `maxCount` records of type `type` in the `section` section
tests.powerdns.com.
powerdns.com.
com.""")
+
+class TestAdvancedRD(DNSDistTest):
+
+ _config_template = """
+ addAction(RDRule(), RCodeAction(dnsdist.REFUSED))
+ newServer{address="127.0.0.1:%s"}
+ """
+
+ def testAdvancedRDRefused(self):
+ """
+ Advanced: RD query is refused
+ """
+ name = 'rd.advanced.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ expectedResponse = dns.message.make_response(query)
+ expectedResponse.set_rcode(dns.rcode.REFUSED)
+
+ (_, receivedResponse) = self.sendUDPQuery(query, response=None, useQueue=False)
+ self.assertEquals(receivedResponse, expectedResponse)
+
+ (_, receivedResponse) = self.sendTCPQuery(query, response=None, useQueue=False)
+ self.assertEquals(receivedResponse, expectedResponse)
+
+ def testAdvancedNoRDAllowed(self):
+ """
+ Advanced: No-RD query is allowed
+ """
+ name = 'no-rd.advanced.tests.powerdns.com.'
+ query = dns.message.make_query(name, 'A', 'IN')
+ query.flags &= ~dns.flags.RD
+ response = dns.message.make_response(query)
+
+ (receivedQuery, receivedResponse) = self.sendUDPQuery(query, response)
+ receivedQuery.id = query.id
+ self.assertEquals(receivedQuery, query)
+ self.assertEquals(receivedResponse, response)
+
+ (receivedQuery, receivedResponse) = self.sendTCPQuery(query, response)
+ receivedQuery.id = query.id
+ self.assertEquals(receivedQuery, query)
+ self.assertEquals(receivedResponse, response)