diff --git a/modules/block/block.lua b/modules/block/block.lua index 24167985b92e1e672b7e06a9a9ea3547418c1676..f83d5ca23580657121820a635b95ea24b43a0644 100644 --- a/modules/block/block.lua +++ b/modules/block/block.lua @@ -58,6 +58,25 @@ function block.suffix(action, zone_list) end end +-- @function Check for common suffix first, then suffix match (specialized version of suffix match) +function block.suffix_common(action, common_suffix, suffix_list) + return function(pkt, qry) + local qname = qry:qname() + -- Preliminary check + local zone = common_suffix + if qname:sub(-zone:len()) ~= zone then + return nil + end + -- String match + for _, zone in pairs(suffix_list) do + if qname:sub(-zone:len()) == zone then + return action, zone + end + end + return nil + end +end + -- @function Block QNAME pattern function block.pattern(action, pattern) return function(pkt, qry) @@ -111,7 +130,7 @@ block.layer = { } -- @var Default rules -block.rules = { block.suffix(block.DENY, block.private_zones) } +block.rules = { block.suffix_common(block.DENY, '.arpa.', block.private_zones) } -- @function Add rule to block list function block.add(block, rule)