function do_belongs(ip, mask) local status, result = pcall(function() return ip.belongs(mask) end) return status and result end ........ do_belongs(ctx.sender.ip, local_only)
Lua помощь
#81
Отправлено 11 Июнь 2022 - 01:28
#82
Отправлено 14 Июнь 2022 - 11:34
Причина в том, что belongs хочет адрес и маску одного типа. Либо оба v4, либо оба v6.Причина в IPv6 адресе ::1 ?
Спасибо, уже разобрался. Сделал примерно так:
if not ctx.to.all_match (mail_domains) and ctx.sender.family == "4" and ctx.sender.ip.belongs (local_only) and not ctx.sender.ip.belongs (local_exclude) then drweb.notice ("Host " .. ctx.sender.ip .. " is local-only mail sender") return {action = "reject", message = "Sending to non-local addresses from this host is prohibited. Please contact system administrator"} end
Просьба документировать этот момент для IpAddress. В современных ОС двойной стек IPv4/IPv6 - норма жизни, и что здесь в скрипте нужно разделять обработку IPv4 и IPv6 адресов, несколько неочевидно
ООО "СОЛВО"
#83
Отправлено 14 Июнь 2022 - 11:41
Еще вот такой фрагмент, может кому пригодится. Проверка на спам с учетом двух белых списков по адресам и сетям:
-- Белый список адресов-отправителей (нет реакции на спам, остальные проверки проводятся) local ip_lan = drweb.load_array ("/etc/drweb/white_ipv4.list") -- список ip-адресов/сетей, ipv4 local whitelist = drweb.load_array ("/etc/drweb/white_email.list") -- список E-Mail адресов (regex) function milter_hook(ctx) if not ( (ctx.sender.family == "6" and ctx.sender.ip == "::1") or (ctx.sender.family == "4" and ctx.sender.ip.belongs (ip_lan)) or ctx.sender.family == "L" or drweb_regex.match (whitelist, ctx.from, drweb_regex.ignore_case) ) then if ctx.message.spam.type == "spam" or.. ctx.message.spam.type == "phishing" or ctx.message.spam.type == "scam" then -- безусловный спам, выбрасываем ctx.modifier.change_header_field ("Subject", "[SPAM] " .. (ctx.message.subject or "")) return {action = "discard", message="Spam message rejected"} elseif ctx.message.spam.score >= 101 or. ctx.message.spam.type == "dce" then -- возможный спам, помечаем ctx.modifier.change_header_field ("Subject", "[Probable SPAM] " .. (ctx.message.subject or "")) end -- добавление заголовков проверки. ctx.modifier.add_header_field ("X-DrWeb-SpamScore", ctx.message.spam.score) ctx.modifier.add_header_field ("X-DrWeb-SpamState", ctx.message.spam.type) ctx.modifier.add_header_field ("X-DrWeb-SpamDetail", ctx.message.spam.reason) ctx.modifier.add_header_field ("X-DrWeb-SpamVersion", ctx.message.spam.version) end end
ООО "СОЛВО"
#84
Отправлено 14 Июнь 2022 - 18:11
Просьба документировать этот момент для IpAddress. В современных ОС двойной стек IPv4/IPv6 - норма жизни, и что здесь в скрипте нужно разделять обработку IPv4 и IPv6 адресов, несколько неочевидно
Пока мысли скорее поменять поведение, чтобы просто false возвращалось в таких случаях
Сообщение было изменено amorozov: 14 Июнь 2022 - 18:11
#85
Отправлено 12 Сентябрь 2022 - 13:13
Позволю себе поднять тему. Конструкция вида
if not ( (ctx.sender.family == "6" and ctx.sender.ip == "::1") or (ctx.sender.family == "4" and ctx.sender.ip.belongs (ip_lan)) or ctx.sender.family == "L" or drweb_regex.match (whitelist, ctx.from, drweb_regex.ignore_case) ) then -- обработка результатов проверки на спам ... end
почему-то иногда не срабатывает на локально сгенерированных письмах, т.е. когда отправитель localhost
Тест:
drweb.info ("family=" .. ctx.sender.family .. " ip=" .. ctx.sender.ip .. ' condition=' .. tostring(ctx.sender.family == "6" and ctx.sender .ip == "::1"))
В логе:
2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Accepted (TCP 127.0.0.1:52672) 2022-Sep-12 12:50:45 [1541788] Debug: Milter client 5618-ec7d-af4e: Message will be dumped to: "/tmp/com.drweb.maild/5618-ec7d-af4e-e679.e ml" 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/1/ 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/1/: clean 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/2/ 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /1/2/: clean 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /2/ 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Scan /2/: clean 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Lua: family=6 ip=::1 condition=false 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Spam check 2022-Sep-12 12:50:45 [1541788] Info: Milter client 5618-ec7d-af4e: Spam check: gained score of 300 2022-Sep-12 12:50:45 [1541788] Notice: Milter client 5618-ec7d-af4e: DISCARD message ID <77c00983-ebb3-3a45-f5ad-74b30862b087@solvo.ru> fr om адрес-отправителя@домен1 to адрес-получателя1@домен2, адрес-получателя2@домен2 (and 10 others) gained spam score of 300; scanned 3/3 parts (3 clean)
Два вопроса:
1) Почему ip-адрес smtp-отправителя из ipv4 127.0.0.1 стал ipv6 ::1?
2) Почему проверка ctx.sender.family == "6" and ctx.sender.ip == "::1" дает false?
ООО "СОЛВО"
#86
Отправлено 12 Сентябрь 2022 - 13:21
Первый вопрос (почему ip-адрес smtp-отправителя из ipv4 127.0.0.1 стал ipv6 ::1) снят - это коннект из мильтера к maild
ООО "СОЛВО"
#87
Отправлено 12 Сентябрь 2022 - 14:16
Такое ощущение, что не работает приведение типов при сравнении ip: ctx.sender.ip == "::1". Вроде как ctx.sender.ip при сравнении со строкой должно быть автоматически приведено к типу string...
2.2. Таблица IpAddress описывает IP-адрес. Содержит следующие поля:
Переопределенные метаметоды:
•__tostring — функция, преобразовывающая IpAddress в строку, например: "127.0.0.1" (IPv4) или "::1" (IPv6)
Или я не прав?
ООО "СОЛВО"
#89
Отправлено 12 Сентябрь 2022 - 19:54
tostring(ctx.sender.ip) == "::1"
Да, так работает, спасибо!
Сделал чуть по другому, чтобы избежать вызова __tostring на каждом письме:
local localhost6 = drweb.ip ("::1") local localhost4 = drweb.ip ("127.0.0.1") ... if not ( (ctx.sender.family == "6" and ctx.sender.ip == localhost6) or (ctx.sender.family == "4" and ctx.sender.ip == localhost4) or ctx.sender.family == "L" or ...
ООО "СОЛВО"
#90
Отправлено 11 Февраль 2023 - 15:50
Добрый день.
Подскажите пожалуйста как правильно заполнить конфигурацию drweb.ini, когда DrWeb для почтовых серверов подключен к Центру управления?
Если я вношу изменения через web в параметр MilterHook,
MilterHookWeb.png 87,69К 0 Скачано раз
то ничего не сохраняется, а если копирую оттуда lua-скрипт и вставляю в конфигурацию агента в Центре управления, то все перестает работать.
MilterHookAgent.png 128,74К 0 Скачано раз
#91
Отправлено 13 Февраль 2023 - 09:48
maximka777, добрый день.
Вы можете сохранить хук в файл и указать путь к файлу в параметре MilterHook настроек агента в центре управления.
К примеру:
[MailD]
MilterHook = /etc/opt/drweb.com/test.hook
Либо Вы можете установить вместо обычной двойной кавычки (в начале описания хука и в конце) одинарную в настройке MilterHook агента в центре управления. Так же, как у Вас на втором скриншоте, только использовать одинарные кавычки.
Однако в таком случае необходимо будет изменить кавычки в предпоследней строке: return {action = 'accept'} привести к виду return {action = "accept"}
Сообщение было изменено dmitrii.s: 13 Февраль 2023 - 09:55
#92
Отправлено 14 Февраль 2023 - 09:46
dmitrii.s, Спасибо огромное! Оба варианта работают отлично!
#93
Отправлено 31 Январь 2024 - 12:44
Добрый день.
Есть такой хук
MilterHook = ' local dw = require "drweb" local regex = require "drweb.regex" local whitelist = dw.load_array("/opt/drweb.com/lists/whitemails.txt") local blacklist = dw.load_array("/opt/drweb.com/lists/blackmails.txt") function milter_hook(ctx) -- Check if the message contains viruses, repack if so for threat, path in ctx.message.threats{category = {"known_virus", "virus_modification", "unknown_virus", "adware", "dialer"}} do ctx.modifier.repack() dw.notice(threat.name .. " found in " .. (ctx.message.part_at(path).name or path)) end -- Repack if unwanted URL has been found for url in ctx.message.urls{category = {"infection_source", "not_recommended", "owners_notice"}} do ctx.modifier.repack() dw.notice("URL found: " .. url .. "(" .. url.categories[1] .. ")") end -- Assign X-AntiVirus header local x_antivirus = ctx.gen.x_antivirus_header_field() if x_antivirus then ctx.modifier.add_header_field(x_antivirus.name, x_antivirus.value) end -- Stop checks if mail_from matchs one of the patterns loaded from file for _, pattern in ipairs(whitelist) do if regex.match(pattern, ctx.from, regex.ignore_case) then return {action = "accept"} end end -- Stop checks if mail_from matchs one of the patterns loaded from file for _, pattern in ipairs(blacklist) do if regex.match(pattern, ctx.from, regex.ignore_case) then return {action = "reject", code="541", message="Message rejected as BLACKLIST"} end end -- Изменить значение заголовка Subject, если сообщение -- набрало более 70 баллов оценки спама if ctx.message.spam.score > 70 then local old_value = ctx.message.header.value("Subject") or "" local new_value = "[SPAM] " .. old_value ctx.modifier.change_header_field("Subject", new_value) end -- Reject the message if it is likely spam if ctx.message.spam.score > 299 then dw.notice("Spam score: " .. ctx.message.spam.score) return {action = "reject", code="541", message="Message rejected as SPAM"} else -- Assign X-Drweb-Spam headers in accordance with spam report ctx.modifier.add_header_field("X-DrWeb-SpamScore", ctx.message.spam.score) ctx.modifier.add_header_field("X-DrWeb-SpamState", ctx.message.spam.type) ctx.modifier.add_header_field("X-DrWeb-SpamDetail", ctx.message.spam.reason) ctx.modifier.add_header_field("X-DrWeb-SpamVersion", ctx.message.spam.version) end -- Accept the message with all scheduled transformations applied return {action = "accept"} end '
Подскажите пожалуйста, можно ли в нем сделать так, чтобы для почтового ящика postmaster@mydomain.ru не производилась проверка на спам?
Ну то есть разрешить на этот ящик принимать спам?
#94
Отправлено 31 Январь 2024 - 16:18
Если предполагается, что получатель письма всегда один, попробуйте выше строки
-- Изменить значение заголовка Subject, если сообщение
добавить:
if ( #ctx.to == 1 and ctx.to[1] == 'postmaster@mydomain.ru' ) then return { action = "accept" } end
Если получателей больше одного, то код:
for _, rcpt in ipairs(ctx.to) do if rcpt == 'postmaster@mydomain.ru' then return { action = "accept" } end end
тоже пропустит письмо, но всем получателям.
При этом, письмо будет по-прежнему проверяться на вирусы и не придёт, если окажется в черном списке.
Если нужно пропустить его раньше, соответственно, это блоки надо поднять выше этих проверок.
Все сказанное выше придумано на основе лишь https://github.com/DoctorWebLtd/drweb-lua-examples/blob/master/maild/milter/api_example.lua и вашего примера, если что )
Сообщение было изменено Kirill Polubelov: 31 Январь 2024 - 16:20
#95
Отправлено 31 Январь 2024 - 17:22
Kirill Polubelov, спасибо огромное!!!
Сделал по первому способу, все работает, только пришлось адрес в двойные кавычки взять, иначе валились ошибки.
#96
Отправлено 31 Январь 2024 - 17:27
Да, потому что MilterHook = 'тельце хука'
#97
Отправлено 15 Февраль 2024 - 08:50
Скажите, пожалуйста, а не реализованы еще черные и белые списки непосредственно в веб-интерфейсе, чтобы не писать LUA-скрипт самому?
Используется Milter.
Сообщение было изменено Tuxzer92: 15 Февраль 2024 - 08:50
#98
Отправлено 15 Февраль 2024 - 12:13
В данный момент такой реализации нет
Читают тему: 0
0 пользователей, 0 гостей, 0 скрытых