Browse Source
[Feature] ASN module; support matching ASN/country in multimap
[Feature] ASN module; support matching ASN/country in multimap
- Also removed stuff from ip_score - Updated testspull/856/head
5 changed files with 141 additions and 42 deletions
-
100src/plugins/lua/asn.lua
-
41src/plugins/lua/ip_score.lua
-
14src/plugins/lua/multimap.lua
-
18test/functional/cases/102_multimap.robot
-
10test/functional/configs/multimap.conf
@ -0,0 +1,100 @@ |
|||
--[[ |
|||
Copyright (c) 2011-2016, Vsevolod Stakhov <vsevolod@highsecure.ru> |
|||
Copyright (c) 2016, Andrew Lewis <nerf@judo.za.org> |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
]]-- |
|||
|
|||
local rspamd_logger = require "rspamd_logger" |
|||
local rspamd_regexp = require "rspamd_regexp" |
|||
|
|||
local options = { |
|||
provider_type = 'cymru', |
|||
provider_info = { |
|||
ip4 = 'origin.asn.cymru.com', |
|||
ip6 = 'origin6.asn.cymru.com', |
|||
}, |
|||
symbol = 'ASN', |
|||
} |
|||
|
|||
local cymru_re = rspamd_regexp.create_cached("[\\|\\s]") |
|||
|
|||
local function asn_check(task) |
|||
|
|||
local function asn_set(asn, ipnet, country) |
|||
local descr_t = {} |
|||
if asn then |
|||
task:get_mempool():set_variable("asn", asn) |
|||
table.insert(descr_t, "asn:" .. asn) |
|||
end |
|||
if ipnet then |
|||
task:get_mempool():set_variable("ipnet", ipnet) |
|||
table.insert(descr_t, "ipnet:" .. ipnet) |
|||
end |
|||
if country then |
|||
task:get_mempool():set_variable("country", country) |
|||
table.insert(descr_t, "country:" .. country) |
|||
end |
|||
if options['symbol'] then |
|||
task:insert_result(options['symbol'], 0.0, table.concat(descr_t, ', ')) |
|||
end |
|||
end |
|||
|
|||
local asn_check_func = {} |
|||
function asn_check_func.cymru(ip) |
|||
local function cymru_dns_cb(resolver, to_resolve, results, err, key) |
|||
if not (results and results[1]) then return end |
|||
local parts = cymru_re:split(results[1]) |
|||
-- "15169 | 8.8.8.0/24 | US | arin |" for 8.8.8.8 |
|||
asn_set(parts[1], parts[2], parts[3]) |
|||
end |
|||
local dnsbl = options['provider_info']['ip' .. ip:get_version()] |
|||
local req_name = rspamd_logger.slog("%1.%2", |
|||
table.concat(ip:inversed_str_octets(), '.'), dnsbl) |
|||
task:get_resolver():resolve_txt(task:get_session(), task:get_mempool(), |
|||
req_name, cymru_dns_cb) |
|||
end |
|||
|
|||
local ip = task:get_from_ip() |
|||
if not (ip and ip:is_valid()) then return end |
|||
asn_check_func[options['provider_type']](ip) |
|||
end |
|||
|
|||
-- Configuration options |
|||
local configure_asn_module = function() |
|||
local opts = rspamd_config:get_all_opt('asn') |
|||
if opts then |
|||
for k,v in pairs(opts) do |
|||
options[k] = v |
|||
end |
|||
end |
|||
if options['provider_type'] == 'cymru' then |
|||
if not options['provider_info'] and options['provider_info']['ip4'] and |
|||
options['provider_info']['ip6'] then |
|||
rspamd_logger.errx("Missing required provider_info for cymru") |
|||
return false |
|||
end |
|||
else |
|||
rspamd_logger.errx("Unknown provider_type: %s", options['provider_type']) |
|||
return false |
|||
end |
|||
return true |
|||
end |
|||
|
|||
if configure_asn_module() then |
|||
rspamd_config:register_symbol({ |
|||
name = 'ASN_CHECK', |
|||
type = 'prefilter', |
|||
callback = asn_check, |
|||
}) |
|||
end |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue