From 4878840bdd8fd827912ce46b1b89cf403a0c4693 Mon Sep 17 00:00:00 2001 From: FreddleSpl0it <75116288+FreddleSpl0it@users.noreply.github.com> Date: Tue, 10 Nov 2026 00:56:53 +0100 Subject: [PATCH] [Rspamd] Forwarding hosts: check them as prefilter and scan the mail completely --- data/conf/rspamd/local.d/multimap.conf | 6 --- data/conf/rspamd/lua/rspamd.local.lua | 55 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/data/conf/rspamd/local.d/multimap.conf b/data/conf/rspamd/local.d/multimap.conf index 888bf3630..fe53065ff 100644 --- a/data/conf/rspamd/local.d/multimap.conf +++ b/data/conf/rspamd/local.d/multimap.conf @@ -5,12 +5,6 @@ RCPT_MAILCOW_DOMAIN { symbols_set = ["RCPT_MAILCOW_DOMAIN"]; } -WHITELISTED_FWD_HOST { - type = "ip"; - map = "redis://WHITELISTED_FWD_HOST"; - symbols_set = ["WHITELISTED_FWD_HOST"]; -} - BULK_HEADER { type = "content"; map = "${LOCAL_CONFDIR}/custom/bulk_header.map"; diff --git a/data/conf/rspamd/lua/rspamd.local.lua b/data/conf/rspamd/lua/rspamd.local.lua index 5642fba2c..19bf07fb3 100644 --- a/data/conf/rspamd/lua/rspamd.local.lua +++ b/data/conf/rspamd/lua/rspamd.local.lua @@ -362,6 +362,61 @@ rspamd_config:register_symbol({ priority = 19 }) +rspamd_config:register_symbol({ + name = 'WHITELISTED_FWD_HOST', + type = 'prefilter', + score = 0.0, + callback = function(task) + local rspamd_logger = require "rspamd_logger" + local redis_params = rspamd_parse_redis_server('fwd_host') + local ip = task:get_from_ip() + + if ip == nil or not ip:is_valid() then + return false + end + + local from_ip_string = tostring(ip) + local ip_check_table = {'WHITELISTED_FWD_HOST', from_ip_string} + + local maxbits = 128 + local minbits = 7 + if ip:get_version() == 4 then + maxbits = 32 + minbits = 8 + end + for i=maxbits,minbits,-1 do + table.insert(ip_check_table, ip:apply_mask(i):to_string() .. "/" .. i) + end + + local function fwd_host_cb(err, data) + if err or type(data) ~= 'table' then + rspamd_logger.infox(rspamd_config, "fwd_host query request for ip %s returned invalid or empty data (\"%s\") or error (\"%s\")", ip, data, err) + return + end + for _,v in pairs(data) do + if type(v) == 'string' then + task:insert_result('WHITELISTED_FWD_HOST', 1.0, from_ip_string) + task:set_flag('pass_all') + return + end + end + end + + local redis_ret = rspamd_redis_make_request(task, + redis_params, -- connect params + 'WHITELISTED_FWD_HOST', -- hash key + false, -- is write + fwd_host_cb, --callback + 'HMGET', -- command + ip_check_table -- arguments + ) + if not redis_ret then + rspamd_logger.infox(rspamd_config, "cannot check fwd_host redis map") + end + end, + priority = 18 +}) + rspamd_config:register_symbol({ name = 'TLS_HEADER', type = 'postfilter',