changeset 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 03e46a11eac6
files mod_dnsbl/mod_dnsbl.lua
diffstat 1 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mod_dnsbl/mod_dnsbl.lua	Mon Mar 09 17:02:46 2026 +0000
+++ b/mod_dnsbl/mod_dnsbl.lua	Mon Mar 09 17:03:11 2026 +0000
@@ -2,6 +2,7 @@
 
 local adns = require "net.adns";
 local it = require "util.iterators";
+local hex = require "util.hex";
 local parse_cidr = require "util.ip".parse_cidr;
 local parse_ip = require "util.ip".new_ip;
 local promise = require "util.promise";
@@ -96,9 +97,18 @@
 local mod_flags = module:depends("flags");
 
 local function reverse(ip, suffix)
-	local a,b,c,d = ip:match("^(%d+).(%d+).(%d+).(%d+)$");
-	if not a then return end
-	return ("%d.%d.%d.%d.%s"):format(d,c,b,a, suffix);
+	if ip.proto == "IPv4" then
+		local query_string = ip.packed:reverse();
+		return ("%d.%d.%d.%d.%s"):format(
+			query_string:byte(4, 4),
+			query_string:byte(3, 3),
+			query_string:byte(2, 2),
+			query_string:byte(1, 1),
+			suffix
+		);
+	elseif ip.proto == "IPv6" then
+		return hex.encode(ip.packed):reverse():gsub("%x", "%1.")..suffix;
+	end
 end
 
 function check_dnsbl(ip_address, dnsbl, callback, ud)
@@ -116,8 +126,13 @@
 			ip_address = ip_address:sub(8);
 		end
 
-		local rbl_ip = reverse(ip_address, dnsbl);
-		if not rbl_ip then return; end
+		local parsed_ip = parse_ip(ip_address);
+
+		local rbl_ip = reverse(parsed_ip, dnsbl);
+		if not rbl_ip then
+			module:log("warn", "Unable to query dnsbls for invalid IP: %s", parsed_ip.proto);
+			return;
+		end
 
 		module:log("debug", "Sending DNSBL lookup for %s", ip_address);
 		adns.lookup(function (reply)