Спам не спрашивает разрешения: адрес почтового сервера находят за часы, и дальше по нему бьют волнами рекламных писем, подделок и вложений с сюрпризами. Ручные правила на такой поток не рассчитаны, а бинарная блокировка по одному признаку роняет и легитимную почту. Rspamd подходит к вопросу иначе: каждое письмо оценивается десятками независимых признаков, баллы складываются в вердикт, а фильтр учится на живой переписке. Ниже установка, интеграция с Postfix, обучение байесовского классификатора, пороги действий и ревизия результатов.
Модульная оценка письма и система баллов Rspamd
Ядро инструмента справедливо называют оценщиком. Письмо проходит через набор модулей: одни проверяют заголовки аутентификации, другие взвешивают содержание, третьи сверяют вложения с известными отпечатками, четвёртые смотрят на поведение отправителя. Каждый сработавший модуль добавляет или убирает баллы, и итоговая сумма решает судьбу письма. Промежуточных решений много, а не только пропустить или отбросить.
Оценка против жёсткой блокировки выигрывает объяснимостью. По каждому письму видно, какие символы сработали и сколько баллов дали, поэтому фраза "фильтр съел письмо" превращается в конкретный разбор с числами. Пороги действий настраиваются под свой трафик, и чувствительность поднимается или опускается без правки самих правил.
Службы у Rspamd разделены по портам: основной слушатель на 11333 принимает письма на проверку, контроллер на 11334 ведёт панель и историю, отдельный прокси на 11332 говорит с Postfix по протоколу milter. Рядом живёт Redis, в котором копятся статистика и обучение классификатора: без него байес работает хуже, поэтому ставят связкой. Актуальная ветка проекта уже четвёртая, и сборка 4.2 доступна из репозитория разработчиков.
По сути, фильтр работает как таможня с весами: не приказывает выбросить всё подозрительное, а назначает цену каждому признаку и решает по сумме. Именно поэтому он переживает смену спамерских мод и не роняет легитимную почту из-за одной случайной детали.
Про сами модули стоит знать состав заранее: проверки аутентификации SPF DKIM и DMARC, репутация отправителя по внутренним спискам, статистика по адресам, анализ ссылок и картинок, разбор заголовков на подделки, взвешивание содержания. Список настраивается: лишние модули отключаются, своим символам назначаются веса, и вся настройка живёт в нескольких файлах с говорящими названиями.
Установка Rspamd и подключение к Postfix через milter
Свежие сборки приходят из репозитория проекта: в дистрибутивах пакет тоже есть, но отстаёт от текущей ветки. Связка с Redis ставится одной строкой:
wget -qO- https://rspamd.com/rspamd.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/rspamd.gpg
echo "deb [signed-by=/usr/share/keyrings/rspamd.gpg] https://rspamd.com/apt-stable/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/rspamd.list
sudo apt-get update
sudo apt-get install -y rspamd redis-server
После установки служба стартует сама, и слушатели поднимаются на своих портах. Redis рядом обязателен: в нём хранятся счётчики статистики и накопленное обучение, и без него вся история решений живёт ровно до перезапуска.
Интеграция с Postfix делается двумя строками его конфигурации:
sudo postconf -e "smtpd_milters = inet:127.0.0.1:11332"
sudo postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
sudo systemctl reload postfix
Первая строка включает проверку писем, приходящих извне, вторая отправляет на фильтр и письма, созданные локально, например сайтами и скриптами. С этого момента каждое письмо проходит через фильтр, и в заголовках доставленной почты появляются служебные строки с оценкой и сработавшими символами.
Связка проверяется по журналу: Postfix честно пишет передачу письма фильтру и его решение. Если письма вдруг идут мимо фильтра, в девяти случаях из десяти виновата опечатка в адресе milter или забытая перезагрузка конфигурации.
Отдельная строка заботы про хранилище статистики: Redis слушает только локальную машину, и трогать это не нужно. Внутри него нет паролей от почты, но есть накопленное обучение, и его потеря откатывает фильтр на недели назад. Пара привычек бэкапа для Redis закрывает вопрос на годы.
Панель controller с паролем и просмотром решений фильтра
Панель живёт на порту 11334 и по умолчанию отвечает только с локальной машины. Прежде чем открывать её шире, ставится пароль: утилита rspamadm pw печатает хэш, который вписывается в конфиг контроллера:
rspamadm pw
Полученная строка отправляется в файл local.d внутри конфигурации Rspamd, и панель начинает пускать только по паролю. Хэш вместо открытого пароля принципиален: конфиги читаются глазами чаще, чем кажется, и пароль в открытую запись класть не стоит.
Внутри панели живёт вся история: каждое письмо с оценкой, картой символов и вердиктом. Отдельные графики показывают нагрузку, долю спама и скорость проверок. Письмо можно дообучить прямо из панели, пометив его как спам или наоборот, и кнопки эти незаменимы в первые недели эксплуатации.
Наружу панель открывать не стоит вовсе: доступ через ssh-туннель на локальный порт закрывает вопрос и паролем, и сетевой географией. Для первичной настройки в комплекте есть интерактивный мастер rspamadm configwizard: он задает вопросы про домены и объёмы и правит конфигурацию под ответы, что удобнее ручной правки незнакомых файлов.
Пара слов про историю проверок в панели: она хранит не только вердикты, но и полный разбор каждого письма, и по свежей волне спама именно оттуда берутся примеры для обучения. Удобный ритм выглядит так: утром просмотреть историю, пометить пару писем как спам, и к вечеру фильтр уже узнаёт новую кампанию.
Обучение байесовского классификатора спамом и чистой почтой
Байесовский модуль смотрит на письмо как на набор признаков и считает вероятность принадлежности к спаму. Сначала классификатор пуст и молчит, затем он набирается на примерах, и с ростом выборки его голос в общей оценке становится весомым. Обучение делается двумя командами:
rspamc learn_spam /var/spam-letters/letter1.eml
rspamc learn_ham /var/ham-letters/letter2.eml
Спамом обучают на письмах из мусорной папки, чистой почтой на живой переписке, в которой нет случайного мусора. Формат простой .eml, файлы скармливаются по одному или потоком, а прогресс виден в счётчиках статистики.
Объём имеет значение больше, чем рвение. Сотни писем на класс дают первое качество, пара тысяч делает классификатор уверенным, а дальше работает только регулярность. Принципиальна симметрия: перекос в сторону одного класса искажает вероятности, поэтому спам и чистую почту подкидывают примерно поровну.
Счётчики и состояние классификатора показывает rspamc stat: сколько писем изучено с каждой стороны, сколько памяти занято и как часто байес вообще срабатывает. Удобная привычка: после каждой сессии обучения смотреть свежую почту глазами и ловить явные промахи, потому что обученный на грязном корпусе фильтр вредит с удвоенной силой.
Отдельная тонкость про источник корпуса: чужие архивы спама помогают объёмом, но приучают фильтр к чужой почте. Своя мусорная папка и своя живая переписка дают классификатор с характером именно вашего домена, и расти он должен в первую очередь на них.
Автообучение и нечёткие хэши для повторяющихся угроз
Ручное обучение запускает механизм, но не кормит его постоянно. В конфигурации классификатора включается автообучение: письма с экстремальными оценками уходят в примеры без участия администратора, и фильтр подтягивается за сменой спамерских кампаний. Одна строчка в local.d делает фильтр живым:
autolearn = true;
Автообучение имеет характер: уверенный спам и уверенно чистая почта идут в корпус охотно, пограничные письма не трогаются. Пограничную зону фильтр оставляет человеку, и это правильно: именно там живут ложные срабатывания, которые портят репутацию любого антиспама.
Отдельный контур для повторяющихся угроз это нечёткие хэши. Одинаковые вложения и одинаковые письма гуляют по кампаниям с разными адресами отправителей, а хэш у них общий: после включения своего хранилища и модуля сравнения добавление отпечатка мгновенно накрывает все будущие копии:
rspamc fuzzy_add -w 12 letter.eml
Границы у всей автоматики честные: автообучение не отменяет разбор жалоб пользователей, а хэши не спасают от писем, у которых каждый раз новый файл. Осмысленная связка выглядит так: автоматика тянет рутину, человек разбирает спорные случаи, и оба опираются на карту символов из панели.
Про сроки стоит сказать честно: автообучение набирает качество неделями, а не утром после включения. Первые дни стоит помогать руками и подкидывать явные примеры, а через месяц система уже справляется с рутиной сама, и вмешательство остаётся только для пограничных случаев.
Пороги действий и карантин для спорных писем
Числа оценки превращаются в действия на порогах. Типовые значения выглядят так:
greylist = 4.0;
add_header = 6.0;
reject = 15.0;
До четырёх баллов письмо просто проходит. С четырёх включается серый список: отправителю вежливо отказывают и ждут повторной попытки, на которую способны нормальные серверы и не способны фермы. С шести письмо помечается служебным заголовком как подозрительное. С пятнадцати следует прямой отказ, и именно поэтому порог отказа держат высоким: случайное попадание легитимного письма за эту границу стоит дороже пропущенного спама.
Карантин в практической схеме держится на пометке заголовком. Правило на стороне Dovecot раскладывает помеченные письма в папку спама у пользователя, и у каждого есть свой карантин под присмотром: письмо можно прочитать, пометить как ошибку фильтра и научить ему систему.
Удалять на входе спорное не стоит вовсе. Ложное срабатывание по важному письму от клиента всплывает через неделю с эпитетами, а спам в отдельной папке просто не мешает жить. Пороги для того и настраиваются, чтобы зона неопределённости оставалась видимой, а не исчезала в мусорку молча.
Настройка порогов по своей почте начинается с наблюдения: неделя истории показывает, где живут легитимные письма и где спам. Если честные письма подходили к шести баллам, порог пометки поднимают; если спам ходит ниже четырёх, опускают серый список. Цифры без наблюдения это калибровка вслепую, и заканчивается она потерей писем.
Ручная проверка письма и наблюдение за фильтром в работе
Проверить конкретное письмо без ожидания доставки можно прямо из терминала:
cat letter.eml | rspamc
Команда отвечает оценкой, вердиктом и полным списком сработавших символов с их весами. Читается вывод как разбор: какой модуль дал сколько баллов и чего именно фильтр испугался. Для спокойной работы этого хватает, спорное письмо разбирается за минуту.
Быстрая проверка после установки выглядит так:
- rspamc ping отвечает живой службе фильтра;
- письмо из файла получает оценку и список сработавших символов;
- панель показывает проверку в истории с картой баллов;
- журнал Postfix фиксирует передачу каждого письма фильтру.
Дальше начинается эксплуатация. Раз в неделю стоит смотреть три вещи: долю спама в статистике, свежие ложные срабатывания и потребление памяти службой. Расход памяти у Rspamd скромный, но на маленьких серверах имеет потолок, и лишние модули отключаются по мере знакомства с картой символов.
Ещё один тихий вопрос это обновления: свежие сборки приносят новые правила и веса, и после перехода на новую версию стоит прогнать пару свежих писем глазами. Автоматическое обновление фильтра допустимо, но в спокойное окно, а не в час пик.
Выросший из установки фильтр незаметно меняет жизнь почтового сервера: спам уходит в папку, письма объясняют свои оценки, а администратор тратит минуты вместо часов. Байес учится, хэши узнают повторы, пороги охраняют сомнительную зону, и ровно эта связка делает почту местом, куда заходят по делу, а не тонут в мусоре. А начинается она с четырёх команд установки, одного пароля для панели и первой сотни писем для обучения: остальное фильтр сделает сам, если ему немного помочь.