@@ -61,6 +61,12 @@ local config_schema = ts.shape{ | |||
strategy = 'hostname_map', | |||
symbol = ts.string:is_optional(), | |||
}, | |||
ts.shape{ | |||
ip_map = lua_maps.map_schema, | |||
priority = ts.number:is_optional(), | |||
strategy = 'ip_map', | |||
symbol = ts.string:is_optional(), | |||
}, | |||
} | |||
), | |||
} | |||
@@ -182,6 +188,42 @@ strategies.hostname_map = function(rule) | |||
end | |||
end | |||
strategies.ip_map = function(rule) | |||
local ip_map = lua_maps.map_add_from_ucl(rule.ip_map, 'radix', 'external relay IPs') | |||
if not ip_map then | |||
rspamd_logger.errx(rspamd_config, "couldn't add map %s; won't register symbol %s", | |||
rule.ip_map, rule.symbol) | |||
return | |||
end | |||
return function(task) | |||
local from_ip = task:get_from_ip() | |||
if not (from_ip and from_ip:is_valid()) then | |||
lua_util.debugm(N, task, 'sender\'s IP is missing') | |||
return | |||
end | |||
if not ip_map:get_key(from_ip) then | |||
lua_util.debugm(N, task, 'sender\'s ip (%s) is not a relay', from_ip) | |||
return | |||
end | |||
local rcvd_hdrs = task:get_received_headers() | |||
local num_rcvd = #rcvd_hdrs | |||
-- Try find sending IP in Received headers | |||
for i, rcvd in ipairs(rcvd_hdrs) do | |||
if rcvd.real_ip then | |||
local rcvd_ip = rcvd.real_ip | |||
if rcvd_ip:is_valid() and (not ip_map:get_key(rcvd_ip) or i == num_rcvd) then | |||
return set_from_rcvd(task, rcvd) | |||
end | |||
end | |||
end | |||
rspamd_logger.errx(task, 'found nothing useful in Received headers') | |||
end | |||
end | |||
strategies['local'] = function(rule) | |||
return function(task) | |||
local from_ip = task:get_from_ip() |
@@ -33,6 +33,13 @@ EXTERNAL RELAY HOSTNAME MAP | |||
Expect Symbol With Exact Options EXTERNAL_RELAY_TEST | |||
... IP=192.0.2.1 HOSTNAME=mail.example.org HELO=mail.example.org | |||
EXTERNAL RELAY IP MAP | |||
Scan File ${RSPAMD_TESTDIR}/messages/received7.eml | |||
... Settings={symbols_enabled [EXTERNAL_RELAY_TEST, EXTERNAL_RELAY_IP_MAP]} | |||
... IP=198.51.100.1 | |||
Expect Symbol With Exact Options EXTERNAL_RELAY_TEST | |||
... IP=4.31.198.44 HOSTNAME=foobar.example.org HELO=foobar.example.org | |||
EXTERNAL RELAY LOCAL | |||
Scan File ${RSPAMD_TESTDIR}/messages/ham.eml | |||
... Settings={symbols_enabled [EXTERNAL_RELAY_TEST, EXTERNAL_RELAY_LOCAL]} |
@@ -0,0 +1,2 @@ | |||
2001:db8::/32 | |||
198.51.100.0/24 |
@@ -50,6 +50,10 @@ external_relay { | |||
hostname_map = "{= env.TESTDIR =}/configs/maps/external_relay.hostname_map"; | |||
strategy = "hostname_map"; | |||
} | |||
EXTERNAL_RELAY_IP_MAP { | |||
ip_map = "{= env.TESTDIR =}/configs/maps/external_relay.ip_map"; | |||
strategy = "ip_map"; | |||
} | |||
EXTERNAL_RELAY_LOCAL { | |||
strategy = "local"; | |||
} |
@@ -0,0 +1,17 @@ | |||
Received: from localhost (localhost [2001:db8:114::514]) | |||
by ietfa.amsl.com (Postfix) with ESMTP id 00E7712024B | |||
for <cfrg@ietfa.amsl.com>; Tue, 7 May 2019 14:01:07 -0700 (PDT) | |||
Received: from mail.example.org ([198.51.100.233]) | |||
by lame.example.net (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) | |||
with ESMTP id k8UsBTUjeiTe for <cfrg@ietfa.amsl.com>; | |||
Tue, 7 May 2019 14:01:04 -0700 (PDT) | |||
Received: from foobar.example.org ([4.31.198.44]) | |||
by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) | |||
with ESMTP id k8UsBTUjeiTe for <cfrg@ietfa.amsl.com>; | |||
Tue, 7 May 2019 14:01:04 -0700 (PDT) | |||
Received: from mail.example.org ([198.51.100.2]) | |||
by foobar.example.org (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) | |||
with ESMTP id k8UsBTUjeiTe for <cfrg@ietfa.amsl.com>; | |||
Tue, 7 May 2019 14:01:04 -0700 (PDT) | |||
haha |