В данной статье расскажу о повышении отказоустойчивости работы почты в случае проблем с антивирусом и антиспамом. Содержание будет разбито на 2 части: как использовать несколько экземпляров и как сделать by pass, если так случилось, что все экземпляры недоступны.
FailOver av_scanner
Согласно документации, мы можем использовать сколь-угодно экземпляров только для tcp socket, которые отделяются между собой разделителем (двоеточие). Можно так же использовать переменные (раскрываются до применения). Нельзя миксовать tcp socket и unix socket. Нельзя использовать несколько unix socket. Вот несколько примеров:
av_scanner = clamd:192.0.2.3 1234
av_scanner = clamd:192.0.2.3 1234:local
av_scanner = clamd:192.0.2.3 1234 retry=10s
av_scanner = clamd:192.0.2.3 1234 : 192.0.2.4 1234
av_scanner = clamd:/var/run/clamav/clamd
где retry означает, через сколько будет выполнена вторая (и только одна) попытка, local – означает, что exim передаст имя файла антивирусу, то есть, по сути, получается вместо tcp socket – unix socket. Зачем это надо – неясно ))
Если указано несколько экземпляров, каждый раз выбор происходит случайно для каждого отдельного письма. В случае неудачи ищется следующий сервер тоже случайно и до тех пор, пока не будут перебраны все. Если все недоступны в логе получим сообщение об ошибке.
FailOver spamd_address
Тут практически тоже самое, но есть отличия: можно миксовать tcp socket и unix socket. Так же можно указывать диапазон портов в tcp socket, который будет опрашиваться строго в указанном порядке. Всего можно указать до 32 экземпляров. Некоторые примеры:
spamd_address = 192.0.2.3 783 : 192.0.2.4 783
spamd_address = /var/run/spamd.sock : 10.1.5.2 783
spamd_address = 192.0.2.3 100-783 : 192.0.2.4 783
Доступны такие опции
pri=priority – выбор приоритета (выше – больше, по умолчанию – 1)
weight=value – смещение выбора в случае одинаковых приоритетов, так как сервера с одним и теми же приоритетами запрашиваются случайно (по умолчанию – 1)
time=start-end – использовать строго в этом диапазоне времени (например, только рабочее время 9-18)
retry=timespec – через сколько сделать вторую попытку
tmo=timespec – таймаут при попытке подключения
variant=rspamd – использовать протокол rspamd вместо протокола spamassassin
defer_ok
Если так случилось, что все av_scanner / spamd_address оказались недоступны (или вернули ошибки), письмо складывается в очередь с соответствующим сообщением в лог. Если для нас это не критично и нужно что бы письмо обязательно было доставлено адресату, можно использовать опцию defer_ok. Вот пример для malware проверки:
malware = * / defer_ok / tmo=10s
Где tmo – таймаут на подключение.
А вот пример для spamd:
deny spam = Debian-exim/defer_ok
message = This message was classified as SPAM