comparison mod_dnsbl/mod_dnsbl.lua @ 6426:bf8f96ee2605

mod_dnsbl: Fix support for IPv6 lookups (thanks Zash)
author Matthew Wild <mwild1@gmail.com>
date Mon, 09 Mar 2026 17:03:11 +0000
parents 987f0ee7d395
children b82fceda0abc
comparison
equal deleted inserted replaced
6425:987f0ee7d395 6426:bf8f96ee2605
1 local lfs = require "lfs"; 1 local lfs = require "lfs";
2 2
3 local adns = require "net.adns"; 3 local adns = require "net.adns";
4 local it = require "util.iterators"; 4 local it = require "util.iterators";
5 local hex = require "util.hex";
5 local parse_cidr = require "util.ip".parse_cidr; 6 local parse_cidr = require "util.ip".parse_cidr;
6 local parse_ip = require "util.ip".new_ip; 7 local parse_ip = require "util.ip".new_ip;
7 local promise = require "util.promise"; 8 local promise = require "util.promise";
8 local set = require "util.set"; 9 local set = require "util.set";
9 local st = require "util.stanza"; 10 local st = require "util.stanza";
94 reload_file_dnsbls(); 95 reload_file_dnsbls();
95 96
96 local mod_flags = module:depends("flags"); 97 local mod_flags = module:depends("flags");
97 98
98 local function reverse(ip, suffix) 99 local function reverse(ip, suffix)
99 local a,b,c,d = ip:match("^(%d+).(%d+).(%d+).(%d+)$"); 100 if ip.proto == "IPv4" then
100 if not a then return end 101 local query_string = ip.packed:reverse();
101 return ("%d.%d.%d.%d.%s"):format(d,c,b,a, suffix); 102 return ("%d.%d.%d.%d.%s"):format(
103 query_string:byte(4, 4),
104 query_string:byte(3, 3),
105 query_string:byte(2, 2),
106 query_string:byte(1, 1),
107 suffix
108 );
109 elseif ip.proto == "IPv6" then
110 return hex.encode(ip.packed):reverse():gsub("%x", "%1.")..suffix;
111 end
102 end 112 end
103 113
104 function check_dnsbl(ip_address, dnsbl, callback, ud) 114 function check_dnsbl(ip_address, dnsbl, callback, ud)
105 if dnsbl:byte(1) == 64 then -- '@' 115 if dnsbl:byte(1) == 64 then -- '@'
106 local parsed_ip = parse_ip(ip_address); 116 local parsed_ip = parse_ip(ip_address);
114 else 124 else
115 if ip_address:sub(1,7):lower() == "::ffff:" then 125 if ip_address:sub(1,7):lower() == "::ffff:" then
116 ip_address = ip_address:sub(8); 126 ip_address = ip_address:sub(8);
117 end 127 end
118 128
119 local rbl_ip = reverse(ip_address, dnsbl); 129 local parsed_ip = parse_ip(ip_address);
120 if not rbl_ip then return; end 130
131 local rbl_ip = reverse(parsed_ip, dnsbl);
132 if not rbl_ip then
133 module:log("warn", "Unable to query dnsbls for invalid IP: %s", parsed_ip.proto);
134 return;
135 end
121 136
122 module:log("debug", "Sending DNSBL lookup for %s", ip_address); 137 module:log("debug", "Sending DNSBL lookup for %s", ip_address);
123 adns.lookup(function (reply) 138 adns.lookup(function (reply)
124 local hit = not not (reply and reply[1]); 139 local hit = not not (reply and reply[1]);
125 module:log("debug", "Received DNSBL result for %s: %s", ip_address, hit and "present" or "absent"); 140 module:log("debug", "Received DNSBL result for %s: %s", ip_address, hit and "present" or "absent");